Entropi front-end adalah benar. Kod sumber tidak runtuh dalam semalam. Ia terkumpul. Pada satu hari Selasa, anda menambah perpustakaan format tarikh. Enam bulan kemudian, seseorang menambah satu lagi kerana mereka tidak menjumpai yang pertama. Polyfill bertimbun untuk pelayar yang tidak lagi anda sokong. Alatan binaan berlapis-lapis. Akhirnya, folder node_modules menjadi laci sampah digital di mana tiada apa yang boleh dibuang tanpa rasa takut. Anda berhenti mengemas kini. Kemudian anda berhenti melihat. Itulah masanya setiap perubahan kecil menjadi satu perjudian.

Saya menghadapi tembok ini semasa cuba menaik taraf Material UI dalam projek lama. Saya membuka package.json dan hampir tidak mengenali separuh daripada entri yang ada. Puluhan perpustakaan berada di sana, ada yang sudah bertahun-tahun ketinggalan zaman, ada yang begitu kabur sehingga saya terpaksa menyemak git blame untuk mencari siapa yang menambahnya dan mengapa. Saya menjalankan arahan pemasangan untuk versi Material UI yang baharu dan terminal dipenuhi dengan amaran kebergantungan rakan (peer dependency warnings). Pakej yang ingin saya kemas kini adalah baik. Ekosistem di sekelilingnya pula tidak. Saya menyedari bahawa saya bukan sedang melakukan naik taraf. Saya sedang menggali runtuhan.

Mengapa Kekacauan Ini Menelan Kos Lebih Daripada Maruah

Mengabaikan kebergantungan bukan sekadar isu kosmetik. Ia mewujudkan masalah sebenar yang mahal.

Risiko keselamatan adalah ancaman yang nyata. Pakej yang terbiar membawa kerentanan yang telah didedahkan yang ditandakan oleh pengimbas setiap minggu. Lebih buruk lagi, perpustakaan yang anda pasang secara langsung mungkin dalam keadaan baik, manakala kebergantungan transitif yang ditariknya pula tidak. Anda mewarisi hutang teknikal orang lain tanpa menyedarinya.

Kos meningkat seiring dengan jarak. Semakin lama anda menunggu, semakin besar jurang versi yang wujud. Melompat satu versi utama React adalah satu kerja. Melompat tiga versi adalah satu projek migrasi yang boleh memakan masa berminggu-minggu. Anda berhenti mendapat pembetulan pepijat, penambahbaikan prestasi, dan keserasian dengan alatan moden. Pasukan akhirnya membina di sekeliling batasan yang sepatutnya sudah tidak wujud lagi.

Perpustakaan boleh mati. Pakej tanpa penyelenggara aktif secara lalai menjadi "fork" peribadi anda. Apabila ia rosak, andalah yang perlu membaca kod sumber minifikasinya pada tengah malam. Komuniti telah beralih kepada penyelesaian yang lebih baik, dan pasukan anda tersangkut menyelenggara sesuatu yang sudah tidak bernyawa.

Kepantasan merosot tajam. Pembangun baharu menghabiskan hari-hari pertama mereka mempelajari API yang pelik untuk alatan yang telah digantikan oleh piawaian web atau alternatif arus perdana. Daripada melancarkan ciri-ciri baharu, jurutera kanan anda menjadi ahli sejarah, menjelaskan mengapa projek ini masih menggunakan task runner dari tahun 2015.

Audit Sebelum Anda Menyentuh Mana-mana Versi

Kesilapan terbesar adalah menjalankan kemas kini secara menyeluruh dan berharap ujian akan lulus. Mulakan dengan audit. Ambil package.json dan soal setiap entri.

Tanya empat soalan:

  • Apakah masalah yang diselesaikan oleh ini?
  • Di manakah sebenarnya kita menggunakannya?
  • Adakah ia masih perlu?
  • Adakah terdapat alternatif yang lebih baik sekarang?

Anda akan menemui pertindihan. Mungkin moment dan date-fns kedua-duanya ada dalam senarai kerana dua pembangun menyelesaikan masalah yang sama pada masa yang berbeza. Mungkin satu polyfill untuk Internet Explorer masih disertakan walaupun analitik anda menunjukkan sifar trafik daripada pelayar lama. Mungkin pembungkus tersuai untuk fetch boleh dipadamkan kerana pelayar moden mengendalikan kes-kes tertentu secara asli.

Kadangkala penggantian lebih baik daripada mengemas kini. Bergelut dengan perpustakaan carta yang terbiar melalui tiga tahun perubahan yang merosakkan boleh mengambil masa lebih lama daripada menukar kepada alternatif yang stabil dan membina semula beberapa komponen. Bersedialah untuk mengurangkan.

Lapisan Tersembunyi: Kebergantungan Transitif dan Semver

Kebergantungan langsung hanyalah bahagian aisberg yang kelihatan. Bahagian besarnya terletak di bawah dalam kebergantungan transitif, iaitu pakej yang diperlukan oleh pakej anda. Anda tidak memilihnya, tetapi ia dilaksanakan dalam binaan anda. Ia membesarkan saiz bundle anda, memperluas permukaan serangan, dan kadangkala bercanggah antara satu sama lain dengan cara yang menghasilkan ralat binaan yang mengelirukan.

Anda perlu memahami penomboran versi semantik (semantic versioning) mengikut maksud sebenarnya, bukan mengikut apa yang anda harapkan.

  • Major updates: Ini adalah migrasi. Anggap ia sebagai perubahan yang merosakkan (breaking changes) sehingga terbukti sebaliknya. Baca log perubahan (changelog), peruntukkan masa, dan uji dengan teliti.
  • Minor updates: Ini menambah ciri-ciri. Ia juga boleh mengubah tingkah laku dalam cara yang halus. Jangan anggap ia percuma.
  • Patch updates: Ini membaiki pepijat. Ia biasanya selamat, tetapi jika kod anda bergantung pada pepijat tersebut, atau jika tampalan itu mengubah sesuatu bahagian dalaman yang anda telah lakukan monkey-patching, anda masih boleh mengalami kerosakan.

Mengetahui peraturan ini membantu anda mengkategorikan risiko sebelum anda menyentuh apa-apa.

Gunakan Alatan Anda Seperti Seorang Pakar

Jika anda menggunakan Yarn, beberapa arahan terbina dalam menukarkan tekaan kepada satu proses.

Jalankan yarn outdated terlebih dahulu. Ia memberikan anda gambaran tentang apa yang telah menyimpang