Edit on GitHub

Про Node.js®

Як асинхронне подієве JavaScript–оточення, Node спроектований для побудови масштабованих мережевих додатків. У нижче наведений приклад "hello world", який може одночасно обробляти багато з’єднань. Для кожного з’єднання викликається функція зворотнього виклику, проте коли з’єднань немає Node засинає.

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

Це контрастує з більш загальною моделлю в якій використовуються паралельні OS потоки. Такий підхід є відносно неефективним та дуже важким у використанні. Більше того, користувачі Node можуть не турбуватись про блокування процесів, оскільки немає жодних блокувань. Майже жодна з функцій у Node не працює напряму з I/O, тому процес не блокується ніколи. Оскільки нічого не блокується на Node легко розробляти масштабовані системи.

Якщо щось у цьому підході є незрозумілим для вас, то можете переглянути повну статтю Blocking vs Non-Blocking.


Node створений під впливом таких систем як Event Machine в Ruby або Twisted в Python. Node використовує подієву модель значно ширше, він приймає [цикл подій (event loop)][] за основу оточення, замість того, щоб використовувати його в якості бібліотеки. В інших системах завжди стається блокування виклику, щоб запустити цикл подій.

Зазвичай поведінка визначається через функції зворотнього виклику на початку скрипта і в кінці запускає сервер через блокуючий виклик, як от EventMachine::run(). В Node немає нічого подібного на виклик початку циклу подій. Node просто входить в подієвий цикл після запуску скрипта на виконання. Node виходить з подієвого циклу тоді, коли не залишається зареєстрованих функцій зворотнього виклику. Така поведінка схожа на поведінку браузерного JavaScript: подієвий цикл прихований від користувача.

HTTP є об'єктом першого роду в Node, розробленим з потоковістю та малою затримкою. Це робить Node хорошою основою для веб–бібліотеки або фреймворку.

Те що Node спроектований без багатопоточності, не означає, що ви не можете використовувати можливості кількох ядер у вашому середовищі. Ви можете створювати дочірні процеси, якими легко керувати з допомогою API child_process.fork(). Модуль cluster побудований на цьому інтерфейсі і дозволяє вам ділитись сокетами між процесами та розподіляти навантаження між ядрами.

Вгору