Table of contents
- Disclaimer
- Introduction
- Mengapa Kita Butuh Standarisasi untuk Source Code kita?
- Bagaimana Cara Standarisasi Source Code Project Kita?
- Closing
Disclaimer
Di artikel ini, says akan fokus untuk melakukan standarisasi pada project Next.js (Typescript). Teman-teman pembaca bisa menyesuaikan dengan source code project masing-masing atau berdasarkan kebutuhan ya.
Introduction
Berdasarkan pengalaman saya di dunia programming, Javascript (dan Typescript) adalah bahasa pemrograman yang paling “liar” yang pernah saya pelajari. Saya dengan mudahnya bisa menggunakan code convention versi mana saja sesuka hati saya setiap kali membuat project menggunakan Javascript ini.
Ketika saya membuat personal project, sepertinya tidak menjadi masalah besar karena saya koding hanya untuk diri sendiri dan hanya saya saja yang mengerti kodingan sendiri, hahaha. Tetapi bayangkan kalau harus bekerja dalam tim yang terdiri dari bebrapa orang dan tiap orang juga berpikiran sama bahwa mereka punya code style masing-masing dan koding seenaknya? BOOOM, hancur sudah isi kodingannya.
Nah ini adalah salah satu contoh alasan kenapa kita butuh standarisasi untuk source code kita sebagai programmer. Ini sebenarnya adalah masalah umum yang dialami banyak programmer di luar sana, apalagi dalam tim. Tapi setidaknya ini juga bisa jadi pengingat bagi kita semua ya untuk tetap membuat kodingan yang rapi dan enak dibaca baik untuk diri sendiri atau orang lain
Mengapa Kita Butuh Standarisasi untuk Source Code kita?
Nah sebelum lebih jauh, seperti biasa kita harus mulai dengan “why”. Kenapa sih sampai harus pakai standarisasi segala?
Setiap Anggota Tim Punya “Code Style” Mereka Masing-Masing
Nah seperti yang saya sebutkan di bagian pendahuluan, ketika saya membuat personal project, mungkin tidak terlalu menjadi masalah besar apabila tidak ada standarisasi yang jelas karena hanya saya sendiri yang membuatnya.
Berbeda jika saat bekerja dalam tim, apalagi sekarang ketika saya bekerja sebagai full-time frontend engineer. Setiap orang punya gaya kodingannya sendiri. Tentu ini bisa membuat bingung sendiri ketika mendapat suatu task lalu harus membaca kodingan milik anggota tim lain dan memahaminya terlebih dahulu.
Tidak hanya saya ternyata, ketika orang lain membaca kodingan saya pun sering mereka merasa bingung karena gaya kodingannya berbeda. Inilah mengapa perlu dibuat semacam code convention, supaya kode yang dibuat tetap konsisten walaupun dalam sebuah tim yang orangnya ada banyak.
Meningkatkan Maintainability dan Readability
Saya pernah bekerja di sebuah software house yang sistem kerjanya berbasiskan project. Tugas engineer bisa dibilang selesai ketika project telah di-deliver kepada client.
Saya saat itu masih sebagai junior frontend engineer dan tentunya sebagai fresh graduate juga saya seringkali membuat kodingan “bar bar”, hahaha. Dalam pikiran saya saat itu, saya hanya perlu menyelesaikan request dari user dan deliver ketika semuanya selesai. Sungguh pengalaman tidak terlupakan.
Semua berubah ketika saya pindah ke sebuah perusahaan yang tergolong sebagai in house company. Yang mana mereka memiliki produk tersendiri yang dikembangkan dalam perusahaan tersebut.
Yang tadinya hanya fokus untuk koding lalu “lempar”, sekarang tidak bisa seperti itu, hahaha. Saya juga harus memikirkan kodingan saya tetap bisa ter-maintain dengan baik dan juga harus readable sehingga memudahkan apabila perlu improvement di masa mendatang.
Caranya sebenarnya cukup simpel, hanya buat dan ikuti code convention yang telah disepakati sehingga kodingannya bisa tetap konsisten walaupun dibuat oleh beberapa orang dalam tim. Kode yang konsisten membuatnya mudah dibaca, nah kalau mudah dibaca dan dimengerti, tentunya akan mudah untuk maintenance.
Tidak Hanya Kodingan, Commit Message juga Perlu Standarisasi
Jika bekerja dalam tim, sangat penting untuk membuat commit message yang mudah dipahami oleh anggota tim lain sebelum push ke Git repository. **Kodingan yang rapi tentunya akan terlihat sia-sia kalau commit message-nya berantakan. ****Ketika terjadi issue dan harus dilakukan tracking, akan kebingungan sendiri karena commit-messange nya berantakan.
Syukurlah sekarang ada Conventional Commit yang bisa membantu developer untuk membuat commit message yang mudah dibaca.
Bagaimana Cara Standarisasi Source Code Project Kita?
Di sini saya akan bahas dari perspektif frontend engineer ya. Dalam hal ini adalah Next.js. Di dunia pemrograman Javascript, ada beberapa tools yang bisa dimanfaatkan untuk membantu kita melakukan standarisasi kodingan.
- Prettier (Code Formatter)
- ESLint (Linter for JS-based project)
- Next Lint (built-in linter for Next.js)
- Husky (automated linter trigger)
- Lint Staged (run linter before commit)
- Commit Lint (check the commit message before committing)
Hanya untuk memberikan contoh, saya telah menyiapkan sample project Next.js sederhana (Typescript) yang bisa diakses di next-tailwind-polos. Kalian bisa melakukan konfigurasi dan standarisasi kodingan menggunakan contoh project ini. Silahkan di-clone dan jangan lupa untuk install dependencies dengan
yarn
ataunpm install
.
Ini yang akan kita lakukan berikutnya.
- Configure Prettier
- Configure base ESLint rules
- Install & configure the base husky setting (Reference: Husky setting Yehez-Tailwind-Starter)
- Install & configure lint-staged and commitlint
Di langkah berikutnya saya akan menggunakan
yarn
, teman-teman pembaca bisa menyesuaikan apabila menggunakannpm
. Untuk lebih lengkapnya, silahkan lihat dokumentasi resmi untuk penggunaan tools terkait ya
Konfigurasi Prettier
Nah saya asumsikan kalian sudah clone contoh project yang saya berikan di bagian sebelumnya ya, sehingga di sini sudah mulai fokus untuk penggunaan tools terkait.
Pastikan kalian sudah membuka folder projectnya baik dari VS Code atau terminal kalian, lalu jalankan yarn add --dev --exact prettier
. Lalu, buat file dengan nama .prettierrc.json
di root folder, atau bisa juga tinggal jalankan echo {}> .prettier.json
di terminal kalian.
Nah di dalam .prettierrc.json
, kalian bisa isi dengan konfigurasi seperti di bawah ini, atau kalian bisa modifikasi sesuai keinginan dan preferensi kalian. (referensi: Prettier Config Options).
{ "endOfLine": "lf", "semi": true, "singleQuote": false, "tabWidth": 2, "trailingComma": "es5" }
json
Nah, sekarang kalian hanya perlu jalankan yarn prettier --write [directory scope]
untuk melakukan format pada kodingan kalian. Atau jika kalian menggunakan VS Code, kelian bisa set Format on Save di VS Code Settings kalian, tapi pastikan kalian sudah menginstall ekstensi Prettier ini di text editor kalian. Selain itu, bisa juga menggunakan shortcut Shift + Option + F
(di macbook) atau Shift + CTRL + F
(di windows) untuk memformat file kodingan secara manual.
Konfigurasi Base ESLint Rules
Karena kita menggunakan Next.js, kita akan memakai ESLint for Next.js. Beruntung di Next.js terbaru, ESLint secara default telah terinstall secara default di dalam project ini sejak project diinisiasi. Jadi dalam case ini, kita bisa fokus ke file eslintrc.json
yang ada di root folder.
Tapi pastikan juga bahwa lint
command sudah ada di dalam file package.json
.
"scripts": { "dev": "next dev", "build": "next build", "start": "next start", "lint": "next lint" } ...
json
Kurang lebih, ini isi konfigurasi ESLint milik saya di file eslintrc.json
. Kamu tidak perlu tiru 100% ya. Kembali lagi ke kebutuhan masing-masing.
{ "env": { "node": true }, "extends": [ "next/core-web-vitals", "eslint:recommended", "plugin:@typescript-eslint/recommended" ], "parser": "@typescript-eslint/parser", "plugins": ["import", "unused-imports", "@typescript-eslint"], "settings": { "import/resolver": { "node": { "extensions": [".js", ".jsx", ".ts", ".tsx"], "moduleDirectory": ["node_modules", "src/"] } } }, "rules": { "no-unused-vars": "off", "@typescript-eslint/no-unused-vars": "off", "@typescript-eslint/explicit-module-boundary-types": "off", "@typescript-eslint/no-non-null-assertion": "off", "@typescript-eslint/no-inferrable-types": "off", "@next/next/no-img-element": "off", "unused-imports/no-unused-imports": "error", "unused-imports/no-unused-vars": [ "warn", { "vars": "all", "varsIgnorePattern": "^_", "args": "after-used", "argsIgnorePattern": "^_" } ], "no-eq-null": "warn", "import/order": [ "warn", { "groups": [ ["builtin", "external"], "internal", "parent", ["sibling", "index"], "object" ], "newlines-between": "always", "alphabetize": { "order": "asc", "caseInsensitive": true } } ], "complexity": "warn", "no-console": ["error"] } }
json
Di sini, saya menggunakan third-party ESLint plugin seperti import, unused-import, dan typescript-eslint.
Setelah proses konfigurasi di sini selesai, kamu bisa jalankan yarn lint
untuk mengecek apakah kodingan-mu sudah sesuai dengan rules yang ada atau belum. Kamu juga bisa jalankan yarn lint --fix
yang otomatis melakukan fixing di kodinganmu berdasarkan rules yang telah ditentukan. Perlu diingat, bahwa terkadang kita harus melakukan fixing manual terhadap kodingan kita, jangan terlalu mengandalkan fixing otomatis dari fitur ini ya.
Konfigurasi Husky
Ingin menambahkan otomatisasi? Dalam hal ini saya biasa menggunakan Husky untuk secara otomatis mengecek kodingan atau commit message sebelum commit atau push ke Git Repository.
Karena kita menggunakan yarn, kita akan install dengan menjalankan npx husky-init && yarn
di terminal. Itu akan secara otomatis men-generate prepare
command di dalam package.json
dan base pre-commit config.
Setelah itu, kita akan menginstall https://github.com/okonet/lint-staged untuk men-trigger dan menjalankan linter di tahap git staged files dengan mengeksekusi npx mrm@2 lint-staged
. Itu akan otomatis men-generate base command untuk men-trigger pre-commit
husky config file. Lalu, kamu bisa hapus atau sesuaikan kembali isi kontennya sesuai preferensimu. Setelahnya, ketika melakukan commit ke Git repository, otomatis akan menjalankan pengecekan linter. Jadi, pastikan kodinganmu sudah sesuai dengan rules dalam linternya ya.
Seperti yang telah saya sebutkan sebelumnya, tidak hanya kodingan, kita pun perlu standarisasi commit message sebelum melakukan push ke Git Repository. Di sini kita akan memakai Commit Lint dengan menjalankan yarn add --dev @commitlint/config-conventional @commitlint/cli
di terminal.
Perlu diingat juga kita perlu membuat file konfigurasi commitlint ini dengan menjalankan perintah seperti di bawah ini di terminal.
echo "module.exports = { extends: ['@commitlint/config-conventional'] };" > commitlint.config.js
bash
Nah setelah itu, kita bisa integrasikan dengan husky dengan menjalankan yarn husky add .husky/commit-msg 'yarn commitlint --edit $1'
. Itu akan secara otomatis men-generate file konfigurasi husky yang bernama commit-msg
.
Nah sekarang kamu tidak bisa lagi membuat commit message yang “bar bar” hahaha. Saran saya, gunakan ekstensi VS Code Conventional Commit.
Ingin menambahkan pengecekan otomatis lagi sebelum push ke Git Repository? Bisa, di sini contohnya saya bisa jalankan npx husky add .husky/pre-push 'yarn lint'
untuk men-generate file husky config baru yang men-trigger pengecekan linter sebelum push ke Git Repository.
Nah selesai deh. Perlu diingat lagi, kamu tidak perlu meniru 100% metode yang telah saya beritahukan di sini. Kamu bisa juga menyesuaikan kembali konfigurasinya sesuai dengan kebutuhanmu
Closing
Sebenarnya cara ini bukan cara satu-satunya ya. Masih banyak metode atau tools lain yang tidak kalah efektif sebenarnya yang juga bisa membantu kita melakukan standarisasi source code kita. Semoga ini bisa membantu teman-teman ya. Silahkan diskusikan ini di kolom komentar ya.