











{"author":"Faiq Najib Al-Aziz","body":"\nPindahan di [episode pertama](/writing/2026/hijrah-frontend-01/) akhirnya selesai. Di hari serah terima, manifestnya cuma punya satu angka penting: **tujuh puluh enam kotak masuk, tujuh puluh enam kotak keluar. Tidak ada halaman yang tertinggal.**\n\nTidak ada yang tertinggal karena memang begitu keputusan kami. Ada yang sengaja dibawa, ada yang ikut tanpa diundang, dan ada satu rencana besar yang akhirnya batal. Saya ceritakan satu-satu ya.\n\n## Kenapa Nol Halaman Ditinggalkan\n\nKalau pernah pindah rumah, pasti tahu rasa lega waktu bilang, \"yang ini buang aja\". Migrasi _frontend_ punya godaan yang sama. Menghapus halaman rasanya seperti sekalian merapikan produk.\n\nMasalahnya, menentukan hidup-mati halaman saat pindahan itu artinya mengambil dua keputusan sekaligus: memindahkan aplikasi dan mengubah cakupan produk. [Seri sebelah](/writing/2026/hijrah-backend-04/) sudah mengajari saya mahalnya kombinasi itu. Jadi aturannya jelas: **tujuh puluh enam masuk, tujuh puluh enam keluar**, diperiksa halaman demi halaman, tanpa skrip untuk membuang.\n\nHasilnya memang tidak dramatis, tapi angkanya cocok: _repo_ baru berisi 76 halaman, sama dengan _repo_ lama, dan daftar foldernya cocok satu per satu. Halaman dengan nama yang bikin bertanya-tanya, seperti _demo_, _docs_, dan jalur khusus, ikut pindah juga. Bukan karena semuanya penting, tapi memutuskan untuk menghapusnya memang bukan bagian dari fase ini.\n\n## Isi Kotak yang Saya Buka Duluan\n\nKotak pertama yang saya buka isinya dua _library_ UI yang sudah lama hidup berdampingan. Di rumah baru, hitungannya kelihatan jelas: satu _library_ dipakai di **101 _file_**, sedangkan yang satunya tinggal bertahan di **13 _file_**.[^1]\n\nAngka itu menunjukkan dua era: satu _library_ dominan, satu lagi muncul belakangan, dan keduanya hidup di aplikasi yang sama tanpa perang terbuka. Dua-duanya kami bawa. Menghapus satu _library_ berarti mengubah semua _file_ yang memakainya, dan mengubah semua _file_ saat pindahan itu melanggar aturan [episode empat](/writing/2026/hijrah-backend-04/).\n\nAda juga sambungan _state management_ warisan. Di _app router_ yang baru, tinggal satu titik sambungan, tapi titik itu masih jadi jantung bagi halaman-halaman yang memakainya. Memotongnya sekarang berarti mengubah hal lain lagi, dan itu bukan kerjaan pindahan ini.\n\n## Yang Sadar Dibawa, yang Dicatat\n\nBeberapa warisan kecil juga saya catat waktu ikut naik:\n\n- **JSX tanpa tipe**: negeri ini memang belum bicara _TypeScript_. Bukan keputusan episode ini, cukup dicatat untuk keputusan lain di hari lain.[^2]\n- **Penamaan dua era**: sebagian berawalan huruf kapital, sebagian mengikuti selera yang beda. Tidak kami seragamkan saat pindah. Menyeragamkan itu kerjaan epilog, bukan koper.\n- **Satu `page.backup`**: satu halaman membawa jenazah _backup_-nya sendiri. Saya ketawa waktu nemu, soalnya [dia punya saudara](/writing/2026/hijrah-backend-04/) di gedung sebelah hahaha.\n\nBeda lho antara membawa sesuatu dengan sadar dan baru menemukannya setelah pindahan. Yang pertama punya catatan, alasan, dan giliran dibersihkan nanti. Yang kedua gampang luput, lalu ikut beranak-pinak.\n\n## Rencana Besar yang Tidak Jadi\n\nSeperti di seri sebelah, ada satu rencana yang perlu dicatat walau tidak jadi dijalankan: mengganti _state management_ warisan dengan yang baru.\n\nBatalnya bukan karena gagal. Prioritasnya bergeser ke kerjaan yang dampaknya lebih terasa buat _user_. Membatalkan sesuatu sebelum menghabiskan tenaga juga semacam _quality control_ untuk rencana sendiri. Ya... anggap saja begitu hehe.\n\n## Catatan Akhir\n\n1. **Pindahkan dulu 1:1, putuskan cakupan belakangan.** Menghapus halaman saat pindahan berarti dua keputusan sekaligus.\n2. **Hitung isi kotaknya.** Angka 76 ke 76 dan 101 ke 13 bikin obrolan soal warisan lebih konkret, tidak cuma soal selera.\n3. **Dua _library_ yang hidup berdampingan menandai dua era.** Masing-masing punya alasan kenapa masih ada di aplikasi.\n4. **Rencana yang dibatalkan sebelum menghabiskan biaya itu juga keputusan yang bagus.** Catat alasannya supaya jelas kapan perlu dibuka lagi.\n\nKotak berikutnya isinya bukan _library_, tapi tipe data yang tidak seragam. Satu _field_ yang sama bisa dikirim sebagai angka, _string_ kosong, atau _string_ biasa, tergantung halaman yang mengirimnya. Di situlah _type chaos_ mulai kelihatan.\n\n[^1]: Angka halaman, _file_, dan pemakaian _library_ dihitung langsung dari _repo_ saat episode ini ditulis, dengan pemisahan detail internal untuk bercerita.\n\n[^2]: Nama _library_, _framework_, dan struktur folder dipertahankan secukupnya; yang tidak perlu untuk cerita tidak disebut.\n","body_clean":"Pindahan di episode pertama akhirnya selesai. Di hari serah terima, manifestnya cuma punya satu angka penting: tujuh puluh enam kotak masuk, tujuh puluh enam kotak keluar. Tidak ada halaman yang tertinggal.\nTidak ada yang tertinggal karena memang begitu keputusan kami. Ada yang sengaja dibawa, ada yang ikut tanpa diundang, dan ada satu rencana besar yang akhirnya batal. Saya ceritakan satu-satu ya.\nKenapa Nol Halaman Ditinggalkan #Kalau pernah pindah rumah, pasti tahu rasa lega waktu bilang, \u0026ldquo;yang ini buang aja\u0026rdquo;. Migrasi frontend punya godaan yang sama. Menghapus halaman rasanya seperti sekalian merapikan produk.\nMasalahnya, menentukan hidup-mati halaman saat pindahan itu artinya mengambil dua keputusan sekaligus: memindahkan aplikasi dan mengubah cakupan produk. Seri sebelah sudah mengajari saya mahalnya kombinasi itu. Jadi aturannya jelas: tujuh puluh enam masuk, tujuh puluh enam keluar, diperiksa halaman demi halaman, tanpa skrip untuk membuang.\nHasilnya memang tidak dramatis, tapi angkanya cocok: repo baru berisi 76 halaman, sama dengan repo lama, dan daftar foldernya cocok satu per satu. Halaman dengan nama yang bikin bertanya-tanya, seperti demo, docs, dan jalur khusus, ikut pindah juga. Bukan karena semuanya penting, tapi memutuskan untuk menghapusnya memang bukan bagian dari fase ini.\nIsi Kotak yang Saya Buka Duluan #Kotak pertama yang saya buka isinya dua library UI yang sudah lama hidup berdampingan. Di rumah baru, hitungannya kelihatan jelas: satu library dipakai di 101 file, sedangkan yang satunya tinggal bertahan di 13 file.1\nAngka itu menunjukkan dua era: satu library dominan, satu lagi muncul belakangan, dan keduanya hidup di aplikasi yang sama tanpa perang terbuka. Dua-duanya kami bawa. Menghapus satu library berarti mengubah semua file yang memakainya, dan mengubah semua file saat pindahan itu melanggar aturan episode empat.\nAda juga sambungan state management warisan. Di app router yang baru, tinggal satu titik sambungan, tapi titik itu masih jadi jantung bagi halaman-halaman yang memakainya. Memotongnya sekarang berarti mengubah hal lain lagi, dan itu bukan kerjaan pindahan ini.\nYang Sadar Dibawa, yang Dicatat #Beberapa warisan kecil juga saya catat waktu ikut naik:\nJSX tanpa tipe: negeri ini memang belum bicara TypeScript. Bukan keputusan episode ini, cukup dicatat untuk keputusan lain di hari lain.2 Penamaan dua era: sebagian berawalan huruf kapital, sebagian mengikuti selera yang beda. Tidak kami seragamkan saat pindah. Menyeragamkan itu kerjaan epilog, bukan koper. Satu page.backup: satu halaman membawa jenazah backup-nya sendiri. Saya ketawa waktu nemu, soalnya dia punya saudara di gedung sebelah hahaha. Beda lho antara membawa sesuatu dengan sadar dan baru menemukannya setelah pindahan. Yang pertama punya catatan, alasan, dan giliran dibersihkan nanti. Yang kedua gampang luput, lalu ikut beranak-pinak.\nRencana Besar yang Tidak Jadi #Seperti di seri sebelah, ada satu rencana yang perlu dicatat walau tidak jadi dijalankan: mengganti state management warisan dengan yang baru.\nBatalnya bukan karena gagal. Prioritasnya bergeser ke kerjaan yang dampaknya lebih terasa buat user. Membatalkan sesuatu sebelum menghabiskan tenaga juga semacam quality control untuk rencana sendiri. Ya\u0026hellip; anggap saja begitu hehe.\nCatatan Akhir # Pindahkan dulu 1:1, putuskan cakupan belakangan. Menghapus halaman saat pindahan berarti dua keputusan sekaligus. Hitung isi kotaknya. Angka 76 ke 76 dan 101 ke 13 bikin obrolan soal warisan lebih konkret, tidak cuma soal selera. Dua library yang hidup berdampingan menandai dua era. Masing-masing punya alasan kenapa masih ada di aplikasi. Rencana yang dibatalkan sebelum menghabiskan biaya itu juga keputusan yang bagus. Catat alasannya supaya jelas kapan perlu dibuka lagi. Kotak berikutnya isinya bukan library, tapi tipe data yang tidak seragam. Satu field yang sama bisa dikirim sebagai angka, string kosong, atau string biasa, tergantung halaman yang mengirimnya. Di situlah type chaos mulai kelihatan.\nAngka halaman, file, dan pemakaian library dihitung langsung dari repo saat episode ini ditulis, dengan pemisahan detail internal untuk bercerita.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nNama library, framework, dan struktur folder dipertahankan secukupnya; yang tidak perlu untuk cerita tidak disebut.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","canonical":"https://najib.id/writing/2026/hijrah-frontend-02/","description":"Ep 2 seri Hijrah Frontend: 76 halaman masuk, 76 halaman keluar. Kenapa tidak ada yang ditinggal, apa isi kotak yang saya buka duluan, dan satu rencana besar yang akhirnya batal.","language":"id","lastmod":"2026-10-29T09:31:17Z","publishedAt":"2026-09-23T09:00:02Z","readingTime":3,"section":"writing","series":"Hijrah Frontend","tags":["frontend","nextjs","migrasi","cerita"],"title":"Hijrah Frontend (2): Port Tipis dan Warisan yang Ikut Naik","type":"writing","url":"https://najib.id/writing/2026/hijrah-frontend-02/","wordCount":617}
