רקע
בקומה העשרים של גורד שחקים בסן פרנסיסקו יושבת קבוצה של מתכנתים ועובדת על טכנולוגיית פיתוח חדשה שתשנה, ככל הנראה, את הדרך בה כותבים אפליקציות זמן אמת (real-time) בעולם ה – web ואת הדרך בה אפליקציות אלו מתאימות עצמן לעידן ענן המחשוב בהן הן צריכות להתרחב ולגדול בהתאם לצורך.
לטכנולוגיה זו קוראים node.js והיא נחשבת בעיני רבים בקהילת המפתחים ל- "Ruby on Rails" החדש.
פיתוח node.js החל בשנת 2009 ע"י ראיין דל (Ryan Dahl) שהועסק כמהנדס בחברת Joyent מסאן פרנסיסקו, העוסקת בפתרונות מחשוב ענן ווירטואליזציה.
מטרת פרוייקט node.js כפי שנוסחה על ידי היוצר:
To provide a purely evented, non-blocking infrastructure to script highly concurrent programs
אם כי בראיון שבוצע איתו לאחרונה ציין ראיין דל כי למעשה הוא החל את פרוייקט ה node.js על מנת למצוא דרך טובה לעדכן את המשתמש על סטאטוס העלאה של קובץ לרשת.
מטרתו המקורית של הפרויקט הייתה ליצור אתרים המאפשרים "יכולות דחיפת מידע" (קונספט בו יוזמת הפנייה מגיעה מהצד המספק את המידע – server ולא מהצד המבקש – client).
דבר המאפשר למשתמש לקבל מידע חדש מהשרת ללא צורך בביצוע פעולות בעצמו. לדוגמא הודעה על מבצע חדש, על מייל חדש, על מבזק חדשות וכד'.
הפרוייקט מפותח אמנם כקוד פתוח, אך בפועל חברת Joyent היא המממנת העיקרית של הפרוייקט ע"י העסקת עובדים ואירוח אירועים מקצועיים בקרב קהיליית המפתחים.
node.js הפך לאחרונה לאחד מה Buzzword הנפוצים ביותר כיום, בעולם הפיתוח ל – web.
מהות הטכנולוגיה
node.js הוא ערכת כלים בקוד פתוח לפיתוח אפליקציות צד שרת ב- java script.
הבחירה ב java script (להלן js) נעשתה דווקא מכיוון של- js לא היה קיים באותה העת ממשק קלט פלט (I/O API), ודבר זה אפשר הגדרת קונבנציה (convention) חדשה של ממשק קלט פלט מבוסס אירועים. מתוך מטרה לאפשר המשך הרצת התוכנית ללא צורך בהמתנה לפעולות הקלט / פלט שיסתיימו.
ארכיטקטורה
בבסיס הארכיטקטורה נמצא "מנוע תוכנה" בשם V8 [הערה 1], מעליו עטיפה של node.js למימוש פרוטוקולים שונים כגון socket-ים ו http (ב- C++). ולמעלה הספרייה הסטנדרטית של node.js(ב- java script).
בשכבת ה – java script ניתן לגשת רק לתהליך (thread) הראשי, בעוד משכבות הבסיס ניתן לגשת למספר תהליכים (threads).
המימוש בפועל של מנגנון ה Asynchronous I/O ממומש ע"י יצירת מספר תהליכים שונים בשכבת ה-C.
איור 1 : ארכיטקטורה של שרת node.js
[1]מנוע קומפילציה הכתוב בשפת C++.
המנוע יודע לקמפל קוד java script לשפת מכונה ולהריצו.
המנוע נמצא בשימוש ע"י חברת גוגל בדפדפן כרום.
10 הדיברות לאורן מפותחת הטכנולוגיה:
-
תמיכה מובנית בפרוטוקולים החשובים (דוגמת: DNS, HTTP, TLS)
-
להזרים הכל (Streaming), לעולם לא לחצוץ מידע (buffering) –המידע כל הזמן זורם הלאה ולא נאגר בחוצצים על מנת להישלח בשלב מאוחר יותר.
-
אי תלות בפלטפורמה
-
שמירה על רישיון קוד פתוח "פשוט"
-
תלויות מועטות – אין צורך בספריות חיצוניות רבות על מנת להריץ את אפליקציה הכתובה ב node.js
-
קישור סטאטי –בזמן הקומפילציה מתבצע קישור לכל הקוד שאיננו חלק מן התשתית והוא הופך להיות חלק מקובץ הריצה.
-
אף פונקציה אינה אמורה לבצע פעולות קלט/פלט ישירות אלא דרך תהליך Callback על מנת לאפשר המשך ריצת התוכנית ללא המתנה לסיום פעולות הקלט/פלט (ראה הרחבה בהמשך).
-
לא להסיר פונקציונליות מהשכבה שמתחת (שכבת ה POSIX-portable Operating System Interface) –השכבה שמאפשרת ביצוע פעולות בצורה זהה על גרסאות שונות של יוניקס.
-
תמיכה בתכונות ויכולות של HTML כגון:
-
קידוד בחלקים (Chunked encoding)
-
הודעות מקושרות (Pipelined messages) – טכניקה בה השרת יכול לקבל מספר בקשות באמצעות חיבור TCP יחיד, ללא צורך בהחזרת תשובה בסדר בו התקבלו הבקשות.
-
תמיכה באפליקציות המשתמשות במודל COMET , בהן המידע מועבר מהשרת למשתמש בדחיפה, ללא בקשה ישירה.
-
-
ה – API צריך להיות מוכר למפתחי java script בצד הלקוח. וכן למשתמשי unix.
הדיבר ה-11 עליו מקפידים במימוש הינו לאפשר מוצר שהינו כיף לפיתוח 🙂 .
פיתוח מונחה אירועי קלט / פלט
node.js עובד בצורה של אירועי קלט/פלט ( Evented I/O או Asynchronous I/O). מה שמאפשר ריצה יעילה יותר של התוכניות. לדוג' בעת המתנה לסיום פעולת I/O ניתן לבצע פעולות אחרות. בשפות שרת אחרות בד"כ מממשים פעולה זו באמצעות הוספת listener-ים שאינם מאפשרים המשך ריצת התוכנית תוך כדי המתנה.
פיתוח מונחה אירועי קלט/פלט משמעותו (בצורה מופשטת) שבתוך הלולאה המרכזית של האפליקציה ישנם שני חלקים: גילוי אירוע וטיפול באירוע.
ברגע שמתגלה אירוע, האפליקציה מתחילה לטפל בו. במקביל, הלולאה של גילוי האירועים ממשיכה לעבוד ויכולה לגלות אירוע חדש ולהתחיל לטפל גם בו. אין המתנה לסיום של חלק מסויים לפני שהמערכת ממשיכה לרוץ. לדוגמא, אם נבקש קובץ מסוים, המערכת תשלח בקשה להביא את אותו הקובץ (fetch) ותמשיך לרוץ הלאה. ברגע שהקובץ יחזור היא תטפל בו.
ניתן לראות את ההבדלים בשיטות הפעולה של Synchronous I/O ו-A-Synchronous I/O, בתרשים הבא:
בחלק העליון, המתאר פעולת קלט / פלט סינכרונית, בזמן T1-T2 (הציר האמצעי מייצג את הזמן) כל מה שהמערכת עושה, הינו טיפול בקלט / פלט, ולא קורה שום דבר אחר במקביל.
בחלק התחתון המתאר פעולת קלט / פלט אסינכרונית, ניתן לראות שהמערכת ביקשה לבצע פעולת קלט / פלט שרצה בתהליך נפרד, ובתהליך הראשי המערכת ממשיכה לרוץ (אין קיטוע בקו העליון שמייצג את התהליך הראשי).
איור 2: קלט / פלט סינכורני (למעלה) לעומת קלט / פלט אסינכרוני
נמחיש זאת בדוגמת הקוד הבאה:
שני קטעי הקוד הבאים, אחד ב PHP ואחד ב js עבור node.js, מבצעים אותה פעולה שבבסיסה קריאה מקובץ sample.txt (שורה 3 בקטע ה PHP ושורות 3,4 בקטע הקוד ב node.js). בקובץ רשומה השורה – “sample txt file”.
ניתן לראות שברגע שמריצים את קטע הקוד ב js, השורה שאחרי קריאת הקובץ (שורה 7) נכתבת לפני תוכן הקובץ.
הסיבה היא שכאשר מבצעים פעולת I/O ב- js התוכנית ממשיכה לרוץ בינתיים. וזו הסיבה שפלט התוכניות (מופיע במסגרת Output) שונה.
איור 3 : קטע קוד ב PHP לעומת node.js
1: <?php
2: echo "Starting\n";
3: $contents = 4.file_get_contents("sample.txt");
4: echo "contents of file: " . $contents;
5: echo "Finished.
6: ?>
Output: Starting contents of file: sample txt file Finished |
1: var fs = require("fs");
2: console.log("Starting");
3: fs.readFile("sample.txt", function(error, 4.data) {
4: console.log("contents of file: " + data);
5: });
6: console.log("Finished")
Output: Starting Finished contents of file: sample txt file |
יתרונות
השימוש ב- node.js טומן בחובו מספר יתרונות מרכזיים:
-
ביצועים גבוהים עקב העבודה עם js ושיטת הפיתוח מונחית אירועי קלט/פלט.
-
שפה אחידה (js) בצד הלקוח ובצד השרת, מה שמאפשר שימוש חוזר בקוד שנכתב בצד הלקוח גם עבור צד השרת ולהפך. הדבר חוסך כתיבת קוד מיותר, וחוסך צורך בכ"א ייחודי עבור כתיבת החלקים השונים מאחר ואין צורך להכיר מספר שפות. כמו כן הדבר מאפשר עבודה בצוות אינטגרטיבי יותר שמכיר את שני צדי האפליקציה.
-
פיתוח מונחה אירועי קלט/פלט מאפשר ביצוע פעולות במקביל כך שהביצועים משתפרים וצריכת המשאבים קטנה. ניתן לבצע פעולות במקביל ללא צורך בהיכרות מיוחדת בעבודה עם Thread-ים.
-
בשפות פיתוח מסורתיות התקשורת הפנימית בין שרת האפליקציה לבסיס הנתונים הינו צוואר הבקבוק של האפליקציות. node.js מאפשר טביעת רגל נמוכה על שרת האפליקציה על יד כך שהוא מקצה משאבים על פי צורך במקום להקצות כמות גדולה של משאבים מראש.
לדוגמה במקומות בהן אפאצ'י עשוי להקצות mb8 זיכרון עבור משתמש, node.js עשוי להקצות kb8 בלבד.
node.js מאפשר זאת ע"י כך שהוא לא מקצה משאבים בזמן ההמתנה. בזמן שהשרת מחכה לתשובה מבסיס הנתונים הוא ממשיך בביצוע פעולות אחרות ורק כאשר בסיס הנתונים מגיב השרת מקצה משאבים לעיבוד התשובה. דבר זה מאפשר עיבוד מספר רב יותר של בקשות במקביל. -
Java script הינה שפה פופולרית ונפוצה מאוד. מה שמאפשר למצוא מפתחים אשר מכירים את הטכנולוגיה בקלות.
-
Java script הינה שפה יעילה בעבודה עם Json-ים (סטנדרט לייצוג נתונים) ודבר זה מאפשר כתיבת API בקלות, במהירות ובצורה טבעית.
-
יכולות להתרחבות למספר משתמשים גדול בקלות (scalable).
חסרונות
-
הטכנולוגיה צעירה יחסית, מה שמשפיע בכמה מישורים :
-
קהילה מצומצמת יחסית – מקשה על קבלת תמיכה כשיש בעיות.
-
קורות לימוד איכותיים מצומצמים.
-
מיעוט תשתיות אפליקטיביות על בסיס הטכנולוגיה
-
-
פיתוח בשיטה מונחית אירועי קלט/פלט מחייב למידה והתנסות.
- Node.js רץ באמצעות process (תהליך) אחד ו thread (תהליכון) אחד, מה שמקשה על ההתרחבות שלו (scalable)יות עבור שרתים מרובי ליבות.
-
פיתוח צד שרת ופיתוח צד לקוח בשפה זהה – זהו אמנם יתרון אך גם חיסרון מכיוון שלרוב האתגרים איתם מתמודדים בצד השרת ובצד הלקוח הנם שונים, ולעיתים דווקא נדרשות מתודולוגיות וטכנולוגיות פיתוח אחרות.
לסיכום, ניתן לראות כי הטכנולוגיה החדשה מתאימה, בינתיים לפחות, ליישומים ספציפיים. בנספח א' תוכלו לבחון האם היא מתאימה עבור היישום שלכם.
התקדמות / בשלות הפרויקט
כאשר גוף הולך לבחור טכנולוגיה, בכלל, ובפרט טכנולוגיית פיתוח אחד הפרמטרים המרכזיים הוא בשלות הפרוייקט והאופן בו הוא מתפתח. ככל שישנם יותר משתמשים, קהילה טובה יותר, תורמים (בעיקר קוד) לפרוייקט וכד', סימן שהוא כנראה טוב, ויציב.
אחד המדדים המעידים על בשלות טכנולוגיית קוד פתוח כדוגמת node.js הוא מס' פעולות ה – commit המתבצעות בסביבת הפיתוח.
הגרפים הבאים, המתארים זאת מעידים כי הפרויקט מתפתח באופן שוטף ונמצא בשימוש גבוה, מה שמעיד על קהילה גדולה ופעילה ועל פרויקט דינאמי המתפתח בהתאם לשינויים בשוק ולבעיות שהתגלו.
איור 4 : מספר פעולות ה-Commit בפרויקט node.js – החלק העליון בירוק מייצג את כל תקופת הפרויקט והתחתון בכתום את השנה האחרונה.
סיכום
node.js הפך לפופולרי במיוחד בשנת 2010, ומאז תופס פופולריות כמעט כמו Ruby On Rails (טכנולוגיית פיתוח web נוספת). נראה כי מכיוון שה- framework נכתב על בסיס שפת java script הנפוצה, חסמי הכניסה אליו נמוכים, והמוטיבציה לשימוש בו עבור אפליקציות real time / near real time הינה גבוהה.
נראה שעד עתה קיימת התלהבות בקרב קהילת משתמשי הטכנולוגיה. שורשי ה- frameworks ב- java script פונים גם למפתחי ומעצבי תוכנה שזה עתה נכנסו לעולם ה-web וכן למפתחים מנוסים המחפשים דרך טובה יותר לפתח אפליקציות real time.
חכמה נפוצה בקרב מפתחים רבים היא שאין דרך אחת נכונה לבנות אפליקציית web, אך נראה כי node.js הולך ונתפש כפתרון הטוב ביותר עבור סוג מסוים של אפליקציות.
חברה מוכרת המשתמשת ב-node.js היא הרשת החברתית-מקצועית – Linkedin. המהנדס הראשי של החברה, מר קירן פרסד (Kiran Prasad) צוטט לאחרונה:
"בצד השרת התוכנה שלנו בגרסת המובייל, מבוססת לגמרי על node. סיבה ראשונה היא סקלביליות (scalability) והשנייה היא ש node.js הראה לנו יתרונות ביצועים ענקיים".
נספח א': האם node.js מתאים לאפליקציה שלי?
מתי להשתמש?
-
אפליקציות near real time – כגון מסרים מידיים, צ'טים, רשתות חברתיות. הביצועים ש node.js מאפשר נותנים לו יתרון משמעותי במימוש אפליקציות מסוג זה, אך יש להיזהר מכיוון ש java script היא שפה דינאמית כך שזמני התגובה עלולים להיות מושפעים מזמני ריצת ה garbage collection.
לכן עבור אפליקציות real time אמיתיות יש לבחון לעומק את הפתרון המיטבי. -
Json API – אם אתה בסך הכל רוצה "לעטוף" מקור נתונים, ולספק אליו גישה באמצעות Json API, node.js עשוי לספק פיתרון אולטימטיבי, בשל היכולת שלו לעבוד בתצורה של non-blocking I/O יחד עם העוצמה של java script בטיפול ב – json.
-
אפליקציות של עמוד web אחד (Single Page App)– אם אתה בונה אפליקציה שמבצעת הרבה פעולות AJAX מול השרת ומבצעת עיבוד בצד הלקוח, node.js יכול להיות אידיאלי בזכות האפשרות שלו לעבד הרבה בקשות במקביל עם זמני תגובה קצרים. ניתן לציין כי גם היכולת שלו להשתמש בקוד זהה (כגון בדיקות תקינות) בצד השרת ובצד הלקוח תומכת בפיתוח אפליקציות מסוג זה.
-
אפליקציות לעטיפת פקודות command line – היכולת של node.js ליצור תהליכי בן רבים ולהתייחס לפלט שלהם "כזרם של מידע", הופך אותו לאידיאלי ליצירת מעטפת יפה ונוחה יותר עבור פקודות command line קיימות.
-
הזרמת מידע – אפליקציות מסורתיות בד"כ מתייחסות לבקשות http כאל אירועים אטומיים, אך בפועל הם אינם כאלה. היכולת של node.js להתייחס לבקשות http כאל אירועים אטומיים עשויה להביא לשיפור ניכר בתוצאות. לדוגמא בעת עיבוד קובץ בזמן העלאה או גישור בין שכבות מידע שונות.
מתי לא להשתמש?
-
אפליקציות עיבוד. אם האפליקציה שלך נועדה לעשות בעיקר עיבוד, עם מעט פעולות קלט פלט אין סיבה טובה להשתמש ב node.js. לדוג': אפליקציות לטיפול (רינדור) בוידאו ואפליקציות העושות שימוש בבינה מלאכותית.
-
אפליקציות CRUD עם HTML – אם האפליקציה שלך בעיקר מבצעת פעולות מול בסיס נתונים, ומציגה את הנתונים בעזרת HTML. בשלב זה אין ל node.js יתרון משמעותי על פני טכנולוגיות אחרות כגון Rails או PHP בשטח זה וזאת בשל העובדה כי אין עדיין תשתיות אפליקטיביות מתקדמות על בסיס node.
-
שימוש ב node.js יחד עם בסיס נתונים לא רלציוני – אם האפליקציה שלך נראית כמו ספר בישול של מושגי noSQL DB אולי כדאי שתשקול שוב האם לערבב זאת יחד עם node. כוונתי היא כי שימוש במספר טכנולוגיות שאינך מכיר מספיק טוב, עשויה להוות סיכון משמעותי לפרוייקט…
נספח ב': Node.js vs PHP מבחן עומסים
בניסוי הבא בוצעה השוואה בין Node.js לבין PHP עם Apache2 ו – mod_php. ההשוואה בוצעה כך, כיוון שזוהי הארכיטקטורה הנפוצה ביותר בשימוש ב- PHP. יש שיגידו (ייתכן שבצדק) שניתן לקבל ביצועים טובים יותר על ידי שימוש ב Nginx or Lighthttpd כשרת HTTP עבור PHP. בסופו של דבר PHP בצד השרת רץ בתהליכים רבים ונפרדים, ואין זה משנה מה המכניקה שיצרה אותם (mod_php או fastcgi או מכניקה אחרת). לכן לשם ההשוואה ניצמד לארכיטקטורה הנפוצה.
סביבת הניסוי
לצורך הניסוי נכתבה אפליקציה פשוטה ב – java script וב – php5. האפליקציה שולפת 50 שורות מ – wordpress ומייצאת את המידע החוצה בצורת json וזהו. הסיבה לכך שהאפליקציה פשוטה היא כיוון שאנו לא רוצים להיכנס להבדלי מימוש בין השפות, וכן שהמטרה העיקרית היא להשוות את הארכיטקטורה בין השניים ולא את איכות הקוד.
חומרה:
שרת וירטואלי בעל המפרט הבא:
-
1 x Core Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz
-
2 Gb RAM.
-
OS is 64 Bit Ubuntu 12.10 installed fresh before running these tests.
-
We installed the Load Impact Server metric agent.
תוכנה:
-
Apache/2.2.22 and
-
PHP 5.4.6.
-
Node.js version 0.8.18 (built using this script)
-
MySQL is version 5.5.29.
קטעי הקוד שרצו:
1: // Include http module,
2: var http = require('http'),
3: mysql = require("mysql");
4:
5: // Create the connection.
6: // Data is default to new mysql installation and should be changed according to your configuration.
7: var connection = mysql.createConnection({
8: user: "wp",
9: password: "****",
10: database: "random"
11: });
12:
13: // Create the http server.
14: http.createServer(function (request, response) {
15: // Attach listener on end event.
16: request.on('end', function () {
17:
18: // Query the database.
19: connection.query('SELECT * FROM wp_options limit 50;', function (error, rows, fields) {
20: response.writeHead(200, {
21: 'Content-Type': 'text/html'
22: });
23: // Send data as JSON string.
24: // Rows variable holds the result of the query.
25: response.end(JSON.stringify(rows));
26: });
27: });
28: // Listen on the 8080 port.
29: }).listen(8080);
1: <?php
2: $db = new PDO('mysql:host=localhost;dbname=*****', 'wp', '*****');
3: $all= $db--->query('SELECT * FROM wp_options limit 50;')->fetchAll();
4: echo json_encode($all);
5: ?>
אופן הניסוי:
- הניסוי כלל דימוי של משתמשים בדפדפן
- הגידול במשתמשים היה מ – 0-500 משתמשים בפרק זמן של 5 דקות.
- כל הבקשות הגיעו ממקום אחד גיאוגרפית.
תוצאות:
מקרא:
- קו אדום – מייצג את ה CPU של השרת
- קו ירוק – מייצג את מספר המשתמשים
- קו כחול – מייצג את זמני התגובה
איור 5 : תוצאות הניסוי ב node.js |
איור 6 : תוצאות הניסוי ב PHP |
בגרפים ניתן לראות שב node.js זמן התגובה יציב לאורך כל הניסוי ועומד בערך על 200 מילי שניות, בעוד ב PHP בנקודה מסוימת (בערך ב- 400 משתמשים) הוא התחיל לעלות בקצב גבוה עד שחצה את קו ה – 400 מילי שניות.
הסיבה להבדלים:
כאשר האפאצ'י טוען את עמוד ה PHP הוא משאיר זאת לתהליך בן שיטפל בבקשה. תהליך הבן יכול לטפל רק בבקשה אחת בו זמנית ולכן אם יש יותר מאחת האחרות צריכות לחכות. בשרת עליו בוצע הניסוי הוגדר באפאצ'י פרמטר של MaxClients להיות 256 (במקום 150 שמוגדר כברירת מחדל). כלומר יכולים להיווצר 256 תהליכי בן. ניתן להגדיל את ערך הפרמטר, אך זה עלול להוביל לבעיות זיכרון (RAM) ולכן צריך למצוא את האיזון בין מספר הבקשות שמטופלות במקביל לבין כמות הזיכרון של השרת .
ב node.js כל בקשה בפני עצמה, מהירה בערך ב – 30% יותר מאשר ב PHP. לכן בקונפיגורציה בסיסית זו node אכן מהיר יותר. בנוסף ב node הכל רץ בתהליך אחד על השרת. ולכן אין צורך בתקשורת בין התהליכים השונים, ובין תהליכי הבן לתהליך האב (כפי שצריך ב PHP). בנוסף node יעיל יותר מבחינת צריכת זיכרון. PHP דורש overhead עבור מספר גבוה יותר של בקשות במקביל, בעוד node משתף את מרבית הזיכרון שלו בין הבקשות.
בנוסף חשוב לשים לב, שבשני המקרים צריכת ה CPU לא היוותה גורם משמעותי (פחות מ – 5% בשני המקרים), כלומר ניסוי זה בא לבדוק בעיקר את ההבדלים בין הארכיטקטורות.
אם node.js כל כך טוב….
Node.js מביא עמו גם אתגרים, הן מבחינה טכנית והן מבחינה תרבותית.
מהבחינה הטכנית – בניסוי זה נעשה שימוש בשרת בעל ליבה אחת, דבר שמשחק לטובתו של node. כיוון ש node רץ על השרת באמצעות תהליך אחד, ובו thread אחד, הדבר מקשה על גדילתו בצורה אידיאלית בשרתים מרובי ליבות.
מהבחינה התרבותית – מכיוון ש node עדיין צעיר יחסית ולא ממש נפוץ, עליך להיות מוכן לממש הרבה יותר קוד בעצמך, לחקור יותר, ולפתור את הבעיות שלך בעצמך.
כמובן שבחיים האמתיים, ישנן טכניקות לצמצום הפערים שראינו כאן, הן מבחינת ה- PHP והן מבחינת היכולת של node לביצועים משופרים על מעבדים מרובי ליבות.
מקורות:
-
אתר אינטרנט ישראל – http://www.internet-israel.com/ – אתר המוקדש לפיתוח WEB
-
TutsPlus – An Introduction to node.js – http://tutolearning.com/tutsplus-an-introduction-to-node-js/
-
http://nodejs.org– האתר הרשמי של הפרוייקט
-
http://mashable.com/2011/03/10/node-js/– פורטל חדשות / כתבות
-
מצגת של ראיין דל (יוצר הפרוייקט) – http://nodejs.org/cinco_de_node.pdf
-
http://nodeguide.com/convincing_the_boss.html– מדריך (לא רשמי) לשימוש ב node.js
-
http://stackoverflow.com/ – אתר שאלות ותשובות בנושאי פיתוח
-
http://clipboard.com/clip/LQY8YknhoHfI_m8mT-vZryQEDVI_A4P6kVye – אתר לשיתוף מידע
-
http://www.quora.com– אתר לשיתוף מידע
-
youtube – Ryan Dahl – History of node.js
-
http://elegantcode.com– אתר בלוגים למפתחים ואנשי טכנולוגיה