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.
- Вставьте
main()
в стек вызовов. - Вставьте
console.log()
в стек вызовов. Затем он сразу же запускается и выскакивает. - Вставьте
setTimeout(2000)
в стек.setTimeout(2000)
- это API узла. Когда мы вызываем его, мы регистрируем пару событие-обратный вызов. Событие будет ждать 2000 миллисекунд, затем обратный вызов будет функцией. - После регистрации в API
setTimeout(2000)
извлекается из стека вызовов. - Теперь таким же образом регистрируется второй
setTimeout(0)
. Теперь у нас есть два API-интерфейса Node, ожидающих выполнения. - После ожидания в течение 0 секунд
setTimeout(0)
перемещается в очередь обратного вызова, и то же самое происходит сsetTimeout(2000)
. - В очереди обратного вызова функции ждут, пока стек вызовов не станет пустым, потому что только один оператор может выполнить время. Об этом позаботится цикл событий.
- Выполняется последний
console.log()
, иmain()
извлекается из стека вызовов. - Цикл событий видит, что стек вызовов пуст, а очередь обратного вызова не пуста. Таким образом, он перемещает обратные вызовы (в порядке очереди) в стек вызовов для выполнения.
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.