Npm (תוכנה)

npm (ראשי תיבות של Node Package Manager) הוא מערכת ניהול חבילות לשפת התכנות JavaScript המתוחזקת על ידי חברת npm, Inc. המערכת מוגדרת כברירת מחדל עבור Node.js - סביבת ריצה  פופולרית של JavaScript. המערכת מורכבת מ-CLI, גם הוא נקרא npm, ומבסיס נתונים מקוון של חבילות פרטיות ציבוריות ובתשלום, הנקרא npm registry. הגישה לרישום מתבצעת דרך צד הלקוח, וניתן לעיין בחבילות הזמינות ולחפש דרך אתר npm. מנהל החבילות והרישום מנוהלים על ידי npm, Inc.

החשיבות של npm באה לידי ביטוי בכך שהוא מאפשר בקלות רבה לשתף פרויקט התלוי בחבילות\ספריות שונות (dependencies), באמצעות שמירת שם וגרסה בקובץ הנקרא package.json

npm כתובה כולה ב-JavaScript ופותחה על ידי אייזק ז. שולטר, שקיבל השראה מפרויקטים דומים אחרים כמו:PEAR )PHP) ו- CPAN (Perl).

ראשי תיבות 
npm הוא רשמית "קיצור רקורנימי רקורסיבי עבור 'npm is not a package manager'. עם זאת, בתחילת הדרך ראשי התיבות התייחסו ל-"Node Package Manager". הרחבת השם שונתה בשנת 2014.

תיאור 
npm נכללת כפיצ'ר מומלץ בתוכנית ההתקנה של Node.js. המערכת מורכבת מCLI המתקשר עם רישום מרחוק (remote registry). אופן זה מאפשר למשתמשים לצרוך ולהפיץ את מודולי ה-JavaScript הזמינים ברישום. החבילות ברישום הן בפורמט CommonJS וכוללות קובץ מטא-דאטה בפורמט JSON. למעלה מ-1.3 מיליון חבילות זמינות ברישום המרכזי. מאחר שהרישום אינו כולל תהליך בדיקה, חלק מהחבילות האמורות עלולות להיות באיכות נמוכה, לא מאובטחות או זדוניות. על מנת להתמודד עם בעיה זו, npm מסתמכת על דיווחי משתמשים כדי להסיר חבילות בעייתיות. npm חושפת סטטיסטיקות כמו מספר הורדות, כדי לסייע למפתחים לשפוט את איכות החבילות.

שימוש 
npm יכולה לנהל חבילות המהוות צימוד (dependency) מקומי של פרויקט מסוים (כלומר, חבילות\ספריות שהקוד שאנחנו כותבים זקוק להן כדי לרוץ), וגם חבילות התקנה של כלים גלובליים של JavaScript. יכולת חשובה של npm בהקשר זה, היא התקנת כלל החבילות הרלוונטיות לפרויקט, בפקודה אחת בלבד, דרך קובץ בשם package.json. בקובץ זה, ניתן לציין גרסה רצויה של כל חבילה מבוקשת לצורך הפרויקט, וכך מתאפשר למפתחים לעדכן אוטומטית את החבילות שלהם ובו בזמן להימנע משינויי שבירה לא רצויים כתוצאה מהבדלי גרסאות.

קובץ ה-package.json שמור ביחד עם קוד הפרויקט ומפרט באופן מסודר אודות החבילות הרלוונטיות לקוד. דוגמה בסיסית לתוכנו של הקובץ, נראית כך:{
  "name": "my_application",
  "version": "1.0.0",
  "dependencies": {
    "lodash": "^4.17.4"
  },
  "devDependencies" : {
  "gulp": "~3.1.0"
  }
}בדוגמה לעיל, השם והגרסה מתייחסים לת

וכנה אותה אני בונה, ואשר קובץ ה-package.json הוא חלק ממנה. תחת השדה dependencies נמצאת ספריה פופולרית בJavaScript בשם lodash, אשר הקוד שלי זקוק לה, בגרסה 4.17.4, כדי לרוץ. תחת השדה devDependencies נמצאות חבילות אשר אני זקוק להן רק בפיתוח, ולא בסביבת היצור (היכן שהתוכנה בסופו של דבר מיועדת לרוץ). משמעות הסימנים ^ ו-~ על יד מספר הגרסה, משמעותם היא מה תת-הגרסה החדשה ביותר שניתן להתקין. במקרה של ^, למשל בדוגמה לעיל, אם קיימת ל-lodash תת-גרסה 4.17.8, היא החדשה יותר וNPM תתקין אותה בעת ההרצה, אך לא כאשר קיימת תת-גרסה חדשה, למשל 4.18.0. כאשר מופיע הסימן ~, תתעדכן גם תת-הגרסה. למשל בדוגמה לעיל, אם קיימת ל-gulp תת-גרסה של 3.2.0, היא זו שתותקן, אך לא 4.0.0.

על מנת להתקין חבילה (dependency) מסוימת, למשל lodash, באופן שבו החבילה גם תתווסף לקובץ ה-package.json בקוד, עלי לכתוב את הפקודה הבאה בשורת הפקודה:

npm i --save lodash

פיצ'ר נוסף שמאפשרת npm הוא יצירת סקריפטים, באופן בו פקודה קצרה מוגדרת מראש בקובץ package.json, תריץ בשורת הפקודה סקריפט מסוים. כך למשל, הקוד הבא מביא לכך שבהרצת הפקודה npm start, ירוץ קובץ app.js (כיוון שהפקודה node נועדה להריץ קובצי node.js):{
  "name" : "my_app",
  "scripts": {
    "start" : "node app.js"
  }
}

חלופות 
ישנן מספר חלופות קוד פתוח ל-npm בכל הנוגע להתקנת JavaScript מודולרי, כולל ied, pnpm, npmd ו- Yarn (מערכת ששוחררה על ידי פייסבוק באוקטובר 2016). עם זאת, כל החבילות האמורות תואמות לרישום של npm, ומשתמשות בו כברירת מחדל. ההבדלים בין החבילות באים לידי ביטוי בחוויות שונות בצד הלקוח, המתמקדות בדרך כלל בשיפור ביצועים ודטרמיניזם בהשוואה ל-npm.

רישום 
npm מסתמכת על בסיס נתונים NoSQL מסוג Couch DB לניהול נתונים זמינים לציבור.

קישורים חיצוניים

הערות שוליים 

תוכנות שהושקו ב-2010
JavaScript