• בלוג
  • איך לשתף קוד באמצעות חבילות npm

איך לשתף קוד באמצעות חבילות npm

17/12/2020

כולכם כבר יודעים להפעיל npm install כדי להתקין חבילות מהרשת, גם עבור פיתוח Backend ב node.js וגם עבור פיתוח Front End. אבל מה אתם עושים כשצריך לשתף קוד שלכם בין פרויקטים?

מסתבר שאפשר ואפילו קל להשתמש באותם הכלים של npm ובאותן שיטות עבודה שאתם מכירים. זה נראה כך:

1. יצירת ספריית קוד משותפת בתור חבילת npm

צרו תיקיה חדשה, אני קראתי לה my-cool-package ובתוכה כתבו:

$ npm init -y

והופ יש לכם קובץ package.json שמתאר את החבילה שאתם הולכים לשתף. אני אוהב להוסיף לקובץ את השדה type עם הערך module וגם לשנות את סיומת ברירת המחדל ל mjs כדי ש node לא יתלונן כשאני משתמש ב import ו export. כך נראה הקובץ אצלי אחרי השינויים:

{
  "name": "my-cool-package",
  "version": "1.0.0",
  "description": "",
  "main": "index.mjs",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

עכשיו נכתוב את הקוד בקובץ index.mjs. אל תדאגו לא משהו מסובך:

export default function HelloWorld() {
  console.log('Hello World');
}

ולסיום נבנה משני הקבצים חבילה מסודרת. החבילה היא פשוט קובץ עם סיומת tgz שכולל את כל הקוד ואנחנו יוצרים אותו עם הפקודה:

$ npm pack

2. התקנת החבילה מתוך קובץ ה tgz

נמשיך ונפתח תיקיה חדשה במקום אחר על הדיסק, אני קראתי לה הפעם install-from-tarball ובתוכה אני שוב יוצר פרויקט חדש עם npm init -y ושוב מעדכן את package.json כדי שיהיה קל לעבוד בכתיב המודולים. בקיצור הקובץ נראה כך:

{
  "name": "install-from-tarball",
  "version": "1.0.0",
  "description": "",
  "type": "module",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
}

עכשיו אפשר לכתוב את מילת הקסם ולתת ל npm לעבוד. אני משתמש באותו npm install --save שאני מכיר מהתקנה של חבילות מהרשת, רק שהפעם מעביר לו את הנתיב לקובץ ה tgz שיצרנו בסעיף הקודם:

$ npm install --save ../../my-cool-package/my-cool-package.tgz

הפקודה העתיקה את תוכן הקובץ לתוך תיקיית node_modules וגם הוסיפה ל package.json שלי את המפתח:

  "dependencies": {
    "my-cool-package": "file:../../my-cool-package/my-cool-package-1.0.0.tgz"
  }

עכשיו אם יהיה לי קובץ js בתיקיית הפרויקט שלי install-from-tarball הוא יוכל להשתמש בקוד המקורי של my-cool-package באופן הבא:

import helloWorld from 'my-cool-package';

helloWorld();

שימו לב ששינויים בתיקיית החבילה המקורית לא ייקלטו בצורה מיידית. בשביל שהשינויים ישפיעו אני צריך להפעיל מחדש npm pack בתיקיית המקור ואז מחדש npm install בתיקיית הפרויקט.

3. התקנת החבילה דרך ספריה מקומית

אפשרות שניה להתקנה היא חיבור ישיר בין שתי הספריות (בלי קובץ ה tgz) כדי ששינויים בקוד הספריה המקורית ישפיעו מיד על הפרויקטים שמשתמשים בה.

התקנה כזאת היא אפילו יותר פשוטה וכל מה שצריך הוא להפעיל את הפקודה:

$ npm install ../../my-cool-package

מתוך תיקיית הפרויקט שמשתמש בספריה, כלומר מתוך התיקייה install-from-tarball (במקום הפקודה שכתבנו בסעיף הקודם).

פקודה כזאת גורמת ליצירת Symbolic Link בתוך תיקיית node_modules ולכן בעצם נשמר רק עותק אחד של הקוד.

נ.ב. יש גם אפשרות לבצע תהליך דומה עם הפקודה npm link. אישית אני לא משתמש בה כי היא דורשת הרשאות כתיבה על תיקיית המודולים המרכזית של node, ואני מעדיף לעבוד תמיד בתור משתמש מקומי.