Node.js

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
Node.js
Node.js logo.svg
Тип JavaScript фреймворк
Автор(и) Раян Дал
Розробник Node.js Developers, Joyent, contributors
Перший випуск 27 травня 2009; 3514 днів тому[1]
Стабільний випуск 8.0.0 & 6.10.3(LTS) (30 травня 2017; 589 днів тому[2] & 4 квітня 2017; 645 днів тому[3])
Версії 11.6.0 (26 грудня 2018)[4]
Репозиторій github.com/nodejs/node
Операційна система Mac OS X, Linux, Solaris, FreeBSD, OpenBSD, Windows, webOS, NonStop OS
Написано на C, C++, JavaScript
Доступні мови JavaScript
Стан розробки активний
Ліцензія MIT License
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 призначена для виконання високопродуктивних мережевих додатків, написаних мовою програмування 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('Cервер запущено за адресою http://127.0.0.1:1991/');
});

Версії[ред. | ред. код]

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

Випущена 26 квітня 2016 року. Основними відмінностями від попередніх версій стали поліпшена стабільність та пришвидшення завантаження модулів (в 4 рази в порівнянні з 4.0). Версія 6.0 стала наступною версією, після 4.0, з тривалою підтримкою (англ. Long-time support, LTS). Ця версія побудована на основі нової версії рушія V8 — версії 5.0 з поліпшеною підтримкою стандарту ECMAScript 2015 (ECMA-262, ES6)[5].

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

Реліз 25-го жовтня 2016 року. Саме з цієї версії з використанням параметру --harmony стає можливим використовувати конструкції async/await, які, насправді, є «синтаксичним цукром» до промісів.

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

Випущена 30-го травня 2017 року під керівництвом Джеймса М Снелла та Коліна Ігріга. У цій версії можна помітити значні покращення продуктивності та взаємодії з API, що стосуються розробників. Забезпечена сумісність ABI з V8 5.9 та майбутнім V8 6.0. Зміна консолі, що привела до зменшення помилок при роботі з консольними проектами. Добавлено статичні коди помилок для всіх помилок згенерованих Node.js[джерело?].

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

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

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

 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;
   String(data); // перетворення типів
   console.log(data);
  });

Примітки[ред. | ред. код]

  1. node-v0.x-archive on GitHub. Процитовано 2 August 2014. 
  2. Node.js Changelog. Процитовано 2017-03-30. 
  3. Node.js Changelog. Процитовано 2017-04-04. 
  4. Release 11.6.0 — 2018.
  5. Christina Mulligan (27 квітня 2016). Node.js version 6 released - SD Times. SD Times. https://www.facebook.com/SDTimesBZ. Процитовано 27 квітня 2016. 
  6. Модуль FileSystem

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