nvm – לעבוד עם מגוון סביבות של Node.js

מה שהכי יפה בעולם הפיתוח (ובכלל בכל מקצוע) הוא שיש מגדלי ידע שצריך להכיר. כדי לעבוד עם npm למשל, צריך להכיר CLI, כדי להכיר CLI צריך לדעת איך לעבוד עם טרמינל וכדי לעבוד עם טרמינל צריך להכיר טוב חלונות או לינוקס. זה גם מה שמפריד בין מתכנת צעיר יותר למתכנת מנוסה יותר – הידע שכביכול הוא ידע לא רלוונטי משמש כבסיס חשוב ללימוד או הבנה של טכנולוגיה מסוימת.

התחלתי לכתוב כמה מאמרים על npm פרטי שניתן להתקין על רספברי פיי והוא דרך נהדרת לעבוד מקומית עם מודולים של Node.js שאנו לא רוצים להוציא החוצה. בחברות אנו משתמשים במוצר של npm שנקרא private packages או במוצרים רבים וטובים אחרים (אני משתמש בארטיפקטורי של jfrog למשל). אבל בפיתוח ביתי או קטן, שרת יעודי המשמש npm פרטי הוא מאוד שימושי.

במהלך הכתיבה כתבתי על nvm והתכוונתי לקשר למאמר עליו, אך שוד ושבר – גיליתי שלא כתבתי על כך דבר למרות שאני משתמש ב-nvm רוב הזמן. אז הנה – זו הזדמנות למרות שמדובר בידע די טריוויאלי למפתחי Node.js.

הבעיה ש-nvm פותר

כשאנו מתקינים Node.js על המחשב (ולא משנה אם מדובר בחלונות, לינוקס או מק), אנו מתקינים גרסה מסוימת. ל-Node.js יש גרסאות וגם ל-npm שאחראית על תפעול המודולים ולגרסאות יש תכונות ושינויים בין גרסה לגרסה. כך למשל Promise.any שנכנסה לג'אווהסקריפט לאחרונה נתמכת רק ב-Node.js מגרסה 15. אפשר לראות את כל הפיצ'רים שנתמכים בצורה מסודרת באתר node.green.

למה זה חשוב? כי לא מעט פעמים אנו כותבים סקריפט שעובד יפה בסביבה מקומית אבל כשאנו עושים לו דיפלוי לסביבה אחרת – בין אם מחשב של מפתח אחר או בין אם סביבה מרוחקת – דברים עלולים להשבר. ולא, פתרון של "תמיד תעדכן לגרסה החדשה ביותר" לא תמיד אפשרי וגם עלול להיות בעייתי כיוון שיש פיצ'רים שמשנים התנהגות בין גרסה לגרסה ולא תמיד גם הסביבה המרוחקת קלה לשינוי.

על מנת להוסיף על החגיגה – אם אתם עובדים מול כמה סביבות שחלק מהן משתמשות בגרסאות אחרות – צריך לשנות גרסאות כמה פעמים. אם אני כותב סקריפט שאמור לעבוד ב-Node.js V16, אני צריך לשנות את הסביבה שלי לכזו. אבל אם יש לי סביבה אחרת שאני נדרש לכתוב לה סקריפט והיא דווקא עובדת ב Node.js V14 אז אני צריך לשנות את הסביבה שלי לכזו. וזה מקשה על החיים.

הפתרון? nvm, המאפשר שינוי פשוט וקל של גרסאות Node.js על כל מחשב ועל מערכות הפעלה מסוג מק ולינוקס וכן על חלונות עם gitbash,cygwin או WSL.

התקנה

איך מתקינים? פשוט מאוד. אני ממליץ להסיר את Node.js מהמחשב שלכם קודם, למרות שזו לא חובה. ואז לעקוב אחר ההוראות המאוד פשוטות בריפו של nvm. בגדול זה פשוט להקליד:

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash

ואז לסגור את הטרמינל ולפתוח אותו שוב. אם נקליד nvm -v נראה שאנו מקבלים גרסה. סימן שהכל עובד. אבל אם נקליד node או npm נגלה שלא מקבלים דבר. למה? כי אנו צריכים להורות ל nvm איזו גרסה להתקין ולהשתמש.

שימוש ראשוני

אנו יכולים להתקין עם nvm כמה גרסאות שאנו רוצים ולבחור בכל פעם בקלות להשתמש במה שבא לנו. בואו ונדגים. נניח שאני רוצה להתקין את גרסה 14 שהיא ה-LTS העדכני של Node.js (למי שלא יודע, ראשי התבות של LTS זה Long Term Support. גרסה שנתמכת לטווח ארוך). אני אקליד:

nvm install 14

ומה שיקרה הוא שהגרסה האחרונה של ה-LTS תותקן לי. במקרה הזה גרסה 14.17.3. ואני אוכל להשתמש בה.

אני יכול להתקין גרסה נוספת. למשל ה-LTS הקודם שהוא 12. אז אני אקליד:

nvm install 12

ואני אעבור להשתמש בה.

אחרי שהגרסאות הותקנו, אפשר לעבור ממש בקלות בינהן עם nvm use. למשל אם אני נמצא בגרסה של Node.js V12 ורוצה לעבור ל-14? אז זה עם:

nvm use v14

איך אני יודע מה הגרסה שאני נמצא בה? עם node -v כרגיל. או הקלדה של nvm ls שמראה את כל הגרסאות שמותקנות והגרסה שמופעלת.

אם רוצים להתקין את ה-latest (הגרסה החדשה ביותר שקיימת ל Node.js) – לא צריך לברר מה המספר שלו. ה-alias של הגרסה החדשה היא node אז כדי להתקין אותה כותבים:

nvm install node

וכדי להשתמש בה כותבים

nvm use node
כלי סטנדרטי ושימושי להפליא לפיתוח Node.js שמאפשר לכל מפתח לעבור גרסת Node.js ממש בקלות

גרסת ברירת מחדל

אם סוגרים את הטרמינל או המחשב ופותחים אותו שוב, הגרסה שתופעל היא הגרסה האחרונה שהשתמשנו בה. כדי לקבוע גרסת ברירת מחדל – כזו שתופעל מייד בכל טרמינל אנו נקליד:

nvm alias default node

או כל גרסה של Node.js שאנו רוצים במקום ה-latest. למשל:

nvm alias default 14

התקנת גרסאות גרנולרית

אם אנו מקלידים רק מספר מייג'ור של גרסה כמו בכל הדוגמאות שהראיתי פה – כמו למשל 14 או 12 – nvm תתקין אוטומטית את הגרסאות החדשות ביותר של המיינור וה-patch. אבל אני יכול לכתוב גם minor. למשל:

nvm install 12.1
nvm use 12.1

ואז ה-patch האחרון יותקן. או לכתוב גרסה מלאה ממש.

הרצה ישירה לפי גרסה

לא חייבים לעבור בין גרסאות בטרמינל. ניתן להריץ ישירות עם כל גרסה מותקנת. למשל:

nvm exec 14 MYSCRIPT

כל מה שיש אחרי הגרסה ירוץ כ-Node.js מהגרסה שציינו. וזה ממש שימושי במיוחד בסקריפטים ישנים. הנה דוגמה ממש נאה:

לסיכום

nvm הפכה לסטנדרט בה"א הידיעה למפתחי Node.js. ויש לה לא מעט פיצ'רים נוספים – למרות שאת העיקריים והשימושיים ביותר סקרתי כאן. באמת זה כלי נהדר להתקנה ולעבודה – בין אם מדובר במחשב הלוקלי או בסביבת פיתוח או בסביבת CI. אם לא הכרתם – אז באמת כדאי להכיר. בחלונות זה טיפה יותר מסובך – אבל אם אתם משתמשים ב-WSL או בנגזרותיו אז חווית השימוש לא תהיה שונה מהותית מלינוקס או ממק.

פוסטים נוספים שכדאי לקרוא

פייתון

קבצי קונפיגורציה בפואטרי

הגדרות שמשנות את ההתנהגות של פואטרי באמצעות קבצי הגדרות גלובליים, לוקליים ואפילו משתני סביבה.

פתרונות ומאמרים על פיתוח אינטרנט

יישום של nonce על מנת להגן מפני התקפות injection

בפוסט הקודם הסברתי על hash עם CSP על משאבי inline – שזה נחמד ומעולה אבל פחות ישים בעולם האמיתי שבו בדרך כלל התוכן ה-inline (בין

גלילה לראש העמוד