Bir çox komanda üçün 'npm install' əmri gündəlik işin ayrılmaz hissəsidir. Lakin bu yanaşma production mühitində ciddi problemlər yarada bilər. Bir startap iki il əvvəl bu metrikanı dəyişdirərək deployment uğursuzluqlarını 80% azaldıb və 4 fərqli insidentin qarşısını alıb. Söhbət sadə bir keçiddən gedir: npm install əvəzinə npm ci --omit=dev.
npm install production mühitində etibarsız ola bilər. Ən böyük problem paket lock faylının düzgün işləməməsidir. npm install package-lock.json faylına tam hörmət etmir və lock faylı package.json ilə sinxron deyilsə, asılılıqları arxa planda yeniləyə bilər. Bir dəfə bir logging kitabxanasının patch release versiyası breaking change gətirdi və bütün API fleetimiz çökdü. Lock faylı bir versiyanı göstərir, konteyner isə başqa versiyanı quraşdırmışdı.
'Mənim maşınımda işləyir' problemi də production mühitində realdır. Yerli quraşdırmalar, CI quraşdırmaları və production quraşdırmaları fərqli dependency ağacları yarada bilər. Fərqli npm versiyaları, fərqli registry cavabları, fərqli keş davranışları - bu xaosdur. Bir komanda staging ilə production arasındakı uyğunsuzluğu 3 gün həll edə bilmədi, səbəb isə transitive dependency'nin səhv semantik versiya rezolyusiyası idi.
npm ci isə bu problemləri həll edir. O, yalnız lock faylından quraşdırır, dependency rezolyusiyasını tam atlayır və hər dəfə node_modules qovluğunu silərək təmiz bir quraşdırma təmin edir. --omit=dev flag'ı ilə dev asılılıqları production mühitinə düşmür, bu da təhlükəsizlik baxımından əlavə təminat verir. Nəticədə production konteynerləri təxminən 40 saniyəyə quraşdırma tamamlayır - əvvəlki 90 saniyə ilə müqayisədə.
Bu keçid üçün tək bir sətir kifayətdir: RUN npm ci --omit=dev. Ancaq diqqətli olmaq lazımdır: production'də lazım olan heç bir paketin devDependencies'də qalmadığından əmin olun. Precommit hook əlavə etmək də faydalıdır. Dəyişiklik sadə, pulsuz və effektivdir - deployment zamanı gözlənilməz xətalardan qorunmaq üçün ideal bir yanaşmadır.

