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)


  1. dagen
    14.08.2018 10:51
    +1

    Это явно не та статья, которую стоило переводить. Не все англоязычные ресурсы одинаково полезны)


  1. Xtray
    14.08.2018 11:17
    +1

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

    console.log («Hello World!»);

    И получи?те SyntaxError :)


  1. Cim
    14.08.2018 11:21

    Фух, вовремя статья подоспела. Мы как раз выбираем на проэкте новую технологию для перехода с Delphi и присматриваемся к современному и новому подходу к разработке с node.js!


    1. bosom
      14.08.2018 12:33
      +1

      Скажите привет утечкам памяти, колбэкам, не однозначному поведению кода.
      При переходе с дэлфи вас ждут неописуемые впечатления и ваш словарный запас многократно и экспоненциально возрастёт.
      Я даже вам завидую, вам не будет скучно достаточно длительное время, каждый день новое открытие, новые впечатления. Молодцы!


      1. force
        14.08.2018 14:06
        +1

        А можно про утечки памяти подробнее? А то пацаны-то не знают, у нас системы на ноде работают месяцами и как-то с ними всё хорошо. Вы имеете в виду, что есть утечки в движке/системных библиотеках, или же просто очень легко захватить объект, который не нужен, но завис в каком-нить глобальном кеше.


        1. bosom
          15.08.2018 08:27
          -1

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

          Успехов вам с вашими начинаниями и молодцы что выбрали этот язык, как говорится, каждому своё!

          З.Ы. Уважаемые говнофилы, поставьте еще 15 минусов пожалуйста, я искренне не люблю гавно, поэтому есть за что ставить…


          1. force
            15.08.2018 10:10
            +2

            Мдя… Минус я вам не ставил, я реально хотел узнать, может действительно есть опасные практики, но вы решили обидеться, изобразить из себя Д'Артаньяна, взять транспарант «Нода — говно!» и слиться гордо уйти в закат.


    1. Lure_of_Chaos
      14.08.2018 12:42
      +1

      Как мне кажется, JS как язык, и Node.js как платформа — не самый удачный вариант перехода.
      Посмотрите еще экосистему .NET


  1. dpischalka
    14.08.2018 11:23

    А я поддержу автора, есть новички или люди из других областей, которые много из этой статьи могут и не знать. Таким образом небольшой обзор и в какой-то мере ликбез был проведён. Почему бы и нет. Блоггинг не всегда должен веять гениальные идеи, иначе статьи на хабре выходили бы раз в [назоваите сами].


    1. dagen
      14.08.2018 11:30

      Дело не в том, что статья базовые вещи содержит. Согласен с вами, что статьи по азам как раз полезны. Дело в том, что статья содержит фактические ошибки и может быть просто вредна для человека, ничего не знающего про ноду/браузеры.


      1. m_vash Автор
        14.08.2018 13:58

        Укажите на грубые ошибки, сделаю примечание переводчика


  1. Gennadii_M
    14.08.2018 11:25
    -1

    Оба — браузерный JavaScript и Node.js запускаются в среде выполнения V8

    Большинство браузеров используют не V8.


    1. Lainhard
      16.08.2018 12:42

      Я думаю большинство Google Chrome браузеров используют V8.


      1. Gennadii_M
        16.08.2018 13:17

        Chrome и Opera, если точнее. Остальные (из популярных) — нет. Там же был разговор за браузерный JS, а не Chrome браузерный.


  1. Focushift
    15.08.2018 12:40

    А причем тут реакт?
    В списке хабов.


  1. mbtv
    16.08.2018 12:42

    Благодарю за перевод!