מה שהכי יפה בעולם הפיתוח (ובכלל בכל מקצוע) הוא שיש מגדלי ידע שצריך להכיר. כדי לעבוד עם 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
גרסת ברירת מחדל
אם סוגרים את הטרמינל או המחשב ופותחים אותו שוב, הגרסה שתופעל היא הגרסה האחרונה שהשתמשנו בה. כדי לקבוע גרסת ברירת מחדל – כזו שתופעל מייד בכל טרמינל אנו נקליד:
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 או בנגזרותיו אז חווית השימוש לא תהיה שונה מהותית מלינוקס או ממק.
3 תגובות
וכמובן, שאתה יכול לראות את כל גרסאות ה – node המותקנות אצלך, על ידי nvm ls
ואף מילה על fnm, ההמצאה הישראלית הכי טובה מאז עגבניות השרי?
https://github.com/Schniz/fnm
מה לגבי .nvm (דוט nvm) בריפו ? חשוב מאוד
בנוסף כדאי להוסיף את Node engine בpackage.json