מהו Node.js? הסביר זמן הריצה של JavaScript

מדרגיות, חביון ותפוקה הם אינדיקטורים מרכזיים לביצועי שרתי האינטרנט. שמירה על זמן האחזור והתפוקה גבוהה בזמן הגדלה והחוצה אינה קלה. Node.js היא סביבת זמן ריצה של JavaScript שמשיגה חביון נמוך ותפוקה גבוהה על ידי נקיטת גישה "לא חוסמת" לבקשות הגשה. במילים אחרות, Node.js לא מבזבז זמן או משאבים בהמתנה לבקשות קלט / פלט לחזרה.

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

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

Node.js נוקט גישה אחרת. הוא מפעיל לולאת אירועים עם הברגה אחת הרשומה במערכת לטיפול בחיבורים, וכל חיבור חדש גורם להפעלת פונקציית קריאה חוזרת של JavaScript . פונקציית ההתקשרות חוזרת יכולה לטפל בבקשות עם שיחות קלט / פלט שאינן חוסמות, ובמידת הצורך יכולה להשריץ שרשורים מבריכה לביצוע פעולות חסימה או אינטנסיביות מעבד וכדי לאזן עומסים על פני ליבות מעבד. הגישה של צומת בקנה מידה באמצעות פונקציות התקשרות חוזרת דורשת פחות זיכרון כדי להתמודד עם יותר חיבורים מאשר רוב הארכיטקטורות התחרותיות שמתרחבות עם שרשור, כולל שרת ה- HTTP של אפאצ'י, שרתי יישומי Java השונים, IIS ו- ASP.NET ורובי על המסילות.

Node.js מתגלה כשימושי למדי עבור יישומי שולחן עבודה בנוסף לשרתים. שים לב גם כי יישומי צומת אינם מוגבלים ל- JavaScript טהור. אתה יכול להשתמש בכל שפה שעוברת ל- JavaScript, למשל TypeScript ו- CoffeeScript. Node.js משלב את מנוע ה- JavaScript של Chrome Chrome V8, התומך בתחביר ECMAScript 2015 (ES6) ללא צורך במעביר ES6-to-ES5 כגון Babel.

חלק גדול משירות השירות של Node מגיע מספריית החבילות הגדולה שלו, שנגישה באמצעות npmהפקודה. NPM, מנהל החבילות של Node, הוא חלק מהתקנת Node.js הרגילה, אם כי יש לה אתר משלה.

קצת היסטוריית JavaScript

בשנת 1995 ברנדן אייך, אז קבלן נטסקייפ, יצר את שפת ה- JavaScript להפעלה בדפדפני אינטרנט - תוך עשרה ימים, כלשון הסיפור. תחילה נועד JavaScript לאפשר אנימציות ומניפולציות אחרות של מודל אובייקט מסמך הדפדפן (DOM). גרסה של JavaScript לשרת Netscape Enterprise הוצגה זמן קצר לאחר מכן.

השם JavaScript נבחר למטרות שיווק, מכיוון ששפת הג'אווה של סאן זכתה באותה עת לשפע. למעשה, שפת JavaScript התבססה למעשה על שפות Scheme ו- Self, עם סמנטיקה שטחית כמו Java.

בתחילה, מתכנתים רבים ביטלו את JavaScript כחסר תועלת ל"עבודה אמיתית "מכיוון שהמתורגמן שלו העביר סדר גודל לאט יותר משפות מקובלות. זה השתנה כאשר כמה מאמצי מחקר שמטרתם להפוך את JavaScript למהיר יותר החלו לשאת פרי. באופן בולט ביותר, מנוע ה- JavaScript הפתוח של Chrome Chrome V8, שעושה אוסף בדיוק בזמן, הטמעה ואופטימיזציה של קוד דינמי, יכול למעשה לעלות על קוד C + + עבור עומסים מסוימים, ולעלות על פייתון ברוב מקרי השימוש.

פלטפורמת Node.js המבוססת על JavaScript הוצגה בשנת 2009 על ידי ריאן דאהל עבור Linux ו- MacOS, כחלופה מדרגתית יותר לשרת ה- HTTP של אפאצ'י. NPM, שנכתב על ידי יצחק שלוטר, הושק בשנת 2010. גרסת Windows מקורית של Node.js הופיעה לראשונה בשנת 2011.

ג'וינט היה הבעלים של ממשל ותמיכה במאמץ הפיתוח של Node.js במשך שנים רבות. בשנת 2015 הועבר פרויקט Node.js לקרן Node.js והפך לניהול ועדת ההיגוי הטכנית של הקרן. Node.js אומץ גם כפרויקט שיתופי של קרן לינוקס. בשנת 2019 התאגדו קרן Node.js וקרן JS ליצירת קרן OpenJS.

ארכיטקטורת בסיסית של Node.js

ברמה גבוהה, Node.js משלב את מנוע ה- JavaScript V8 של גוגל, לולאת אירועים שאינה חוסמת הברגה אחת ו- API לרמה נמוכה של קלט / פלט. קוד הדוגמה המופשט שמוצג להלן ממחיש את דפוס שרת ה- HTTP הבסיסי, תוך שימוש בפונקציות חץ ES6 (פונקציות Lambda אנונימיות שהוכרזו באמצעות אופרטור החץ השמן, =>) לצורך השיחות החוזרות.

תחילת הקוד טוען את מודול ה- HTTP, מגדיר את hostnameמשתנה השרת ל- localhost(127.0.0.1), ומכוון את portהמשתנה ל- 3000. ואז הוא יוצר שרת ופונקציה להתקשרות חוזרת, במקרה זה פונקציית חץ שומן שתמיד מחזירה אותה תגובה לכל בקשה: statusCode200 (הצלחה), סוג תוכן טקסט רגיל ותגובת טקסט של ”Hello World\n”. לבסוף, הוא אומר לשרת להקשיב localhostליציאה 3000 (דרך שקע) ומגדיר התקשרות חוזרת כדי להדפיס הודעת יומן במסוף כאשר השרת התחיל להאזין. אם אתה מריץ קוד זה במסוף או במסוף באמצעות nodeהפקודה ואז גולש ל- localhost: 3000 באמצעות כל דפדפן אינטרנט באותה מכונה, תראה את "שלום עולם" בדפדפן שלך. כדי לעצור את השרת, לחץ על Control-C בחלון המסוף.

שים לב שכל שיחה המתבצעת בדוגמה זו היא אסינכרונית ולא חוסמת. פונקציות ההתקשרות מופעלות בתגובה לאירועים. createServerההתקשרות מטפלת אירוע בקשת לקוח ומחזירה תשובה. listenהתקשרות מטפל listeningהאירוע.

ספריית Node.js

כפי שניתן לראות בצד שמאל את הדמות שלמטה, ל- Node.js יש מגוון גדול של פונקציונליות בספריה. מודול ה- HTTP בו השתמשנו בקוד הדוגמה קודם מכיל גם מחלקות לקוח וגם שרתים, כפי שניתן לראות בצד ימין של האיור. פונקציונליות שרת HTTPS המשתמשת ב- TLS או SSL חיה במודול נפרד.

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

אתה יכול לתקן את זה, אם כי זה לוקח קצת תכנות נוסף. ראשית, Node.js יכול להוליד תהליכים של ילדים ולתחזק צינורות בין ההורה לילדים, בדומה לאופן שבו popen(3)פועלת שיחת המערכת , child_process.spawn() בשיטות ובשיטות קשורות.

מודול האשכול מעניין אפילו יותר ממודול התהליך הצאצא ליצירת שרתים ניתנים להרחבה. cluster.fork()מולידת שיטת תהליכי העובדים המשתפים יציאות השרת של ההורה, באמצעות child_process.spawn()מתחת לשמיכה. מאסטר האשכול מפיץ חיבורים נכנסים בין עובדיו באמצעות, כברירת מחדל, אלגוריתם סיבוב-רגיש שרגיש לעומסי תהליכי עבודה.

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

המערכת האקולוגית של חבילות Node.js

רישום NPM מארח יותר מ -1.2 מיליון חבילות של קוד Node.js לשימוש חוזר, מה שהופך אותו לרישום התוכנה הגדול בעולם. שים לב שרוב חבילות NPM (בעיקר תיקיות או פריטי רישום NPM המכילים תוכנית המתוארת על ידי קובץ package.json) מכילות מספר מודולים (תוכניות שאתה טוען עם requireהצהרות). קל לבלבל בין שני המונחים, אך בהקשר זה יש להם משמעויות ספציפיות ואין להחליף אותם.

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

אינך צריך להשתמש בשורת הפקודה NPM כדי לגשת לרישום NPM הציבורי. מנהלי חבילות אחרים כמו חוט הפייסבוק מציעים חוויות חלופיות מצד הלקוח. ניתן גם לחפש ולחפש חבילות באמצעות אתר NPM.

מדוע תרצה להשתמש בחבילת NPM? במקרים רבים, התקנת חבילה דרך שורת הפקודה NPM היא המהירה והנוחה ביותר להשיג את הגרסה היציבה האחרונה של מודול הפועלת בסביבתך, והיא בדרך כלל פחות עבודה משכפול מאגר המקורות ובניית התקנה מהמאגר. אם אינך מעוניין בגירסה העדכנית ביותר תוכל לציין מספר גרסה ל- NPM, דבר שימושי במיוחד כאשר חבילה אחת תלויה בחבילה אחרת ועשויה להישבר עם גרסה חדשה יותר של התלות.

לדוגמה, מסגרת אקספרס, מסגרת יישומי אינטרנט מינימאלית וגמישה של Node.js, מספקת קבוצה חזקה של תכונות לבניית יישומי אינטרנט בודדים ורב-עמודים והיברידיים. בעוד שמאגר ה- Expresscode שניתן לשכפל בקלות נמצא בכתובת //github.com/expressjs/express ותיעוד האקספרס נמצא בכתובת //expressjs.com/, דרך מהירה להתחיל להשתמש ב- Express היא להתקין אותו בפיתוח עבודה מקומי שכבר יזם. מדריך עם npmהפקודה, למשל:

$ npm התקן אקספרס - שמור

—saveהאפשרות, שהוא למעשה כברירת מחדל ב NPM 5.0 ומאוחר יותר, אומר מנהל החבילות להוסיף את מודול אקספרס לרשימת תלות בקובץ package.json לאחר ההתקנה.

דרך מהירה נוספת להתחיל להשתמש באקספרס היא להתקין את מחולל ההפעלה express(1) ברחבי העולם ואז להשתמש בו ליצירת היישום באופן מקומי בתיקיית עבודה חדשה:

$ npm התקן -g express-generator @ 4

$ express / tmp / foo && cd / tmp / foo

עם זאת, אתה יכול להשתמש ב- NPM כדי להתקין את כל התלות הדרושה ולהפעיל את השרת, על בסיס התוכן של קובץ package.json שנוצר על ידי הגנרטור:

התקן $ npm

התחלה של $ npm

קשה לבחור דגשים מתוך מיליון החבילות פלוס ב- NPM, אך כמה קטגוריות בולטות. אקספרס היא הדוגמה הוותיקה והבולטת ביותר למסגרות Node.js. קטגוריה גדולה נוספת במאגר NPM היא כלי פיתוח JavaScript, כולל browserify, מקבץ מודולים; bower, מנהל חבילות הדפדפן; grunt, רץ המשימות של JavaScript; ו- gulp, מערכת הזרמת הבניין. לסיום, קטגוריה חשובה עבור מפתחי Node.js ארגוניים היא לקוחות מסדי נתונים, שמתוכם יש יותר מ -8,000, כולל מודולים פופולריים כגון redis, mongoose, firebase ו- pg, לקוח PostgreSQL.

לסיכום, Node.js היא סביבת זמן ריצה של JavaScript בין פלטפורמות לשרתים ויישומים. הוא בנוי על לולאת אירועים עם הברגה אחת ולא חוסמת, מנוע ה- JavaScript V8 של גוגל כרום וממשק API של קלט / פלט ברמה נמוכה. טכניקות שונות, כולל מודול האשכול, מאפשרות לאפליקציות Node.js להתמקד מעבר לליבת מעבד אחת. מעבר לפונקציונליות המרכזית שלה, Node.js נתן השראה למערכת אקולוגית של יותר ממיליון חבילות הרשומות ומותקנות במאגר NPM וניתן להתקין אותן באמצעות שורת הפקודה NPM או אלטרנטיבה כגון Yarn.