מאמר זה אמור לשמש מדריך חיוני ל- All-in-One עבור הצד החביב על Node.js: npm.
Node.js תופס את העולם בסערה מאז 2009. מאות אלפי מערכות נבנו באמצעות Node.js, מה שגרם לקהילת המפתחים לטעון כי "JavaScript אוכל תוכנה".
אחד הגורמים העיקריים להצלחת Node הוא npm - מנהל החבילות הפופולרי שלה, המאפשר למפתחי JavaScript לשתף חבילות שימושיות כמו lodash and moment במהירות ובקלות.
נכון לרגע כתיבת הפוסט הזה, npm הקלה על פרסום של למעלה מ -1.3 מיליון חבילות עם שיעור הורדות שבועי של מעל 16 מיליארד! המספרים האלה הם נפלאים לכל כלי תוכנה. אז בואו נדבר על מה בדיוק npm.
מה זה NPM?
NPM - או "מנהל חבילות הצמתים" - הוא מנהל החבילות המוגדר כברירת מחדל עבור Node.js.
זה ידוע גם בשם "Ninja Pumpkin Mutants", "יצרני פיצה ללא מטרות רווח", ושלל שמות אקראיים אחרים שתוכלו לחקור וכנראה לתרום להם בהרחבות npm.
NPM מורכב משני חלקים עיקריים:
- כלי CLI (ממשק שורת פקודה) לפרסום והורדת חבילות, וכן
- מאגר מקוון שמארח חבילות JavaScript
לקבלת הסבר ויזואלי יותר, אנו יכולים לחשוב על המאגר npmjs.com כמרכז הגשמה המקבל חבילות סחורות ממוכרים (מחברי חבילות npm) ומפיץ סחורות אלה לקונים (משתמשי חבילות npm).
כדי להקל על התהליך הזה, מרכז ההגשמה npmjs.com מעסיק צבא של רחמי רחם חרוצים (npm CLI) שיוקצו כעוזרים אישיים לכל לקוח npmjs.com. אז תלות מועברות למפתחי JavaScript כך:

ותהליך פרסום החבילה לבני הזוג שלך ב- JS יהיה משהו כזה:

בואו נסתכל כיצד צבא הרחם הזה מסייע למפתחים שרוצים להשתמש בחבילות JavaScript בפרויקטים שלהם. נראה גם כיצד הם עוזרים לאשפי קוד פתוח להוציא את הספריות המגניבות שלהם לעולם.
package.json
כל פרויקט ב- JavaScript - בין אם מדובר ב- Node.js או ביישום דפדפן - יכול להיות מוגדר כחבילה npm עם מידע חבילה משלה package.json
ותפקידו לתאר את הפרויקט.
אנחנו יכולים לחשוב package.json
על תוויות מוטבעות על אותם קופסאות טובות של npm שצבא הוומבאטים שלנו מספק.
package.json
ייווצר כאשר npm init
הוא מופעל כדי לאתחל פרויקט JavaScript / Node.js, כאשר המטא נתונים הבסיסיים האלה מסופקים על ידי מפתחים:
name
: שם ספריית / פרויקט JavaScript שלךversion
: גרסת הפרויקט שלך. לעיתים קרובות, לפיתוח אפליקציות, תחום זה מוזנח לעיתים קרובות מכיוון שאין צורך ברור בגירסאות ספריות קוד פתוח. אבל עדיין, זה יכול להיות שימושי כמקור לגרסת הפריסה.description
: תיאור הפרויקטlicense
: רישיון הפרויקט
סקריפטים npm
package.json
תומך גם scripts
במאפיין שניתן להגדיר כך שיפעיל כלי שורת פקודה המותקנים בהקשר המקומי של הפרויקט. לדוגמה, scripts
החלק של פרויקט npm יכול להראות בערך כך:
{ "scripts": { "build": "tsc", "format": "prettier --write **/*.ts", "format-check": "prettier --check **/*.ts", "lint": "eslint src/**/*.ts", "pack": "ncc build", "test": "jest", "all": "npm run build && npm run format && npm run lint && npm run pack && npm test" } }
עם eslint
, prettier
, ncc
, jest
לא מותקן בהכרח כמו רצה עולמית אלא מקומי בתוך הפרויקט node_modules/.bin/
.
ההקדמה האחרונה של npx מאפשרת לנו להריץ node_modules
פקודות מקיפות פרוייקט אלה ממש כמו תוכנית המותקנת בעולם על ידי קידומת npx ...
(כלומר npx prettier --write **/*.ts
).
תלות לעומת התלות תלות
שני אלה מגיעים בצורה של אובייקטים בעלי ערך מפתח עם שמות ספריות npm כמפתח והגרסאות שלהם בפורמט סמנטי כערך. זו דוגמה מתבנית ה- TypeScript של Github:
{ "dependencies": { "@actions/core": "^1.2.3", "@actions/github": "^2.1.1" }, "devDependencies": { "@types/jest": "^25.1.4", "@types/node": "^13.9.0", "@typescript-eslint/parser": "^2.22.0", "@zeit/ncc": "^0.21.1", "eslint": "^6.8.0", "eslint-plugin-github": "^3.4.1", "eslint-plugin-jest": "^23.8.2", "jest": "^25.1.0", "jest-circus": "^25.1.0", "js-yaml": "^3.13.1", "prettier": "^1.19.1", "ts-jest": "^25.2.1", "typescript": "^3.8.3" } }
תלות אלה מותקנים באמצעות npm install
הפקודה עם --save
ו --save-dev
דגלים. הם נועדו לשמש לסביבות ייצור ופיתוח / בדיקה בהתאמה. נחקור עמוק יותר בהתקנת חבילות אלה בחלק הבא.
בינתיים חשוב להבין את הסימנים האפשריים שמגיעים לפני הגרסאות הסמנטיות (בהנחה שקראתם על פי major.minor.patch
מודל של סמבר):
^
: המהדורה הקטנה האחרונה. לדוגמה,^1.0.4
מפרט עשוי להתקין גרסה1.3.0
אם זו הגרסה המשנית האחרונה1
בסדרה הגדולה.~
: המהדורה האחרונה של התיקון. באותו אופן כמו^
במהדורות קלות,~1.0.4
המפרט עשוי להתקין גרסה1.0.7
אם זו הגרסה המשנית האחרונה1.0
בסדרה המשנית.
כל גרסאות החבילה המדויקות הללו יתועדו package-lock.json
בקובץ שנוצר .
package-lock.json
קובץ זה מתאר את הגרסאות המדויקות של התלות המשמשת בפרויקט JavaScript של npm. אם package.json
הוא תווית תיאורית כללית, package-lock.json
הוא טבלת מרכיבים.
ובדיוק כמו איך שאנחנו בדרך כלל לא קוראים את טבלת המרכיבים של מוצר (אלא אם כן אתה משועמם מדי או צריך לדעת), package-lock.json
לא נועד לקרוא שורה אחר שורה על ידי מפתחים (אלא אם כן אנו נואשים לפתור " עובד במחשבי "בעיות".
package-lock.json
נוצר בדרך כלל על ידי npm install
הפקודה, והוא נקרא גם על ידי הכלי NPM CLI שלנו כדי להבטיח שכפול של סביבות בנייה לפרויקט עם npm ci
.
כיצד לפקד ביעילות על NPM Wombats כ"קונה "
כפי שהוסבר מ -1.3 מיליון חבילות שפורסמו לעומת 16 מיליארד הורדות שהוזכרו קודם, רוב משתמשי ה- npm משתמשים ב- npm בכיוון זה. אז טוב לדעת כיצד להשתמש בכלי החזק הזה.
התקנת npm
זו הפקודה הנפוצה ביותר כשאנחנו מפתחים יישומי JavaScript / Node.js בימינו.
כברירת מחדל, npm install
יתקין את הגרסה האחרונה של החבילה עם ^
סימן הגרסה. npm install
בהקשר של פרויקט NPM יוריד חבילות לתוך הפרויקט node_modules
בתיקייה על פי package.json
מפרטים, שדרוג לגרסת החבילה (ו בתורו התחדשות package-lock.json
) בכל מקום בו היא יכולה מבוססת על ^
ואת ~
התאמת גרסה.
אתה יכול לציין דגל גלובלי -g
אם ברצונך להתקין חבילה בהקשר הגלובלי שבו תוכל להשתמש בכל מקום במחשב שלך (זה נפוץ לחבילות כלים בשורת הפקודה כמו שרת חי).
npm הפכה את ההתקנה של חבילות JavaScript לפשוטות כל כך שלעתים קרובות נעשה שימוש שגוי בפקודה זו. התוצאה היא npm להיות התחת של הרבה בדיחות מתכנתים כמו אלה:

זה המקום בו --production
הדגל נחלץ להצלה! בחלק הקודם, דנו dependencies
ו devDependencies
מיועד לשימוש בסביבת ייצור ופיתוח / מבחן בהתאמה. --production
הדגל הזה הוא איך ההבדלים node_modules
נעשים.
על ידי הצמדת דגל זה npm install
לפקודה, אנו נתקין רק חבילות מ dependencies
, וכך נצמצם באופן דרסטי את גודל שלנו node_modules
לכל מה שנחוץ בהחלט כדי שהיישומים שלנו יפעלו.
בדיוק כמו שכאשר צופי ילדים וילדות לא הבאנו לסחיטת לימון לדוכן הלימונדה שלנו, אנחנו לא צריכים להביא devDependencies
לייצור!
npm ci
אז אם npm install --production
היא אופטימלית לסביבת ייצור, האם חייבת להיות פקודה האופטימלית להתפתחות המקומית שלי, להגדרת הבדיקה?
התשובה היא npm ci
.
בדיוק כמו אם אם package-lock.json
לא קיים בפרויקט שהוא נוצר בכל פעם npm install
שהוא נקרא, npm ci
צורכת את הקובץ הזה כדי להוריד את הגרסה המדויקת של כל חבילה בודדת שהפרויקט תלוי בה.
This is how we can make sure that the our project's context stays exactly the same across different machines, whether it's our laptops used for development or CI (Continuous Integration) build environments like Github Actions.
npm audit
With the humongous number of packages that have been published and can easily be installed, npm packages are susceptible to bad authors with malicious intentions like these.
Realising that there was an issue in the ecosystem, the npm.js organisation came up with the idea of npm audit
. They maintain a list of security loopholes that developers can audit their dependencies against using the npm audit
command.
npm audit
gives developers information about the vulnerabilities and whether there're versions with remediations to upgrade to. For example,

If the remediations are available in the next non-breaking version upgrades, npm audit fix
can be used to upgrade the affected dependencies' versions automatically.
How to effectively command NPM wombats as "seller"
We have gone through how to wield the NPM CLI tool as a consumer, but what about effectively using it as an author (and potentially becoming a JavaScript open source wizard ?)?
npm publish
Sending a package to our npmjs.com fulfillment centre is super easy as we only need to run npm publish
. The tricky part, which is not specific to npm package authors, is determining the version of the package.
The rule of thumb according to semver.org:
- MAJOR version when you make incompatible API changes,
- MINOR version when you add functionality in a backwards compatible manner, and
- PATCH version when you make backwards compatible bug fixes.
It's even more important to follow the above rule when publishing your packages to ensure that you're not breaking anyone's code as the default version matching in npm is ^
(aka the next minor version).
❤️ npm ❤️ JavaScript ❤️ Node.js ❤️
That's all we need to know to start wielding npm effectively and command our lovely army of wombats!
