מה זה npm? מדריך מנהל חבילות הצמתים למתחילים

מאמר זה אמור לשמש מדריך חיוני ל- 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:

  1. MAJOR version when you make incompatible API changes,
  2. MINOR version when you add functionality in a backwards compatible manner, and
  3. 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!