Node.js — платформа звідкритимкодом для виконання високопродуктивних мережевихзастосунків, написаних мовоюJavaScript. Засновником платформи єРаян Дал (Ryan Dahl). Якщо раніше JavaScript застосовувався для обробки даних в браузері користувача, тоnode.js надав можливість виконувати JavaScript-скрипти на сервері та відправляти користувачеві результат їхнього виконання. ПлатформаNode.js перетворила JavaScript на мову загального використання з великою спільнотою розробників.
Node.js був спочатку написанийРаяном Далом у 2009 році[4] приблизно через тринадцять років після появи першого серверного середовищаJavaScript, LiveWire Pro Web відNetscape.[5] Первісний випуск підтримував лишеLinux таMac OS X. Його розробку та обслуговування очолював Дал, а згодом і компаніяJoyent.[6]
Дал розкритикував обмежені можливості найпопулярнішоговебсервера 2009 року,Apache HTTP Server, обробляти безліч одночасних з'єднань (до 10 000 і більше) та найпоширеніший спосіб створення коду (послідовне програмування), коли код або блокував весьпроцес або залучає кілька стеків виконання у разі одночасного з'єднання.[7]
Дал продемонстрував проєкт на першій європейській JSConf8 листопада2009 року[8][9][10] Node.js поєднував у собі JavaScript-рушійGoogle V8, цикл обробки подій на основі C-бібліотек, і низькорівневий API вводу-виводу.[11]
У січні 2010 року для середовища Node.js був введенийменеджер пакетів під назвоюnpm.[12] Менеджер пакетів полегшує програмістам публікацію та обмінсирцевим кодом бібліотек Node.js і призначений для спрощення встановлення, оновлення та видаленнябібліотек.[11]
У червні 2011 рокуMicrosoft та Joyent реалізувалиWindows-версію Node.js.[13] Перше складання Node.js, що підтримує Windows, випущене в липні 2011 року.
У січні 2012 року Дал відійшов у сторону, заохочуючи колегу і творця npm Ісаака Шлютера (Isaac Schlueter) до управління проєктом.[14] У січні 2014 року Шлютер оголосив, що проєкт буде очолювати Тімоті Фонтен (Timothy J. Fontaine).[15]
У грудні 2014 року Федір Індутний, незадоволений надто консервативним циклом оновлень, випустив io.js,форк Node.js. Через внутрішній конфлікт щодо управління Joyent, Io.js був створений як відкрита альтернатива управління з окремим технічним комітетом.[16][17] На відміну від Node.js,[18] автори планували постійно оновлювати io.js з найсвіжішими випусками JavaScript-рушія V8.[19]
У лютому 2015 року було оголошено про намір створити нейтральний фонд Node.js. До червня 2015 року спільноти Node.js та io.js проголосували за спільну роботу в рамкахNode.js Foundation.[20]
У вересні 2015 року Node.js v0.12 та io.js v3.3 були об'єднані разом у Node v4.0.[21] Це об'єднання принесло можливості V8 ES6 в Node.js і довготривалий цикл випуску підтримки.[22] Станом на 2016 рік вебсайт io.js рекомендував розробникам перейти на Node.js і не планувати подальших випусків io.js через злиття.[23], нині той домен переадресовує запити на офіційнийсайт nodejs.org[Архівовано 15 березня 2017 уWayback Machine.].
ПлатформаNode.js призначена для виконання високопродуктивних мережевихзастосунків, написаних мовою програмування JavaScript. Платформа окрім роботи із серверними скриптами длявеб-запитів, також використовується для створення клієнтських та серверних програм.
В платформі використовується розроблений компанієюGoogleрушійV8.
Для забезпечення обробки великої кількості паралельних запитів у Node.js використовується асинхронна модель запуску коду, заснована на обробці подій в неблокуючому режимі та визначенні обробників зворотніх викликів (callback). Як способи мультиплексування з'єднань підтримуєтьсяepoll,kqueue,/dev/poll іselect. Для мультиплексування з'єднань використовуєтьсябібліотекаlibuv, для створення пулунитей (thread pool) задіяна бібліотекаlibeio, для виконанняDNS-запитів у неблокуючому режимі інтегрований c-ares. Всі системні виклики, що спричиняють блокування, виконуються всередині пулу потоків і потім, як і обробники сигналів, передають результат своєї роботи назад через неіменовані канали (pipe).
При цьому управління миттєво перейде до коду який слідує після виклику функції db.query, а результат запиту буде оброблений як тільки будуть оброблені дані. Жодна функція в Node.js не повинна безпосередньо виконувати (блокуючі) операції вводу/виводу — для отримання даних з диска, від іншого процесу або з мережі потрібна установка callback-обробника.
Для розширення функціональності застосунків на базі Node.js підготовлена велика колекція модулів, в якій можна знайти реалізаціюHTTP,SMTP,XMPP,DNS,FTP,IMAP,POP3серверів іклієнтів, модулі для інтеграції з різними вебфреймворками, обробникиWebSocket іAJAX, конектори доСКБД (MySQL,PostgreSQL,SQLite,MongoDB), шаблонізатори,CSS-рушії, реалізації криптоалгоритмів і систем авторизації (наприклад,OAuth),XML-парсери.
Приклад програми, що запускаєвебсервер, виводить в консоль повідомлення, та на коженHTTP запит відповідає повідомленням«Hello World»
varhttp=require('http');// Завантажуємо модуль http// Створюємо web-сервер і вказуємо функцію обробки запитуvarserver=http.createServer(function(req,res){console.log('Початок обробки запиту');// Передаємо код відповіді і заголовкиres.writeHead(200,{'Content-Type':'text/plain; charset=UTF-8'});res.end('Hello world!');});// Запускаємо web-серверserver.listen(1991,"127.0.0.1",function(){console.log('Сервер запущено за адресою http://127.0.0.1:1991/');});
Стандартна поставка node.js включає в себе кількадесят модулів, у яких реалізовані типові операції для взаємодії з операційною системою, файловою системою, мережею і протоколами, утиліти для обробки даних.
Крім того є доступними безліч модулів від незалежних розробників, програмісти можуть отримати їх з відкритих репозиторіїв і використовувати у своїх проектах.
Цей код виведе текст з файлаtest.txt, що знаходиться в тій же теці де й сам js-скрипт. Проте результат буде повернутий в бінарному, не читабельному вигляді. Для цього потрібно виконати перетворення об'єктуdata з бінарного типу на текстовий:
constfs=require("fs");fs.readFile("test.txt",function(err,data){if(err)throwerr;data=String(data);// перетворення типівconsole.log(data);});
↑Io.js, JavaScript I/O[Архівовано 4 жовтня 2016 уWayback Machine.],«io.js has merged with the Node.js project again. There won't be any further io.js releases. All of the features in io.js are available in Node.js v4 and above.»