**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 לניהול נתונים זמינים לציבור.

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

ויקישיתוף מדיה וקבצים בנושא **Npm** בוויקישיתוף
* אתר האינטרנט הרשמי של Npm

הערות שוליים
------------

1. ↑  "Initial drop. Ugly, sketchy, and not even yet quite a "work in progr… · npm/cli@4626dfa". *GitHub*.
2. ↑  Schlueter, Isaac Z. (25 במרץ 2013). "Forget CommonJS. It's dead. \*\*We are server side JavaScript.\*\*". *GitHub*. `{{cite web}}`:  (עזרה)
3. ↑  Clarke, Darcy (12 בפברואר 2021). "npm - a JavaScript package manager". *GitHub*. npm. נבדק ב-5 באוקטובר 2021. `{{cite web}}`:  (עזרה)
4. ↑  "NPM - a JavaScript package manager". *GitHub*. 12 בפברואר 2022. `{{cite web}}`:  (עזרה)
5. ↑  "NPM is a nice JavaScript package manager · NPM/Cli@cbb890e". *GitHub*.
6. ↑  Dierx, Peter (30 במרץ 2016). "A Beginner's Guide to npm – the Node Package Manager". *sitepoint*. נבדק ב-22 ביולי 2016. `{{cite web}}`:  (עזרה)
7. ↑  Ampersand.js. "Ampersand.js – Learn". *ampersandjs.com*. נבדק ב-22 ביולי 2016. `{{cite web}}`:  (עזרה)
8. ↑  Nassri, Ahmad (14 באפריל 2020). "So long, and thanks for all the packages!". *The npm Blog*. נבדק ב-2021-01-06. `{{cite web}}`:  (עזרה)תחזוקה - ציטוט: url-status (link)
9. ↑  Ojamaa, Andres; Duuna, Karl (2012). "Assessing the Security of Node.js Platform". *2012 International Conference for Internet Technology and Secured Transactions*. IEEE. ISBN 978-1-4673-5325-0. נבדק ב-22 ביולי 2016. `{{cite book}}`:  (עזרה)
10. ↑  "npm Code of Conduct: acceptable package content". נבדק ב-9 במאי 2017. `{{cite web}}`:  (עזרה)
11. ↑  Vorbach, Paul. "npm-stat: download statistics for NPM packages". *npm-stat.com*.
12. ↑  Ellingwood, Justin. "How To Use npm to Manage Node.js Packages on a Linux Server". *DigitalOcean*. נבדק ב-22 באוקטובר 2016. `{{cite web}}`:  (עזרה)
13. ↑  "npm-install". *docs.npmjs*. נבדק ב-22 באוקטובר 2016. `{{cite web}}`:  (עזרה)
14. ↑  "semver". *docs.npmjs*. נבדק ב-22 באוקטובר 2016. `{{cite web}}`:  (עזרה)
15. ↑  "Hello, Yarn!". *The npm Blog*. 11 באוקטובר 2016. נבדק ב-17 בדצמבר 2016. `{{cite web}}`:  (עזרה)
16. ↑  Katz, Yehuda (11 באוקטובר 2016). "Why I'm working on Yarn". נבדק ב-17 בדצמבר 2016. `{{cite web}}`:  (עזרה)
17. ↑  "registry | npm Docs". *docs.npmjs.com*. נבדק ב-2021-05-10.