Node.js
![]() | |
Тип | Середовище виконанняJavaScript |
---|---|
Автор | Раян Дал |
Розробники | Node.js Developers,Joyent,contributors |
Перший випуск | 27 травня2009[1] |
Стабільний випуск | 14.8.0 (11 серпня2020[2]) |
Операційна система | Mac OS X,Linux,Solaris,FreeBSD,OpenBSD,Windows,webOS,NonStop OS |
Мова програмування | C,C++,JavaScript |
Доступні мови | JavaScript |
Стан розробки | активний |
Ліцензія | MIT License |
Онлайн-документація | nodejs.org/en/docs |
Репозиторій | github /nodejs/node |
Вебсайт | nodejs.org |
Node.js— платформа звідкритимкодомдля виконання високопродуктивних мережевихзастосунків,написаних мовоюJavaScript.Засновником платформи єРаян Дал(Ryan Dahl). Якщо раніше JavaScript застосовувався для обробки даних в браузері користувача, тоnode.jsнадав можливість виконувати JavaScript-скрипти на сервері та відправляти користувачеві результат їхнього виконання. ПлатформаNode.jsперетворила JavaScript на мову загального використання з великою спільнотою розробників.
Node.jsмає наступні властивості:
- асинхроннаоднонитковамодель виконання запитів;
- неблокуючий ввід/вивід;
- система модулівCommonJS;
- рушій JavaScriptGoogle V8;
Для керування модулями використовується пакетний менеджерnpm(node package manager).
![](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b2/Ryan_Dahl.jpg/220px-Ryan_Dahl.jpg)
Node.js був спочатку написанийРаяном Далому 2009 році[4]приблизно через тринадцять років після появи першого серверного середовищаJavaScript,LiveWire Pro Web відNetscape.[5]Первісний випуск підтримував лишеLinuxтаMac OS X.Його розробку та обслуговування очолював Дал, а згодом і компаніяJoyent.[6]
Дал розкритикував обмежені можливості найпопулярнішоговебсервера2009 року,Apache HTTP Server,обробляти безліч одночасних з'єднань (до 10 000 і більше) та найпоширеніший спосіб створення коду (послідовне програмування), коли код або блокував весьпроцесабо залучає кілька стеків виконання у разі одночасного з'єднання.[7]
Дал продемонстрував проєкт на першій європейській JSConf8 листопада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 схожий на фреймворкиPerlAnyEvent,RubyEvent MachineіPythonTwisted,але цикл обробки подій (event loop) у Node.js прихований від розробника і нагадує обробку подій увеб застосунку,що працює вбраузері.При написанні програм для Node.js необхідно враховувати специфікуподієво-орієнтованого програмування,наприклад, замість виконання
varresult=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»
varhttp=require('http');// Завантажуємо модуль http
// Створюємо web-сервер і вказуємо функцію обробки запиту
varserver=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 | Технічне обслуговування | 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 | Технічне обслуговування | 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 | Активна | 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[26],який є вбудованим та містить операції роботи з файлами.
constfs=require("fs");
fs.readFile("test.txt",function(err,data){
if(err)throwerr;
console.log(data);
});
Цей код виведе текст з файлаtest.txt
,що знаходиться в тій же теці де й сам js-скрипт. Проте результат буде повернутий в бінарному, не читабельному вигляді. Для цього потрібно виконати перетворення об'єктуdata
з бінарного типу на текстовий:
constfs=require("fs");
fs.readFile("test.txt",function(err,data){
if(err)throwerr;
data=String(data);// перетворення типів
console.log(data);
});
- ↑node-v0.x-archive on GitHub.Архіворигіналуза 28 квітня 2015.Процитовано 2 August 2014.
- ↑Node.js 14 ChangeLog.Архіворигіналуза 18 липня 2020.Процитовано 16 серпня 2020— черезGitHub.
- ↑https://github /nodejs/node/blob/master/LICENSE
- ↑About Node.js, and why you should add Node.js to your skill set?.Training.Training. Архіворигіналуза 1 квітня 2017.Процитовано 23 жовтня 2016.
- ↑Netscape opens intranet attack.CNET(англ.).Архіворигіналуза 30 грудня 2019.Процитовано 20 квітня 2017.
- ↑Ryan Dahl (9 листопада 2010).Joyent and Node.Google Groups. Архіворигіналуза 31 травня 2019.Процитовано 5 лютого 2015.
- ↑PHP 7 vs Node.js? They Can Be Partners, Not Competitors For a Developer!.Архіворигіналуза 23 лютого 2017.Процитовано 21 December 2016.
- ↑Sams Teach Yourself Node.js in 24 Hours[Архівовано23 березня 2017 уWayback Machine.],Sams Publishing, 05-Sep-2012
- ↑Ryan Dahl at JSConf EU 2009.Архіворигіналуза 14 травня 2017.Процитовано 11 вересня 2019.
- ↑Ryan Dahl at JSConf EU 2009 Video.Архіворигіналуза 15 травня 2017.Процитовано 11 вересня 2019.
- ↑абProfessional Node.js: Building JavaScript Based Scalable Software[Архівовано24 березня 2017 уWayback Machine.],John Wiley & Sons, 01-Oct-2012
- ↑Earliest releases of npm.GitHub.Архіворигіналуза 1 березня 2017.Процитовано 27 липня 2016.
- ↑Porting Node to Windows With Microsoft's Help.Архіворигіналуза 14 липня 2017.Процитовано 17 April 2016.
- ↑Dahl, Ryan.New gatekeeper.Архіворигіналуза 31 травня 2019.Процитовано 26 жовтня 2013.
- ↑Schlueter, Isaac (15 січня 2014).The Next Phase of Node.js.Архіворигіналуза 14 липня 2017.Процитовано 21 січня 2014.
- ↑Krill, Paul (Dec 4, 2014).Why io.js Decided to Fork Node.js.JavaWorld. Архіворигіналуза 30 червня 2017.Процитовано Dec 15, 2014.
- ↑Q&A: Why io.js decided to fork Node.js[Архівовано6 листопада 2018 уWayback Machine.],InfoWorldTech Watch
- ↑Ben Noordhuis (Nov 12, 2014).Issue 3692: function suddenly becomes undefined.V8 JavaScript Engine Issues. Архіворигіналуза 1 листопада 2015.Процитовано 2 February 2015.
- ↑Mikeal, Rogers (28 січня 2015).State of io.js.Архіворигіналуза 30 серпня 2015.Процитовано 2 February 2015.
- ↑Node.js Foundation Advances Community Collaboration, Announces New Members and Ratified Technical Governance.Архіворигіналуза 24 June 2015.Процитовано 4 липня 2015.
- ↑Node.js Foundation Combines Node.js and io.js Into Single Codebase in New Release.Архіворигіналуза 7 січня 2017.Процитовано 28 січня 2016.
- ↑io.js and Node.js merge.Архіворигіналуза 6 березня 2016.Процитовано 27 June 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.»
- ↑абвnodejs/Release.GitHub(англ.).Процитовано 3 травня 2018.
- ↑Node 8 reschedule.Процитовано 22 January 2019.
- ↑Модуль FileSystem.Архіворигіналуза 21 листопада 2018.Процитовано 18 травня 2018.
- Офіційний сайт[Архівовано10 липня 2020 уWayback Machine.](англ.)
- Код на ресурсі GitHub[Архівовано23 червня 2011 уWayback Machine.](англ.)
- Офіційна документація[Архівовано19 січня 2012 уWayback Machine.](англ.)
- Переклад документації[Архівовано19 травня 2018 уWayback Machine.](рос.)