Перейти до вмісту

Node.js

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

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 серпня 2014.
  2. ↑ Release 2024-08-22, Version 22.7.0 (Current), @RafaelGSS · nodejs/node. GitHub (англ.). Процитовано 11 вересня 2024.
  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. [Архівовано 2017-04-01 у Wayback Machine.]
  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 грудня 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 квітня 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. [Архівовано 2017-06-30 у Wayback Machine.]
  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 лютого 2015.
  19. ↑ Mikeal, Rogers (28 січня 2015). State of io.js. Архів оригіналу за 30 серпня 2015. Процитовано 2 лютого 2015.
  20. ↑ Node.js Foundation Advances Community Collaboration, Announces New Members and Ratified Technical Governance. Архів оригіналу за 24 червня 2015. Процитовано 4 липня 2015. [Архівовано 2015-06-24 у Wayback Machine.]
  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 червня 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 січня 2019.
  26. ↑ Модуль FileSystem. Архів оригіналу за 21 листопада 2018. Процитовано 18 травня 2018.

Посилання

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