Node.js — платформа з відкритим кодом для виконання високопродуктивних мережевих застосунків, написаних мовою JavaScript. Засновником платформи є Раян Дал (Ryan Dahl). Якщо раніше JavaScript застосовувалась лише для обробки даних в браузері користувача, то node.js надав можливість виконувати JavaScript-скрипти на сервері та відправляти користувачеві результат їхнього виконання. Платформа Node.js перетворила JavaScript на мову загального використання, з великою спільнотою розробників.
Node.js має наступні властивості: асинхронна однониткова модель виконання запитів; неблокуючий ввід/вивід; система модулів CommonJS; рушій JavaScript Google V8;
Для керування модулями використовується пакетний менеджер npm (node package manager).
Історія
Node.js був спочатку написаний Раяном Далом у 2009 році приблизно через тринадцять років після появи першого серверного середовища JavaScript, LiveWire Pro Web від Netscape. Первісний випуск підтримував лише Linux та Mac OS X. Його розробку та обслуговування очолював Дал, а згодом і компанія Joyent.
Дал розкритикував обмежені можливості найпопулярнішого вебсервера 2009 року, Apache HTTP Server, обробляти безліч одночасних з'єднань (до 10 000 і більше) та найпоширеніший спосіб створення коду (послідовне програмування), коли код або блокує весь процес або залучає кілька стеків виконання у разі одночасного з'єднання.
Дал продемонстрував проєкт на першій європейській JSConf 8 листопада 2009 рокуSams Teach Yourself Node.js in 24 Hours , Sams Publishing, 05-Sep-2012 Node.js поєднував у собі JavaScript-рушій Google V8, цикл обробки подій на основі C-бібліотек, і низькорівневий API вводу-виводу.Professional Node.js: Building JavaScript Based Scalable Software , John Wiley & Sons, 01-Oct-2012
У січні 2010 року для середовища Node.js був введений менеджер пакетів під назвою npm. Менеджер пакетів полегшує програмістам публікацію та обмін сирцевим кодом бібліотек Node.js і призначений для спрощення встановлення, оновлення та видалення бібліотек.
У червні 2011 року Microsoft та Joyent реалізували Windows-версію Node.js. Перше складання Node.js, що підтримує Windows, випущене в липні 2011 року.
У січні 2012 року Дал відійшов у сторону, заохочуючи колегу і творця npm Ісаака Шлютера (Isaac Schlueter) до управління проєктом. У січні 2014 року Шлютер оголосив, що проєкт буде очолювати Тімоті Фонтен (Timothy J. Fontaine).
У грудні 2014 року Федір Індутний, незадоволений надто консервативним циклом оновлень, випустив io.js, форк Node.js. Через внутрішній конфлікт щодо управління Joyent, Io.js був створений як відкрита альтернатива управління з окремим технічним комітетом. Q&A: Why io.js decided to fork Node.js , InfoWorld Tech Watch На відміну від Node.js, автори планували постійно оновлювати io.js з найсвіжішими випусками JavaScript-рушія V8.
У лютому 2015 року було оголошено про намір створити нейтральний фонд Node.js. До червня 2015 року спільноти Node.js та io.js проголосували за спільну роботу в рамках Node.js Foundation.
У вересні 2015 року Node.js v0.12 та io.js v3.3 були об'єднані разом у Node v4.0. Це об'єднання принесло можливості V8 ES6 в Node.js і довготривалий цикл випуску підтримки. Станом на 2016 рік вебсайт io.js рекомендував розробникам перейти на Node.js і не планувати подальших випусків io.js через злиття.Io.js, JavaScript I/O , «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.» Зараз цей домен переадресовує запити на офіційний сайт nodejs.org.
Огляд Платформа Node.js призначена для виконання високопродуктивних мережевих застосунків, написаних мовою програмування JavaScript. Платформа, окрім роботи із серверними скриптами для веб-запитів, також використовується для створення клієнтських та серверних програм.
В платформі використовується розроблений компанією Google рушій V8.
Для забезпечення обробки великої кількості паралельних запитів, у Node.js використовується асинхронна модель запуску коду, заснована на обробці подій в неблокуючому режимі та визначенні обробників зворотніх викликів (callback). Як способи мультиплексування з'єднань підтримується epoll, kqueue, /dev/poll і select. Для мультиплексування з'єднань використовується бібліотека libuv, для створення пулу нитей (thread pool) задіяна бібліотека libeio, для виконання DNS-запитів у неблокуючому режимі інтегрований c-ares. Всі системні виклики, що спричиняють блокування, виконуються всередині пулу потоків і потім, як і обробники сигналів, передають результат своєї роботи назад через неіменовані канали (pipe).
За своєю суттю Node.js схожий на фреймворки Perl AnyEvent, Ruby Event Machine і Python Twisted, але цикл обробки подій (event loop) у Node.js прихований від розробника і нагадує обробку подій у веб застосунку, що працює в браузері. При написанні програм для Node.js необхідно враховувати специфіку подієво-орієнтованого програмування, наприклад, замість виконання var result = db.query ("select .. "); з очікуванням завершення роботи і наступною обробкою результатів, в Node.js використовується принцип асинхронного виконання, тобто код трансформується в db.query ("select .. ", function (result) { /* обробка результату */ }); При цьому управління миттєво перейде до коду який слідує після виклику функції 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»
var http = require('http'); // Завантажуємо модуль http
// Створюємо web-сервер і вказуємо функцію обробки запиту var server = 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/'); });
Версії
ВипускКодове ім'яДата випускуСтатус LTSАктивний запуск LTSПочаток технічного обслуговування Кінець обслуговування 8.x Carbon 2017-05-30 2017-10-31 2019-01-01 2019-12-31 9.x 2017-10-01 Немає LTSN/A 2018-06-30 10.x Dubnium 2018-04-24 2018-10-30 2020-04-01 2021-04-01 11.x 2018-10-23 Немає LTSN/A 2019-06-30 12.x Erbium 2019-04-23 2019-10-22 2021-04-01 2022-04-01 13.x 2019-10-22 Немає LTSN/A Червень 2020 14.x Квітень 2020 Жовтень 2020 Квітень 2022 Квітень 2023
Модулі Стандартна поставка Node.js включає в себе кількадесят модулів, у яких реалізовані типові операції для взаємодії з операційною системою, файловою системою, мережею і протоколами, утиліти для обробки даних.
Крім того є доступними безліч модулів від незалежних розробників, програмісти можуть отримати їх з відкритих репозиторіїв і використовувати у своїх проектах.
FileSystem Одним з широко використовуваних стандартних модулів є FileSystem, який є вбудованим та містить операції роботи з файлами. const fs = require("fs"); fs.readFile("test.txt", function(err, data) { if (err) throw err; console.log(data); }); Цей код виведе текст з файла test.txt, що знаходиться в тій же теці де й сам js-скрипт. Проте результат буде повернутий в бінарному, не читабельному вигляді. Для того, щоб отримати вивід в текстовому форматі, потрібно виконати перетворення об'єкту data з бінарного типу на текстовий: const fs = require("fs"); fs.readFile("test.txt",function(err,data) { if (err) throw err; data = String(data); // перетворення типів console.log(data); });
Див. також Deno
Виноски
Посилання Офіційний сайт Код на ресурсі GitHub Офіційна документація