Node.js это — среда выполнения JavaScript. Что же это значит, и как работает?
Окружение Node.js включает все, что вам нужно для выполнения программы, написанной на JavaScript.
Раньше вы могли запустить JavaScript только в браузере, но однажды разработчики расширили его, и теперь вы можете запускать JS на своем компьютере в качестве отдельного приложения. Так появился Node.js.
Теперь вы можете сделать гораздо больше с JavaScript, чем просто интерактивные веб-сайты.
Теперь у JavaScript есть возможность делать то, что могут делать другие скриптовые языки программирования, такие как Python.
Оба — браузерный JavaScript и Node.js запускаются в среде выполнения V8. Этот движок использует ваш JS код, и преобразует его в более быстрый машинный код. Машинный – низкоуровневый код, который компьютер может запускать без необходимости сначала его интерпретировать.
Почему 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. I/O занимает время и, следовательно, блокирует другие функции.
Рассмотрим сценарий, в котором мы запрашиваем user1 и user2 из бекенда, а затем печатаем их на экране / в консоли. Ответ на этот запрос требует времени, но оба запроса пользовательских данных могут выполняться независимо и в одно и то же время.
Блокирование ввода-вывода
В методе блокировки запрос данных user2 не запускается до тех пор, пока данные user1 не будут напечатаны на экране.
Если это был веб-сервер, нам нужно было бы начать новый поток для каждого нового пользователя. Но JavaScript однопоточен (но он имеет однопоточный цикл событий, о котором мы поговорим чуть позже). Таким образом, это сделает JavaScript не очень подходящим для многопоточных задач.
Неблокирующий ввод-вывод
С другой стороны, используя неблокирующий запрос, вы можете инициировать запрос данных для user2, не дожидаясь ответа на запрос user1. Вы можете инициировать оба запроса параллельно.
Неблокирующий ввод-вывод устраняет необходимость многопоточности, поскольку сервер может обрабатывать несколько запросов одновременно.
Цикл событий JavaScript
Если у вас есть 26 минут, посмотрите отличное видео-объяснение Node Event Loop:
Если нету, вот пошаговое объяснение того, как работает Event Loop в JavaScript:
1. Посылаете main() в стек вызовов.
2. Посылаете console.log() в стек вызовов. Он запускается сразу и появляется.
3. Посылаете setTimeout(2000) в стек. setTimeout(2000) это — Node API. Когда мы его вызываем, мы регистрируем пару событие-коллбек. Событие будет ждать 2000 миллисекунд, а потом вызовет коллбек.
4. После регистрации, setTimeout(2000) появляется в стеке вызовов.
5. Теперь второй setTimeout(0) регистрируется таким же образом. Теперь у нас есть два API-интерфейса Node, ожидающих выполнения.
6. После ожидания 0 секунд setTimeout(0) перемещается в очередь выполнения коллбеков (callback queue), и то же самое происходит с setTimeout(2000).
7. В очереди выполнения коллбеков функции ждут, когда стек вызовов будет пустым, потому что только одна функция может выполняться одновременно. Это обеспечивает event loop.
8. Вызывается последняя console.log(), а main() вызывается из стека вызовов.
9. Цикл событий видит, что стек вызовов пуст, а очередь обратного вызова — нет. Таким образом, он перемещает обратные вызовы (по порядку) в стек вызовов для выполнения.
Npm
Это библиотеки, построенные сообществом. Они решат большинство часто встречающихся проблем. npm (менеджер пакетов Node) содержит пакеты, которые вы можете использовать в своих приложениях, чтобы сделать вашу разработку более быстрой и эффективной.
Require
Require исполняет три функции:
Загружает модули, поставляемые в комплекте с Node.js, например из файловой системы или HTTP, из API Node.js.
Загружает сторонние библиотеки, такие как Express и Mongoose, которые вы устанавливаете из npm.
Позволяет создавать собственные файлы и делить проект на модули.
Require — это функция, и она принимает параметр «путь» и возвращает module.exports.
Node модули
Node модули это — многоразово используемые блоки кода, существование которых не случайно не влияет на другой код.
Вы можете написать свои собственные модули и использовать их в различных приложениях. Node.js имеет набор встроенных модулей, которые вы можете использовать без специальной установки.
V8 ускоряет JavaScript, используя C ++
V8 – движок с открытым исходным кодом, написанный на C ++.
JavaScript -> V8 (C ++) -> машинный код
V8 реализует сценарий ECMAScript, как указано в ECMA-262. ECMAScript был создан Ecma International для стандартизации JavaScript.
V8 может работать автономно или может быть встроен в любое приложение C ++. Благодаря этому, вы можете написать свой собственный код на C ++, и сделать его доступным для JavaScript.
События
События – это все, что произошло в нашем приложении, и на что мы можем ответить.
В Node есть два типа событий:
- Системные события: ядро C ++ из библиотеки libuv. (Например, окончание чтение файла).
- Пользовательские события: ядро JavaScript.
Пишем Hello World в Node.js
Почему бы и нет?
Создайте файл app.js и добавьте к нему следующее.
console.log («Hello World!»);
Откройте терминал Node, измените каталог на папку, в которой сохранен файл, и запустите node app.js.
Вуаля — вы только что написали «Hello World» в Node.js.
Существует огромное количество ресурсов, которые вы можете использовать, чтобы узнать больше о Node.js, включая freeCodeCamp.org.
Комментарии (16)
Xtray
14.08.2018 11:17+1Создайте файл app.js и добавьте к нему следующее.
console.log («Hello World!»);
И получи?те SyntaxError :)
Cim
14.08.2018 11:21Фух, вовремя статья подоспела. Мы как раз выбираем на проэкте новую технологию для перехода с Delphi и присматриваемся к современному и новому подходу к разработке с node.js!
bosom
14.08.2018 12:33+1Скажите привет утечкам памяти, колбэкам, не однозначному поведению кода.
При переходе с дэлфи вас ждут неописуемые впечатления и ваш словарный запас многократно и экспоненциально возрастёт.
Я даже вам завидую, вам не будет скучно достаточно длительное время, каждый день новое открытие, новые впечатления. Молодцы!force
14.08.2018 14:06+1А можно про утечки памяти подробнее? А то
пацаны-то не знают, у нас системы на ноде работают месяцами и как-то с ними всё хорошо. Вы имеете в виду, что есть утечки в движке/системных библиотеках, или же просто очень легко захватить объект, который не нужен, но завис в каком-нить глобальном кеше.bosom
15.08.2018 08:27-1Заминусовали, вот сами себе и рассказывайте подробнее,
а по мне, спасибо, js достаточно, больше не нужно, но время потраченное не вернуть.
Успехов вам с вашими начинаниями и молодцы что выбрали этот язык, как говорится, каждому своё!
З.Ы. Уважаемые говнофилы, поставьте еще 15 минусов пожалуйста, я искренне не люблю гавно, поэтому есть за что ставить…force
15.08.2018 10:10+2Мдя… Минус я вам не ставил, я реально хотел узнать, может действительно есть опасные практики, но вы решили обидеться, изобразить из себя Д'Артаньяна, взять транспарант «Нода — говно!» и
слитьсягордо уйти в закат.
Lure_of_Chaos
14.08.2018 12:42+1Как мне кажется, JS как язык, и Node.js как платформа — не самый удачный вариант перехода.
Посмотрите еще экосистему .NET
dpischalka
14.08.2018 11:23А я поддержу автора, есть новички или люди из других областей, которые много из этой статьи могут и не знать. Таким образом небольшой обзор и в какой-то мере ликбез был проведён. Почему бы и нет. Блоггинг не всегда должен веять гениальные идеи, иначе статьи на хабре выходили бы раз в [назоваите сами].
dagen
14.08.2018 11:30Дело не в том, что статья базовые вещи содержит. Согласен с вами, что статьи по азам как раз полезны. Дело в том, что статья содержит фактические ошибки и может быть просто вредна для человека, ничего не знающего про ноду/браузеры.
Gennadii_M
14.08.2018 11:25-1Оба — браузерный JavaScript и Node.js запускаются в среде выполнения V8
Большинство браузеров используют не V8.Lainhard
16.08.2018 12:42Я думаю большинство Google Chrome браузеров используют V8.
Gennadii_M
16.08.2018 13:17Chrome и Opera, если точнее. Остальные (из популярных) — нет. Там же был разговор за браузерный JS, а не Chrome браузерный.
dagen
Это явно не та статья, которую стоило переводить. Не все англоязычные ресурсы одинаково полезны)