Node.js — платформа з відкритим кодом для виконання високопродуктивних мережевих застосунків, написаних мовою JavaScript. Засновником платформи є Раян Дал (Ryan Dahl). Якщо раніше JavaScript застосовувався для обробки даних в браузері користувача, то node.js надав можливість виконувати JavaScript-скрипти на сервері та відправляти користувачеві результат їхнього виконання. Платформа Node.js перетворила JavaScript на мову загального використання з великою спільнотою розробників.
Тип | Середовище виконання JavaScript |
---|---|
Автор | Раян Дал |
Розробники | Node.js Developers, Joyent, contributors |
Перший випуск | 27 травня 2009 |
Стабільний випуск | 14.8.0 (11 серпня 2020 ) |
Операційна система | 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 |
Node.js у Вікісховищі |
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 року Node.js поєднував у собі JavaScript-рушій Google V8, цикл обробки подій на основі C-бібліотек, і низькорівневий API вводу-виводу.
У січні 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 був створений як відкрита альтернатива управління з окремим технічним комітетом. На відміну від 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 через злиття., нині той домен переадресовує запити на офіційний сайт 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 | 2017-05-30 | Технічне обслуговування | 2017-10-31 | 2019-01-01 | 2019-12-31 |
9.x | 2017-10-01 | Немає LTS | N/A | 2018-06-30 | ||
10.x | Dubnium | 2018-04-24 | Технічне обслуговування | 2018-10-30 | 2020-04-01 | 2021-04-01 |
11.x | 2018-10-23 | Немає LTS | N/A | 2019-06-30 | ||
12.x | Erbium | 2019-04-23 | Активна | 2019-10-22 | 2021-04-01 | 2022-04-01 |
13.x | 2019-10-22 | Немає LTS | N/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); });
Виноски Редагувати
- . Архів оригіналу за 28 квітня 2015. Процитовано 2 August 2014.
- . Архів оригіналу за 18 липня 2020. Процитовано 16 серпня 2020 — через GitHub.
- https://github.com/nodejs/node/blob/master/LICENSE
- . Training.com. Training.com. Архів оригіналу за 1 квітня 2017. Процитовано 23 жовтня 2016.
- . CNET (англ.). Архів оригіналу за 30 грудня 2019. Процитовано 20 квітня 2017.
- Ryan Dahl (9 листопада 2010). . Google Groups. Архів оригіналу за 31 травня 2019. Процитовано 5 лютого 2015.
- . Архів оригіналу за 23 лютого 2017. Процитовано 21 грудня 2016.
- Sams Teach Yourself Node.js in 24 Hours [ 23 березня 2017 у Wayback Machine.], Sams Publishing, 05-Sep-2012
- . Архів оригіналу за 14 травня 2017. Процитовано 11 вересня 2019.
- . Архів оригіналу за 15 травня 2017. Процитовано 11 вересня 2019.
- ↑ Professional Node.js: Building JavaScript Based Scalable Software [ 24 березня 2017 у Wayback Machine.], John Wiley & Sons, 01-Oct-2012
- . GitHub. Архів оригіналу за 1 березня 2017. Процитовано 27 липня 2016.
- . Архів оригіналу за 14 липня 2017. Процитовано 17 квітня 2016.
- Dahl, Ryan. . Архів оригіналу за 31 травня 2019. Процитовано 26 жовтня 2013.
- Schlueter, Isaac (15 січня 2014). . Архів оригіналу за 14 липня 2017. Процитовано 21 січня 2014.
- Krill, Paul (Dec 4, 2014). . JavaWorld. Архів оригіналу за 30 червня 2017. Процитовано Dec 15, 2014.
- Q&A: Why io.js decided to fork Node.js [ 6 листопада 2018 у Wayback Machine.], InfoWorld Tech Watch
- Ben Noordhuis (Nov 12, 2014). . V8 JavaScript Engine Issues. Архів оригіналу за 1 листопада 2015. Процитовано 2 February 2015.
- Mikeal, Rogers (28 січня 2015). . Архів оригіналу за 30 серпня 2015. Процитовано 2 February 2015.
- . Архів оригіналу за 24 червня 2015. Процитовано 4 липня 2015.
- . Архів оригіналу за 7 січня 2017. Процитовано 28 січня 2016.
- . Архів оригіналу за 6 березня 2016. Процитовано 27 червня 2015.
- 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.»
- ↑ Помилка цитування: Неправильний виклик тегу
<ref>
: для виносок під назвоюRelease
не вказано текст - Node 8 reschedule. Процитовано 22 січня 2019.
- . Архів оригіналу за 21 листопада 2018. Процитовано 18 травня 2018.
Посилання Редагувати
- Офіційний сайт [ 10 липня 2020 у Wayback Machine.] (англ.)
- Код на ресурсі GitHub [ 23 червня 2011 у Wayback Machine.] (англ.)
- Офіційна документація [ 19 січня 2012 у Wayback Machine.] (англ.)
- Переклад документації [ 19 травня 2018 у Wayback Machine.] (рос.)