Node.js

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
Node.js
Тип Середовище виконання JavaScript
Автор Раян Дал
Розробники Node.js Developers, Joyent, contributors
Перший випуск 27 травня 2009; 14 років тому (2009-05-27)[1]
Стабільний випуск 14.8.0 (11 серпня 2020; 3 роки тому (2020-08-11)[2])
Операційна система Mac OS X, Linux, Solaris, FreeBSD, OpenBSD, Windows, webOS, NonStop OS
Мова програмування C, C++, JavaScript
Доступні мови JavaScript
Стан розробки активний
Ліцензія MIT License
Онлайн-документація nodejs.org/en/docs
Репозиторій github.com/nodejs/node
Вебсайт nodejs.org

CMNS: Node.js у Вікісховищі

Node.js — платформа з відкритим кодом для виконання високопродуктивних мережевих застосунків, написаних мовою JavaScript. Засновником платформи є Раян Дал (Ryan Dahl). Якщо раніше JavaScript застосовувався для обробки даних в браузері користувача, то node.js надав можливість виконувати JavaScript-скрипти на сервері та відправляти користувачеві результат їхнього виконання. Платформа Node.js перетворила JavaScript на мову загального використання з великою спільнотою розробників.

Node.js має наступні властивості:

Для керування модулями використовується пакетний менеджер npm (node package manager).

Історія[ред. | ред. код]

Раян Дал, творець Node.js, у 2010

Node.js був спочатку написаний Раяном Далом у 2009 році[4] приблизно через тринадцять років після появи першого серверного середовища JavaScript, LiveWire Pro Web від Netscape.[5] Первісний випуск підтримував лише Linux та Mac OS X. Його розробку та обслуговування очолював Дал, а згодом і компанія Joyent.[6]

Дал розкритикував обмежені можливості найпопулярнішого вебсервера 2009 року, Apache HTTP Server, обробляти безліч одночасних з'єднань (до 10 000 і більше) та найпоширеніший спосіб створення коду (послідовне програмування), коли код або блокував весь процес або залучає кілька стеків виконання у разі одночасного з'єднання.[7]

Дал продемонстрував проєкт на першій європейській JSConf 8 листопада 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).

За своєю суттю 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[24] 2017-05-30 Older version, yet still supported: Технічне обслуговування 2017-10-31 2019-01-01[25] 2019-12-31
9.x 2017-10-01 Немає LTS N/A 2018-06-30
10.x Dubnium[24] 2018-04-24 Older version, yet still supported: Технічне обслуговування 2018-10-30 2020-04-01 2021-04-01
11.x 2018-10-23 Немає LTS N/A 2019-06-30
12.x Erbium[24] 2019-04-23 Current stable version: Активна 2019-10-22 2021-04-01 2022-04-01
13.x 2019-10-22 Немає LTS N/A Червень 2020
14.x Квітень 2020 Future release: Очікує Жовтень 2020 Квітень 2022 Квітень 2023

Модулі[ред. | ред. код]

Стандартна поставка node.js включає в себе кількадесят модулів, у яких реалізовані типові операції для взаємодії з операційною системою, файловою системою, мережею і протоколами, утиліти для обробки даних.

Крім того є доступними безліч модулів від незалежних розробників, програмісти можуть отримати їх з відкритих репозиторіїв і використовувати у своїх проектах.

FileSystem[ред. | ред. код]

Одним з широко використовуваних стандартних модулів є FileSystem[26], який є вбудованим та містить операції роботи з файлами.

 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);
  });

Виноски[ред. | ред. код]

  1. node-v0.x-archive on GitHub. Архів оригіналу за 28 квітня 2015. Процитовано 2 August 2014. 
  2. Node.js 14 ChangeLog. Архів оригіналу за 18 липня 2020. Процитовано 16 серпня 2020 — через GitHub. 
  3. https://github.com/nodejs/node/blob/master/LICENSE
  4. About Node.js, and why you should add Node.js to your skill set?. Training.com. Training.com. Архів оригіналу за 1 квітня 2017. Процитовано 23 жовтня 2016. 
  5. Netscape opens intranet attack. CNET (англ.). Архів оригіналу за 30 грудня 2019. Процитовано 20 квітня 2017. 
  6. Ryan Dahl (9 листопада 2010). Joyent and Node. Google Groups. Архів оригіналу за 31 травня 2019. Процитовано 5 лютого 2015. 
  7. PHP 7 vs Node.js? They Can Be Partners, Not Competitors For a Developer!. Архів оригіналу за 23 лютого 2017. Процитовано 21 December 2016. 
  8. Sams Teach Yourself Node.js in 24 Hours [Архівовано 23 березня 2017 у Wayback Machine.], Sams Publishing, 05-Sep-2012
  9. Ryan Dahl at JSConf EU 2009. Архів оригіналу за 14 травня 2017. Процитовано 11 вересня 2019. 
  10. Ryan Dahl at JSConf EU 2009 Video. Архів оригіналу за 15 травня 2017. Процитовано 11 вересня 2019. 
  11. а б Professional Node.js: Building JavaScript Based Scalable Software [Архівовано 24 березня 2017 у Wayback Machine.], John Wiley & Sons, 01-Oct-2012
  12. Earliest releases of npm. GitHub. Архів оригіналу за 1 березня 2017. Процитовано 27 липня 2016. 
  13. Porting Node to Windows With Microsoft's Help. Архів оригіналу за 14 липня 2017. Процитовано 17 April 2016. 
  14. Dahl, Ryan. New gatekeeper. Архів оригіналу за 31 травня 2019. Процитовано 26 жовтня 2013. 
  15. Schlueter, Isaac (15 січня 2014). The Next Phase of Node.js. Архів оригіналу за 14 липня 2017. Процитовано 21 січня 2014. 
  16. Krill, Paul (Dec 4, 2014). Why io.js Decided to Fork Node.js. JavaWorld. Архів оригіналу за 30 червня 2017. Процитовано Dec 15, 2014. 
  17. Q&A: Why io.js decided to fork Node.js [Архівовано 6 листопада 2018 у Wayback Machine.], InfoWorld Tech Watch
  18. Ben Noordhuis (Nov 12, 2014). Issue 3692: function suddenly becomes undefined. V8 JavaScript Engine Issues. Архів оригіналу за 1 листопада 2015. Процитовано 2 February 2015. 
  19. Mikeal, Rogers (28 січня 2015). State of io.js. Архів оригіналу за 30 серпня 2015. Процитовано 2 February 2015. 
  20. Node.js Foundation Advances Community Collaboration, Announces New Members and Ratified Technical Governance. Архів оригіналу за 24 June 2015. Процитовано 4 липня 2015. 
  21. Node.js Foundation Combines Node.js and io.js Into Single Codebase in New Release. Архів оригіналу за 7 січня 2017. Процитовано 28 січня 2016. 
  22. io.js and Node.js merge. Архів оригіналу за 6 березня 2016. Процитовано 27 June 2015. 
  23. 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.»
  24. а б в nodejs/Release. GitHub (англ.). Процитовано 3 травня 2018. 
  25. Node 8 reschedule. Процитовано 22 January 2019. 
  26. Модуль FileSystem. Архів оригіналу за 21 листопада 2018. Процитовано 18 травня 2018. 

Посилання[ред. | ред. код]