[{"data":1,"prerenderedAt":834},["ShallowReactive",2],{"article-mutakhirkan-paket-nodejs-npm":3},{"id":4,"title":5,"body":6,"date":823,"description":824,"extension":825,"locale":826,"meta":827,"navigation":828,"path":829,"seo":830,"sitemap":831,"stem":832,"__hash__":833},"articles\u002Fblog\u002Fmutakhirkan-paket-nodejs-npm.md","Cara memutakhirkan paket-paket Node.js dengan npm",{"type":7,"value":8,"toc":813},"minimark",[9,40,48,51,60,65,68,90,93,110,114,117,124,127,132,149,153,156,159,190,199,204,211,226,229,248,251,255,258,606,609,613,628,635,639,651,654,658,665,668,672,684,687,691,698,701,705,712,715,719,738,742,756,760,763,766,774,777,785,789,792,799,802,809],[10,11,12,20],"image-figure",{},[13,14,15],"p",{},[16,17],"img",{"alt":18,"src":19},"foto orang menunjuk ke atas dengan jari","\u002Fimages\u002Fmutakhirkan-paket-nodejs-npm\u002Fsocial-media-share.jpg",[21,22,24],"template",{"v-slot:caption":23},"",[13,25,26,27,34,35],{},"Foto oleh ",[28,29,33],"a",{"href":30,"rel":31},"https:\u002F\u002Funsplash.com\u002F@iyankurnia",[32],"nofollow","Iyan Kurnia"," dari ",[28,36,39],{"href":37,"rel":38},"https:\u002F\u002Funsplash.com\u002Fphotos\u002Fbrown-and-white-flannel-shirt-w6uyEFvlakg",[32],"Unsplash",[13,41,42,43,47],{},"Mungkin, tidak banyak dari kita yang melakukan pembaruan paket-paket secara berkala ketika mengembangkan aplikasi. Biasanya kita menerapkan pola pikir ",[44,45,46],"em",{},"pasang dan lupakan"," ketika mengembangkan proyek JavaScript. Padahal, perkembangan JavaScript itu sangat cepat.",[13,49,50],{},"Pembaruan paket-paket ini mungkin tidak telihat pengaruhnya secara langsung pada proyek kita. Namun, seringkali ada pembaruan untuk menutup celah keamanan.",[13,52,53,54,59],{},"Ketika mengembangkan ",[28,55,58],{"href":56,"rel":57},"https:\u002F\u002Fgitlab.com\u002Ffindrakecil\u002Fcompromeez\u002F-\u002Freleases\u002F1.2.0",[32],"Compromeez 1.2.0",", ternyata paket-paket JavaScriptnya sudah banyak yang usang 😅. Berikut adalah catatan perjalanan saya dalam memutakhirkan paket-paket Node.js pada proyek Compromeez.",[61,62,64],"h2",{"id":63},"periksa-paket-paket-usang","Periksa paket-paket usang",[13,66,67],{},"Pertama, kita perlu mengetahui paket mana saja yang telah usang. Untuk mendapatkan daftar paket-paket yang memiliki versi lebih baru, kita dapat menggunakan perintah berikut:",[69,70,74],"pre",{"className":71,"code":72,"language":73,"meta":23,"style":23},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npm outdated\n","sh",[75,76,77],"code",{"__ignoreMap":23},[78,79,82,86],"span",{"class":80,"line":81},"line",1,[78,83,85],{"class":84},"sBMFI","npm",[78,87,89],{"class":88},"sfazB"," outdated\n",[13,91,92],{},"Berikut adalah contoh hasil dari perintah tersebut:",[10,94,95,101],{},[13,96,97],{},[16,98],{"alt":99,"src":100},"hasil dari perintah npm outdated di terminal","\u002Fimages\u002Fmutakhirkan-paket-nodejs-npm\u002Fnpm-outdated.png",[21,102,103],{"v-slot:caption":23},[13,104,105,106,109],{},"Hasil dari perintah ",[75,107,108],{},"npm outdated"," di terminal",[61,111,113],{"id":112},"praktek-terbaik","Praktek terbaik",[13,115,116],{},"Sebelum kita memulai untuk memutakhirkan paket-paket tersebut, kita perlu memahami praktek terbaik untuk mengurangi risiko yang mungkin terjadi setelahnya.",[13,118,119,120,123],{},"Terkadang, pada peningkatan versi major terdapat ",[44,121,122],{},"breaking changes",", yaitu perubahan besar yang dapat menimbulkan aplikasi gagal berjalan.",[13,125,126],{},"Untuk mendapatkan proses pemutakhiran yang lancar, berikut adalah praktek terbaik yang dapat kita terapkan.",[128,129,131],"h3",{"id":130},"sebelum-memutakhirkan","Sebelum memutakhirkan",[133,134,135,143],"ol",{},[136,137,138,142],"li",{},[139,140,141],"strong",{},"Periksa kebutuhan paket",": Biasanya paket versi baru membutuhkan versi Node.js yang lebih baru. Pastikan sistem operasi, proyek, dan dukungan penyunting teks mampu mendukung versi yang lebih baru sebelum meningkatkan Node.js.",[136,144,145,148],{},[139,146,147],{},"Tinjau perubahan besar",": Versi major biasanya memiliki perubahan besar seperti format berkas pengaturan yang didukung, method atau nilai yang tidak didukung lagi, atau struktur folder yang digunakan.",[128,150,152],{"id":151},"ketika-memutakhirkan","Ketika memutakhirkan",[13,154,155],{},"Lakukan peningkatan secara bertahap, satu paket beserta penunjang dan ketergantungannya, kemudian lakukan pengujian sebelum memulai pemutakhiran paket selanjutnya.",[13,157,158],{},"Dengan begini:",[160,161,162,168,174,180],"ul",{},[136,163,164,167],{},[139,165,166],{},"Masalah tidak menyebar",": Jika terjadi galat, maka kita akan tahu paket mana yang menyebabkan galat tersebut.",[136,169,170,173],{},[139,171,172],{},"Pelacakan menjadi lebih mudah",": Kita tidak susah payah melakukan beberapa pemutakhiran sekaligus.",[136,175,176,179],{},[139,177,178],{},"Putar balik yang lebih aman",": Jika diperlukan, kita dapat membatalkan hanya satu perubahan.",[136,181,182,185,186,189],{},[139,183,184],{},"Riwayat Git yang jelas",": Setiap ",[44,187,188],{},"commit"," mewakili satu peningkatan.",[191,192,193],"blockquote",{},[13,194,195,198],{},[139,196,197],{},"Catatan:","\nTerkadang, ada paket-paket yang saling bergantung satu sama lainnya. Jika Anda menemui kejadian seperti itu, anggaplah mereka sebagai satu kesatuan.",[200,201,203],"h4",{"id":202},"perintah-singkat","Perintah singkat",[13,205,206,207,210],{},"Kita dapat menggunakan rumus perintah ",[75,208,209],{},"npm install package@version"," untuk menyingkat proses manual dari peningkatan versi.",[69,212,214],{"className":71,"code":213,"language":73,"meta":23,"style":23},"npm install eslint@10\n",[75,215,216],{"__ignoreMap":23},[78,217,218,220,223],{"class":80,"line":81},[78,219,85],{"class":84},[78,221,222],{"class":88}," install",[78,224,225],{"class":88}," eslint@10\n",[13,227,228],{},"Perintah tersebut melakukan hal-hal berikut dalam satu perintah:",[160,230,231,242,245],{},[136,232,233,234,237,238,241],{},"Memperbarui ",[75,235,236],{},"package.json"," dan ",[75,239,240],{},"package-lock.json"," secara otomatis.",[136,243,244],{},"Memasang versi terbaru.",[136,246,247],{},"Tidak memerlukan penyuntingan manual pada berkas tersebut.",[13,249,250],{},"Cukup jalankan satu perintah dan selesai. Lebih cepat daripada menyunting berkas-berkas tersebut secara manual 😉.",[200,252,254],{"id":253},"contoh-kasus","Contoh kasus",[13,256,257],{},"Berikut adalah paket-paket usang pada Compromeez 1.1.0 sebelum ditingkatkan pada versi 1.2.0.",[69,259,261],{"className":71,"code":260,"language":73,"meta":23,"style":23},"Package                             Current    Wanted   Latest  Location                                  Depended by\n@eslint\u002Fjs                           9.39.4    9.39.4   10.0.1  node_modules\u002F@eslint\u002Fjs                   compromeez\n@rollup\u002Frollup-linux-x64-gnu        MISSING     4.9.5   4.59.0  -                                         compromeez\n@rollup\u002Frollup-win32-x64-msvc       MISSING     4.9.5   4.59.0  -                                         compromeez\n@tailwindcss\u002Foxide-linux-x64-gnu    MISSING     4.2.1    4.2.1  -                                         compromeez\n@tailwindcss\u002Foxide-win32-x64-msvc   MISSING     4.2.1    4.2.1  -                                         compromeez\n@types\u002Fnode                        22.19.15  22.19.15   25.5.0  node_modules\u002F@types\u002Fnode                  compromeez\n@vueuse\u002Fcore                         12.8.2    12.8.2   14.2.1  node_modules\u002F@vueuse\u002Fcore                 compromeez\neslint                               9.39.4    9.39.4   10.0.3  node_modules\u002Feslint                       compromeez\neslint-plugin-vue                    9.33.0    9.33.0   10.8.0  node_modules\u002Feslint-plugin-vue            compromeez\nlightningcss-linux-x64-gnu          MISSING    1.32.0   1.32.0  -                                         compromeez\nlightningcss-win32-x64-msvc         MISSING    1.32.0   1.32.0  -                                         compromeez\nlucide-vue-next                     0.468.0   0.468.0  0.577.0  node_modules\u002Flucide-vue-next              compromeez\nmotion-v                             1.10.3    1.10.3    2.0.0  node_modules\u002Fmotion-v                     compromeez\nprettier-plugin-tailwindcss          0.6.14    0.6.14    0.7.2  node_modules\u002Fprettier-plugin-tailwindcss  compromeez\nvite                                  7.3.1     7.3.1    8.0.0  node_modules\u002Fvite                         compromeez\nvue-tsc                              2.2.12    2.2.12    3.2.5  node_modules\u002Fvue-tsc                      compromeez\n",[75,262,263,286,308,329,346,365,382,403,424,444,465,484,501,522,543,564,585],{"__ignoreMap":23},[78,264,265,268,271,274,277,280,283],{"class":80,"line":81},[78,266,267],{"class":84},"Package",[78,269,270],{"class":88},"                             Current",[78,272,273],{"class":88},"    Wanted",[78,275,276],{"class":88},"   Latest",[78,278,279],{"class":88},"  Location",[78,281,282],{"class":88},"                                  Depended",[78,284,285],{"class":88}," by\n",[78,287,289,292,296,299,302,305],{"class":80,"line":288},2,[78,290,291],{"class":84},"@eslint\u002Fjs",[78,293,295],{"class":294},"sbssI","                           9.39.4",[78,297,298],{"class":294},"    9.39.4",[78,300,301],{"class":294},"   10.0.1",[78,303,304],{"class":88},"  node_modules\u002F@eslint\u002Fjs",[78,306,307],{"class":88},"                   compromeez\n",[78,309,311,314,317,320,323,326],{"class":80,"line":310},3,[78,312,313],{"class":84},"@rollup\u002Frollup-linux-x64-gnu",[78,315,316],{"class":88},"        MISSING",[78,318,319],{"class":294},"     4.9.5",[78,321,322],{"class":294},"   4.59.0",[78,324,325],{"class":88},"  -",[78,327,328],{"class":88},"                                         compromeez\n",[78,330,332,335,338,340,342,344],{"class":80,"line":331},4,[78,333,334],{"class":84},"@rollup\u002Frollup-win32-x64-msvc",[78,336,337],{"class":88},"       MISSING",[78,339,319],{"class":294},[78,341,322],{"class":294},[78,343,325],{"class":88},[78,345,328],{"class":88},[78,347,349,352,355,358,361,363],{"class":80,"line":348},5,[78,350,351],{"class":84},"@tailwindcss\u002Foxide-linux-x64-gnu",[78,353,354],{"class":88},"    MISSING",[78,356,357],{"class":294},"     4.2.1",[78,359,360],{"class":294},"    4.2.1",[78,362,325],{"class":88},[78,364,328],{"class":88},[78,366,368,371,374,376,378,380],{"class":80,"line":367},6,[78,369,370],{"class":84},"@tailwindcss\u002Foxide-win32-x64-msvc",[78,372,373],{"class":88},"   MISSING",[78,375,357],{"class":294},[78,377,360],{"class":294},[78,379,325],{"class":88},[78,381,328],{"class":88},[78,383,385,388,391,394,397,400],{"class":80,"line":384},7,[78,386,387],{"class":84},"@types\u002Fnode",[78,389,390],{"class":294},"                        22.19.15",[78,392,393],{"class":294},"  22.19.15",[78,395,396],{"class":294},"   25.5.0",[78,398,399],{"class":88},"  node_modules\u002F@types\u002Fnode",[78,401,402],{"class":88},"                  compromeez\n",[78,404,406,409,412,415,418,421],{"class":80,"line":405},8,[78,407,408],{"class":84},"@vueuse\u002Fcore",[78,410,411],{"class":294},"                         12.8.2",[78,413,414],{"class":294},"    12.8.2",[78,416,417],{"class":294},"   14.2.1",[78,419,420],{"class":88},"  node_modules\u002F@vueuse\u002Fcore",[78,422,423],{"class":88},"                 compromeez\n",[78,425,427,430,433,435,438,441],{"class":80,"line":426},9,[78,428,429],{"class":84},"eslint",[78,431,432],{"class":294},"                               9.39.4",[78,434,298],{"class":294},[78,436,437],{"class":294},"   10.0.3",[78,439,440],{"class":88},"  node_modules\u002Feslint",[78,442,443],{"class":88},"                       compromeez\n",[78,445,447,450,453,456,459,462],{"class":80,"line":446},10,[78,448,449],{"class":84},"eslint-plugin-vue",[78,451,452],{"class":294},"                    9.33.0",[78,454,455],{"class":294},"    9.33.0",[78,457,458],{"class":294},"   10.8.0",[78,460,461],{"class":88},"  node_modules\u002Feslint-plugin-vue",[78,463,464],{"class":88},"            compromeez\n",[78,466,468,471,474,477,480,482],{"class":80,"line":467},11,[78,469,470],{"class":84},"lightningcss-linux-x64-gnu",[78,472,473],{"class":88},"          MISSING",[78,475,476],{"class":294},"    1.32.0",[78,478,479],{"class":294},"   1.32.0",[78,481,325],{"class":88},[78,483,328],{"class":88},[78,485,487,490,493,495,497,499],{"class":80,"line":486},12,[78,488,489],{"class":84},"lightningcss-win32-x64-msvc",[78,491,492],{"class":88},"         MISSING",[78,494,476],{"class":294},[78,496,479],{"class":294},[78,498,325],{"class":88},[78,500,328],{"class":88},[78,502,504,507,510,513,516,519],{"class":80,"line":503},13,[78,505,506],{"class":84},"lucide-vue-next",[78,508,509],{"class":294},"                     0.468.0",[78,511,512],{"class":294},"   0.468.0",[78,514,515],{"class":294},"  0.577.0",[78,517,518],{"class":88},"  node_modules\u002Flucide-vue-next",[78,520,521],{"class":88},"              compromeez\n",[78,523,525,528,531,534,537,540],{"class":80,"line":524},14,[78,526,527],{"class":84},"motion-v",[78,529,530],{"class":294},"                             1.10.3",[78,532,533],{"class":294},"    1.10.3",[78,535,536],{"class":294},"    2.0.0",[78,538,539],{"class":88},"  node_modules\u002Fmotion-v",[78,541,542],{"class":88},"                     compromeez\n",[78,544,546,549,552,555,558,561],{"class":80,"line":545},15,[78,547,548],{"class":84},"prettier-plugin-tailwindcss",[78,550,551],{"class":294},"          0.6.14",[78,553,554],{"class":294},"    0.6.14",[78,556,557],{"class":294},"    0.7.2",[78,559,560],{"class":88},"  node_modules\u002Fprettier-plugin-tailwindcss",[78,562,563],{"class":88},"  compromeez\n",[78,565,567,570,573,576,579,582],{"class":80,"line":566},16,[78,568,569],{"class":84},"vite",[78,571,572],{"class":294},"                                  7.3.1",[78,574,575],{"class":294},"     7.3.1",[78,577,578],{"class":294},"    8.0.0",[78,580,581],{"class":88},"  node_modules\u002Fvite",[78,583,584],{"class":88},"                         compromeez\n",[78,586,588,591,594,597,600,603],{"class":80,"line":587},17,[78,589,590],{"class":84},"vue-tsc",[78,592,593],{"class":294},"                              2.2.12",[78,595,596],{"class":294},"    2.2.12",[78,598,599],{"class":294},"    3.2.5",[78,601,602],{"class":88},"  node_modules\u002Fvue-tsc",[78,604,605],{"class":88},"                      compromeez\n",[13,607,608],{},"Dari contoh di atas, kita dapat membaginya menjadi beberapa kelompok berdasarkan fungsi dan urutan pemutakhiran seperti berikut:",[200,610,612],{"id":611},"kelompok-1-eslint","Kelompok 1: ESLint",[160,614,615,620,624],{},[136,616,617,619],{},[75,618,429],{}," (v9 → v10)",[136,621,622,619],{},[75,623,291],{},[136,625,626,619],{},[75,627,449],{},[13,629,630,631,634],{},"Ketiganya merupakan paket-paket yang saling terkait. Setelah selesai meningkatkan, ujilah kegiatan ",[44,632,633],{},"lint"," kode-kode proyek Anda.",[200,636,638],{"id":637},"kelompok-2-typescript-dan-type-definitions","Kelompok 2: TypeScript dan Type Definitions",[160,640,641,646],{},[136,642,643,645],{},[75,644,387],{}," (v22 → v25)",[136,647,648,650],{},[75,649,590],{}," (v2 → v3)",[13,652,653],{},"Kedua paket tersebut bekerja berdampingan untuk mendukung TypeScript.",[200,655,657],{"id":656},"kelompok-3-build-tools","Kelompok 3: Build Tools",[160,659,660],{},[136,661,662,664],{},[75,663,569],{}," (v7 → v8)",[13,666,667],{},"Mutakhirkan setelah Kelompok 1 dan 2 lolos pengujian.",[200,669,671],{"id":670},"kelompok-4-ekosistem-vue","Kelompok 4: Ekosistem Vue",[160,673,674,679],{},[136,675,676,678],{},[75,677,408],{}," (v12 → v14)",[136,680,681,683],{},[75,682,506],{}," (v0.468 → v0.577)",[13,685,686],{},"Mutakhirkan setelah Kelompok 3.",[200,688,690],{"id":689},"kelompok-5-styling-dan-formatting","Kelompok 5: Styling dan Formatting",[160,692,693],{},[136,694,695,697],{},[75,696,548],{}," (v0.6 → v0.7)",[13,699,700],{},"Tidak bergantung pada paket-paket sebelumnya. Dapat dimutakhirkan secara terpisah.",[200,702,704],{"id":703},"kelompok-6-animation","Kelompok 6: Animation",[160,706,707],{},[136,708,709,711],{},[75,710,527],{}," (v1 → v2)",[13,713,714],{},"Paket mandiri. Mutakhirkan paling akhir atau secara terpisah.",[200,716,718],{"id":717},"paket-paket-yang-hilang","Paket-paket yang hilang",[13,720,721,722,725,726,729,730,733,734,737],{},"Untuk paket-paket dengan status ",[75,723,724],{},"MISSING"," seperti ",[75,727,728],{},"@rollup\u002F*",", ",[75,731,732],{},"@tailwindcss\u002Foxide-*",", dan ",[75,735,736],{},"lightningcss-*"," merupakan paket biner untuk platform khusus yang akan dipasang secara otomatis ketika diperlukan.",[128,739,741],{"id":740},"setelah-memutakhirkan","Setelah memutakhirkan",[160,743,744,750],{},[136,745,746,749],{},[139,747,748],{},"Lakukan pengujian",": Jalankan pengujian secara menyeluruh. Tinjau setiap peringatan dan galat yang muncul.",[136,751,752,755],{},[139,753,754],{},"Dokumentasikan setiap perubahan",": Catat apa yang berubah sebagai rujukan untuk tim Anda.",[128,757,759],{"id":758},"contoh-paket-yang-bentrok","Contoh paket yang bentrok",[13,761,762],{},"Dari paket-paket pada contoh di atas, ada paket yang tidak saya mutakhirkan karena ada paket lain yang bergantung padanya dan belum mendukung versi terbarunya. Paket tersebut adalah Vite versi 8.",[13,764,765],{},"Berikut adalah hasil ketika saya coba memutakhirkan Vite ke versi 8.",[10,767,768],{},[13,769,770],{},[16,771],{"alt":772,"src":773},"hasil perintah memutakhirkan vite di terminal","\u002Fimages\u002Fmutakhirkan-paket-nodejs-npm\u002Fupgrade-vite.png",[13,775,776],{},"Setelah memutakhirkan Vite ke versi 8, kemudian saya coba untuk memutakhirkan paket-paket di Kelompok 4. Hasilnya, paket-paket di Kelompok 4 tidak dapat dimutakhirkan karena masih bergantung pada Vite versi 7.",[10,778,779],{},[13,780,781],{},[16,782],{"alt":783,"src":784},"galat ketika memutakhirkan paket-paket yang bergantung pada vite","\u002Fimages\u002Fmutakhirkan-paket-nodejs-npm\u002Fvite-dependency-error.png",[61,786,788],{"id":787},"kesimpulan","Kesimpulan",[13,790,791],{},"Perkembangan proyek JavaScript itu sangat cepat. Saya mengambil kesimpulan ini karena proyek Compromeez baru dibuat sekitar 2 bulan yang lalu dan terdapat banyak paket yang usang setelah diperiksa.",[13,793,794,795,798],{},"Agar aplikasi tetap aman dan mengurangi ",[44,796,797],{},"technical debt"," pada proyek, sebaiknya kita melakukan pemutakhiran secara rutin.",[13,800,801],{},"Bagaimana strategi kalian untuk menjaga agar aplikasi tetap aman dan selalu mutakhir? Bagikan pengalaman Anda pada kolom komentar di social media berikut:",[13,803,804],{},[28,805,808],{"href":806,"rel":807},"https:\u002F\u002Fwww.linkedin.com\u002Fposts\u002Factivity-7440437509400010752-wQ7K",[32],"LinkedIn",[810,811,812],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":23,"searchDepth":288,"depth":288,"links":814},[815,816,822],{"id":63,"depth":288,"text":64},{"id":112,"depth":288,"text":113,"children":817},[818,819,820,821],{"id":130,"depth":310,"text":131},{"id":151,"depth":310,"text":152},{"id":740,"depth":310,"text":741},{"id":758,"depth":310,"text":759},{"id":787,"depth":288,"text":788},"2026-03-19","Hampir setiap hari paket-paket JavaScript diperbarui. Amankan proyek JavaScript Anda dengan selalu memutakhirkan paket-paket yang digunakan.","md",null,{},true,"\u002Fblog\u002Fmutakhirkan-paket-nodejs-npm",{"title":5,"description":824},{"loc":829},"blog\u002Fmutakhirkan-paket-nodejs-npm","xx_OAj_G-8cdMm_QrPenpcOtwtTEFfKtcPg06H-4tSg",1775401850846]