Kode bersama mempunyai dua tanggung jawab: menyediakan perilaku yang dapat dipakai ulang dan menjaga agar perubahan tidak menyebar tanpa arah. Menaruh beberapa aplikasi dalam satu repository baru menyediakan tempat; batas penggunaannya masih perlu dirancang.
Bulan lalu, saya mulai menyusun workspace CodeUP dengan Nx dan menambahkan paket integrasi Directus. Dari susunan yang sedang saya kerjakan ini, saya ingin membahas cara membedakan tanggung jawab aplikasi, kontrak library, dan tugas yang perlu dijalankan sebelum sebuah paket diterbitkan.
Memisahkan aplikasi dari kemampuan bersama
Monorepo adalah repository yang memuat beberapa aplikasi dan library beserta tooling-nya (dokumentasi Nx 16.10). Manfaatnya mencakup penggunaan ulang kode dan perubahan lintasproject yang dapat dikerjakan bersama.
Saya menyarankan membedakan kode yang mengatur sebuah aplikasi dengan kemampuan yang memang dibutuhkan beberapa pemakai. Halaman dan alur tampilan biasanya memiliki konteks aplikasi. Integrasi yang mempunyai kontrak jelas dapat dipertimbangkan sebagai library.
Ini merupakan pertimbangan desain, bukan aturan bahwa setiap fungsi yang dipakai dua kali wajib dijadikan paket. Batas baru perlu membuat tanggung jawab lebih mudah dipahami.
Contoh susunan workspace saya
Workspace yang sedang saya susun mempunyai aplikasi
www, bio, dan auth, serta paket directus-sdk-api dan next-base. Untuk pengelolaan project, saya memakai Nx 16.10.0.Salah satu bagiannya adalah paket integrasi Directus. Entry point paket ini sekarang mengekspor modul resource, dengan pembacaan data yang mencakup pengaturan query, pemilihan field, normalisasi hasil, dan metadata pagination.
Fokus saya di sini adalah susunan pengembangannya: perilaku apa yang dimiliki paket dan bagaimana aplikasi dapat menggunakannya melalui batas yang jelas. Setiap aplikasi tetap perlu memilih kebutuhan integrasinya sendiri.
Peta tanggung jawab
Bagian | Batas yang perlu dinyatakan |
Aplikasi | Halaman, alur pengguna, dan penyusunan fitur sesuai kebutuhannya. |
Library API | Kontrak pemanggilan dan pengolahan data yang dipakai melalui entry point yang jelas. |
Konfigurasi project | Perintah, input, output, serta dependency tugas. |
Pemakai library | Penyesuaian perilaku dan pengujian ketika kontrak library berubah. |
Bagi saya, peta ini membantu memeriksa apakah sebuah library mempunyai tujuan yang cukup spesifik. Nama seperti “shared” belum menjelaskan perilaku apa yang dimiliki dan perubahan apa yang boleh dilakukan pemakainya.
Urutan tugas merupakan bagian dari desain
Pada
project.json paket Directus, target build memakai executor TypeScript dan menuliskan direktori output. Target publish memanggil script penerbitan serta memiliki dependency pada target build.Potongan bagian pentingnya:
{
"publish": {
"command": "node tools/scripts/publish.mjs directus-sdk-api {args.ver} {args.tag}",
"dependsOn": ["build"]
}
}Dokumentasi konfigurasi project Nx versi yang sama menjelaskan
dependsOn sebagai hubungan antartugas. Menyatakan hubungan ini membuat kebutuhan build terlihat di konfigurasi, bukan hanya diingat oleh orang yang menjalankan publish.Setelah urutannya dinyatakan, hasil tugasnya tetap perlu diperiksa. Jika build gagal, proses publish belum mempunyai artefak yang siap diterbitkan. Keberhasilan perintah dan isi paket yang dihasilkan sama-sama perlu diperhatikan.
Entry point membantu memperjelas kontrak
Di paket ini,
src/index.ts mengekspor modul resource. Dari entry point tersebut, pemakai dapat melihat bagian yang memang disediakan oleh library tanpa harus mengikuti seluruh struktur internalnya.Sebagai saran desain, hindari membuat aplikasi bergantung pada file internal yang tidak dimaksudkan sebagai kontrak. Ketika struktur internal diubah, hubungan semacam itu membuat pemakai ikut terikat pada detail implementasi. Dokumentasi Nx juga menekankan perlunya batas penggunaan kode dalam monorepo.
Library bersama tetap membutuhkan pemeriksaan pada pemakainya. Pengaturan build tidak menggantikan pengujian perilaku ketika bentuk data, penanganan error, atau kontrak pemanggilan berubah.
Menambah struktur ketika tanggung jawabnya jelas
Mulailah dengan memetakan pemakai dan perilaku yang benar-benar sama. Tentukan entry point, nyatakan tugas build beserta dependency-nya, lalu periksa dampak perubahan pada aplikasi yang menggunakan library tersebut.
Nx menyediakan alat untuk mengatur hubungan itu, tetapi batasnya tetap harus kita yang tentukan.
