• nodurilor

Șeful echipei Node.js

Este o dimineață de luni și trebuie să înființați un nou proiect. Instalați toate pachetele npm necesare, apoi începeți să lucrați la unele caracteristici. Mai devreme sau mai târziu veți găsi o problemă care necesită o codificare excepțională, așa că apelați la Google și căutați un răspuns - probabil un pachet. Îl instalați și creați o imagine de pachet de producție. Apoi, aruncați o privire asupra dimensiunii sale și ... așa faceți un atac de cord. „Cum am ajuns cu 1 GB node_modules?!” - lupta este reală și credeți-mă, la TSH am fost de mai multe ori acolo. Dar nu vă temeți, se poate face ceva pentru a reduce acea dimensiune! Am creat câțiva pași simpli pentru a-i reduce dimensiunea. Urmează-mă, te rog ...

Povestea noastră de fundal node_modules

Nu cu mult timp în urmă, am lucrat la acest proiect britanic de fintech, unde a trebuit să migram sistemul la o arhitectură de microservicii folosind Node.js. Când am fost introduși în platformă, am primit două cerințe de la client - trebuia să fie eficientă și ușoară. Performanța nu este o problemă pentru Node.js (cu excepția cazului în care blocați accidental bucla evenimentului), cu toate acestea, poate fi ușoară. Imaginea inițială a fost de 32 MB, ceea ce este un rezultat foarte frumos, dar s-a dovedit rapid că adevărata problemă este node_modules.

Contrar a ceea ce ați putea crede, dimensiunea aplicației este importantă în câteva domenii:

  • performanță - o aplicație ușoară și care rulează mai rapid, ocupă mai puține resurse, astfel încât funcționează mai eficient în timpul dezvoltării,
  • costuri - unele aplicații ușoare necesită mai puține resurse, ceea ce înseamnă că costurile infrastructurii scad și economisiți o mulțime de bani.

Dezvoltatorilor le place să își simplifice activitatea pentru a face totul mai repede - de aceea includ biblioteci suplimentare. Din păcate, acest lucru are ca rezultat o dimensiune crescută a întregii aplicații care poate ieși din control foarte repede. Așa a început aventura noastră cu „slăbirea” lucrului. Deci, ce am făcut pentru a le micșora?

Interesat de dezvoltarea de microservicii? 🤔 Asigurați-vă că consultați raportul nostru privind starea microserviciilor 2020 - pe baza opiniilor a peste 650 de experți în microservicii!

Reduceți numărul de dependențe

Acesta sună evident, dar înainte de a intra în soluții mai invazive, poate ar trebui să vă gândiți la pachetele pe care le instalați. Chiar ai nevoie de toate?

La TSH folosim site-uri precum npm.broofa sau npm.anvaka pentru a vedea de fapt un grafic întreg de dependențe pentru un singur pachet și apoi discutăm dacă acesta este ceva ce căutăm.

Fara gluma!

De multe ori văd oameni instalând Jest doar pentru teste unitare simple (aproximativ 460+ dependențe, +/- 60MB) atunci când există libs mai mici care vor face exact același lucru (Mocha - 115 dependențe, 12MB).


Știu la ce vă gândiți - este doar o dependență de dev. Da, este, totuși, reducând numărul de module, veți accelera și mașina de dezvoltare. Mai puține lucruri stocate în memorie, mai puține libere de urmat de IDE toate acestea ne fac să ne dezvoltăm mai repede. Totul vine la recuzită și contra simple. În cazul nostru, am început cu 700 MB de dependențe și după câteva schimburi și eliminări, am ajuns cu doar 256 MB.

Folosiți steagul de producție

O altă metodă evidentă (dar uneori uitată) este de a utilizați steagul `–producere` la instalarea npm . Acesta va sări peste toate dependențele dev și va utiliza numai cele de producție. Crede-mă că merită. Majoritatea proiectelor noastre au înregistrat o reducere de + -33% a dimensiunii node_modules după ce am folosit-o (176 MB).

Eliminați fișierele inutile

V-ați gândit vreodată să fie instalate lucruri când tastați npm install? Nu vorbesc despre întregul copac al dependențelor, ci o mulțime de gunoi care este înăuntru. Documente, teste, marcaje, imagini, surse, o mulțime de fișiere care nu sunt deloc utile în timpul dezvoltării (spuneți-mi când a fost ultima dată când v-ați scufundat în node_modules pentru a citi documente, nu?).

La TSH am găsit două biblioteci interesante - node-prune și ModClean. Amândoi au același scop de a elimina tot ce nu este necesar pentru un pachet. ModClean vine cu trei modele - sigur, precauție și pericol - și uneori elimină prea multe fișiere.

De aceea, de cele mai multe ori folosim node-prune, deoarece nu numai că este mai sigur, ci ne permite și să reducem node_modules cu încă 30% din versiunea de producție.

Pentru o vizualizare mai bună: am început cu 256 MB din aceste module pentru versiunea pentru dezvoltatori. După producție am coborât la aproximativ 176 MB și apoi după nod-prune, suntem la aproximativ 126 MB. Este mai mult de jumătate din dimensiunea inițială!

Căutați și curățați

Chiar și după utilizarea nodului-prune, există încă ceva care poate fi făcut. La un moment dat, am început să verificăm dimensiunea fiecărui modul, pentru a vedea care sunt cele mai mari. Există o comandă foarte simplă în cazul MacOS și Linux:

Va imprima fiecare modul care are o dimensiune de cel puțin 1 MB. Făcând acest lucru, veți ști care module ocupă cel mai mult spațiu. A fost destul de util, deoarece până atunci nu ne-am dat seama că RxJS/gRPC și AWS nu sunt atât de subțiri. Mai mult decât atât, îl puteți folosi pe un anumit modul pentru a găsi directorul de vină. Acest lucru ne-a permis să constatăm că RxJS are o versiune pentru pachetele ts, es5, es2015 și UMD, chiar dacă folosim dist direct.

Aceste pachete suplimentare au luat 7 MB de la 11 MB din întregul pachet. Peste 50%!

Aceeași poveste a fost cu gRPC (a existat un director cu mai multe terțe părți pe care nu le-am folosit deloc - aproximativ 12 MB) și AWS (veți obține o versiune pentru web și nativă la pachet - aproximativ 10 MB). Din acest motiv, am creat un script shell special care a făcut curățarea.

Făcând acest lucru am scăzut cu încă 17%, deci de la 126 MB la aproximativ 104 MB.

Rezultatul final

Am început cu 700 MB de dependențe. Apoi am făcut câteva tăieri și am lăsat doar modulele de care aveam nevoie. Restul au fost schimbate cu module mai mici sau chiar înlocuite cu codul nostru personalizat. Am ajuns cu 256 MB. După aceea, am folosit steagul de producție și l-am transformat în 176 MB. Utilizând nodul-prune am putea coborî la 126 MB și apoi îl putem reduce la 104 MB după o curățare suplimentară.

De la 700 MB la 104 MB! Sună grozav, nu-i așa?

Credeți sau nu, dar toți acești pași (cu excepția steagului de producție) sunt utilizabili și în versiunea dev, așa că am încercat și asta. Am ajuns cu 161MB pentru versiunea dev. Este mai puțin decât să folosiți numai steagul de producție.