Node.js - это среда выполнения JavaScript. Звучит здорово, но что это значит? Как это работает?

Среда выполнения Node включает в себя все необходимое для выполнения программы, написанной на JavaScript.

Node.js появился, когда оригинальные разработчики JavaScript расширили его с того, что вы могли запускать только в браузере, до того, что вы могли запускать на своей машине как отдельное приложение.

Теперь с помощью JavaScript вы можете делать гораздо больше, чем просто делать сайты интерактивными.

Теперь у JavaScript есть возможность делать то, что могут делать другие языки сценариев, такие как Python.

И JavaScript вашего браузера, и Node.js работают на движке времени выполнения JavaScript V8. Этот движок берет ваш код JavaScript и преобразует его в более быстрый машинный код. Машинный код - это низкоуровневый код, который компьютер может запускать без предварительной его интерпретации.

Почему Node.js?

Вот формальное определение, данное на официальном веб-сайте Node.js:

Node.js® - это среда выполнения JavaScript, построенная на движке JavaScript V8 Chrome.

Node.js использует управляемую событиями неблокирующую модель ввода-вывода, что делает его легким и эффективным.

Экосистема пакетов Node.js, npm, является крупнейшей в мире экосистемой библиотек с открытым исходным кодом.

Мы уже обсуждали первую строку этого определения: «Node.js® - это среда выполнения JavaScript, построенная на движке JavaScript V8 Chrome». Теперь давайте разберемся с двумя другими строками, чтобы понять, почему Node.js так популярен.

I / O относится к вводу / выводу. Это может быть что угодно, от чтения / записи локальных файлов до выполнения HTTP-запроса к API.

Ввод-вывод требует времени и, следовательно, блокирует другие функции.

Рассмотрим сценарий, в котором мы запрашиваем у серверной базы данных подробную информацию о пользователях user1 и user2, а затем выводим их на экран / консоль. Ответ на этот запрос требует времени, но оба запроса данных пользователя могут выполняться независимо и одновременно.

Блокировка ввода / вывода

В методе блокировки запрос данных пользователя user2 не инициируется до тех пор, пока данные пользователя user1 не будут напечатаны на экране.

Если бы это был веб-сервер, нам пришлось бы запускать новый поток для каждого нового пользователя. Но JavaScript является однопоточным (не совсем, но у него есть однопоточный цикл обработки событий, о котором мы поговорим чуть позже). Таким образом, это сделало бы JavaScript не очень подходящим для многопоточных задач.

Вот тут-то и пригодится неблокирующая часть.

Неблокирующий ввод / вывод

С другой стороны, используя неблокирующий запрос, вы можете инициировать запрос данных для пользователя user2, не дожидаясь ответа на запрос для пользователя user1. Вы можете инициировать оба запроса параллельно.

Этот неблокирующий ввод-вывод устраняет необходимость в многопоточности, поскольку сервер может обрабатывать несколько запросов одновременно.

Цикл событий JavaScript

Если у вас есть 26 минут, посмотрите это отличное видео-объяснение цикла событий узла:

В противном случае, вот краткое пошаговое объяснение того, как работает цикл событий JavaScript.

  1. Вставьте main() в стек вызовов.
  2. Вставьте console.log() в стек вызовов. Затем он сразу же запускается и выскакивает.
  3. Вставьте setTimeout(2000) в стек. setTimeout(2000) - это API узла. Когда мы вызываем его, мы регистрируем пару событие-обратный вызов. Событие будет ждать 2000 миллисекунд, затем обратный вызов будет функцией.
  4. После регистрации в API setTimeout(2000) извлекается из стека вызовов.
  5. Теперь таким же образом регистрируется второй setTimeout(0). Теперь у нас есть два API-интерфейса Node, ожидающих выполнения.
  6. После ожидания в течение 0 секунд setTimeout(0) перемещается в очередь обратного вызова, и то же самое происходит с setTimeout(2000).
  7. В очереди обратного вызова функции ждут, пока стек вызовов не станет пустым, потому что только один оператор может выполнить время. Об этом позаботится цикл событий.
  8. Выполняется последний console.log(), и main() извлекается из стека вызовов.
  9. Цикл событий видит, что стек вызовов пуст, а очередь обратного вызова не пуста. Таким образом, он перемещает обратные вызовы (в порядке очереди) в стек вызовов для выполнения.

npm

Это библиотеки, созданные замечательным сообществом, которые решат большинство ваших общих проблем. В npm (диспетчер пакетов узлов) есть пакеты, которые вы можете использовать в своих приложениях, чтобы ускорить и повысить эффективность разработки.

Требовать

Require выполняет три функции:

  • Он загружает модули, которые поставляются в комплекте с Node.js, такие как файловая система и HTTP, из Node.js API.
  • Он загружает сторонние библиотеки, такие как Express и Mongoose, которые вы устанавливаете из npm.
  • Это позволяет вам запрашивать собственные файлы и разбивать проект на модули.

Require - это функция, которая принимает параметр «путь» и возвращает module.exports.

Узловые модули

Модуль Node - это многократно используемый блок кода, существование которого не влияет случайно на другой код.

Вы можете писать свои собственные модули и использовать их в различных приложениях. В Node.js есть набор встроенных модулей, которые можно использовать без дополнительной установки.

V8 ускоряет JavaScript за счет использования C ++

V8 - это среда выполнения с открытым исходным кодом, написанная на C ++.

JavaScript - ›V8 (C ++) -› Машинный код

V8 реализует сценарий под названием ECMAScript, как указано в ECMA-262. ECMAScript был создан Ecma International для стандартизации JavaScript.

V8 может работать автономно или может быть встроен в любое приложение C ++. У него есть хуки, которые позволяют вам писать собственный код C ++, который вы можете сделать доступным для JavaScript.

По сути, это позволяет вам добавлять функции в JavaScript, встраивая V8 в ваш код C ++, чтобы ваш код C ++ понимал больше, чем то, что в противном случае определяет стандарт ECMAScript.

Изменить: как было доведено до меня Грегом Булмашем, существует множество различных движков времени выполнения JavaScript, помимо V8 от Chrome, таких как SpiderMonkey от Mozilla, Chakra от Microsoft и т. Д. Подробности того же можно найти на « эта страница".

События

Что-то, что произошло в нашем приложении, на что мы можем ответить. В Node есть два типа событий.

  • Системные события: ядро ​​C ++ из библиотеки libuv. (Например, закончил чтение файла).
  • Пользовательские события: ядро ​​JavaScript.

Написание Hello World на Node.js

Мы должны это сделать, не так ли?

Создайте файл app.js и добавьте к нему следующее.

console.log("Hello World!");

Откройте терминал узла, измените каталог на папку, в которой сохранен файл, и запустите node app.js.

Бам, вы только что написали Hello World на Node.js.

Вы можете использовать множество ресурсов, чтобы узнать больше о Node.js, в том числе freeCodeCamp.org.