Руководство. node.js для начинающих
Содержание:
- http://nodejs.org
- Шаг 2. Добавление репозитория Apache2 на сервер и установка веб-сервера
- Работа с потоками в Node.js
- Command Options
- How to Use
- Release schedule
- How to Install Node.js on Windows
- Specification Compliance
- How to Install NPM on Windows 10/8/7
- Цикл событий
- Проблема CPU-ёмких задач
- Шаг 6. Проксирование Node.js-приложения через Apache2 Proxy
- Установка nvm-windows, Node.js и npm
- Шаг 3. Установка менеджера версий Node.js (nvm) и самого Node.js
- Hello world¶
- Первое приложение на Node.js
- Проблема
- Нативные абстракции в Node.js¶
http://nodejs.org
Ну что, время завязывать со всякой нудной теорией и переходить к практике. Сейчас мы посмотрим как установить Node.JS, как на нем выполнять скрипты и немножко залезем в документацию. Для этого я первым делом зайду на сайт http://nodejs.org. Здесь есть такая большая кнопка, которая, как правило, позволяет скачать пакет наиболее подходящий для вашей ОС. Вначале посмотрим, что с Mac OS. С Mac OS все просто, мы жмем на кнопку, скачиваем «node-v4.4.7.pkg», запускаем его, все подтверждаем, все очень очевидно, мы не будем это рассматривать, ошибиться тут не возможно.
Следующее это Linux. С Linux все чуть сложнее, потому что в Linux обычно есть различные пакеты, но в пакетах не самая новая версия, а при работе с Node.JS лучше использовать последние версии, если нет каких-то особых причин так не делать. Так что если вы ставите из пакета, то убедитесь, что версия именно последняя. Если у вас пакет устарел, то Node.JS замечательно компилируется из исходников. Для этого можно загуглить «nodejs linux» в первых пяти ссылках обязательно будет инструкция по установке. Можете загуглить установку под какую то определенную систему например «node.js debian» и вы тоже находите инструкцию на первой же странице. Если вы пользуетесь Linux, то этот процесс не составит для вас особого труда.
Ну и наконец Windows. нажимаем на кнопку и скачиваем «node-v4.4.7-x64.msi» —
после того как он скачался, запускаю и соглашаюсь со всем, что предложит операционная система, все по умолчанию. Отлично Node.JS установился. Установился он в C:\Program Files\nodejs и тут есть как файл node.exe так и npm.cmd. NPM это пакетный менеджер мы рассмотрим его немножко позже.
Node.JS когда ставится прописывает себя в переменную PATH. Чтобы в этом удостовериться можете проделать следующее — в Windows 10 нажимаете правой кнопкой мыши на значок «windows», который некогда был «пуск». В появившемся окне выбираем «система»
далее жмем на «Дополнительные параметры системы», потом «переменные среды.
Перед нами появилось окно «переменные среды» в котором нас интересует записи в среду PATH
Причем не важно для всех пользователей или для вашего пользователя (в нижнем окне или в верхнем) главное, что присутствуют записи «C:\Users\ASUS\AppData\Roaming\npm» и «C:\Program Files\nodejs\». Теперь проверим работает ли Node.JS в принципе
Для этого в любой папке или на «Рабочем столе» при зажатой клавише «Shift» нажимаем правую кнопку мыши и выбираем «Открыть окно команд» такой трюк позволяет нам открыть консоль с прописанным путем в ту папку в которой мы нажали правую кнопку мыши. Другой способ открыть консоль через меню «пуск». Нажимаем правой кнопкой мыши меню «пуск», выбираем «Командная строка».
Итак мы запустили консоль. Вводим команду «node» и у нас появляется приглашение ввести javascript выражение. Это так называемый режим «repl» когда можно вводить javascript выражения и они выполняются.
Дважды нажав сочетание клавиш «Ctrl + c» мы выходим из этого режима. Вообще этот режим используется достаточно редко, здесь мы его используем просто, чтоб проверить, что установка прошла успешно. Конечно же такой запуск должен работать не только в «Windows», а и из любой операционной системы.
Как правила под Node.JS запускают файлы. Например создадим файл «1.js» и запишем в нем команду:
JavaScript
console.log(«Hello, world!»);
1 | console.log(«Hello, world!»); |
она сделает то же самое, что делает в браузере. В консоли вводим команду «node 1.js» и жмем «Enter»:
Обратите внимание в консоли прописан путь в ту папку, в которой у нас находится наш файл 1.js (в моем случае это рабочий стол). Если у вас это работает, поздравляю, вы запустили свой первый скрипт под Node.JS!
Если у вас это работает, поздравляю, вы запустили свой первый скрипт под Node.JS!
Шаг 2. Добавление репозитория Apache2 на сервер и установка веб-сервера
В данной инструкции мы будем устанавливать веб-сервер Apache2 из официального репозитория, так как в репозитории Ubuntu не всегда последняя версия веб-сервера Apache2.
Для начала установим необходимые пакеты командой:
Команда установки необходимого пакета
Если данный пакет уже установлен, то вы увидите следующее:
Необходимый пакет уже установлен
После установки необходимых пакетов добавляем официальный репозиторий Apache2 следующей командой:
При добавлении репозитория, в терминале появится вопрос, на который необходимо нажать клавишу Enter:
Подтверждение добавления репозитория
После добавления репозитория, производим установку самого веб-сервера Apache2:
В терминале появится вопрос о подтверждении установки веб-сервера Apache2. Если согласны с установкой — смело нажимайте клавишу Enter.
Готово!
Теперь можно перейти по IP-адресу, либо по FQDN-адресу вашего сервера и убедиться, что веб-сервер Apache2 успешно установлен.
Примечание. Порты 80 и 443 на вашей виртуальной машине должны быть открыты. Если есть управляемый файерволл в панели управления вашего сервера на хостинге — обязательно проверьте!
Успешная установка Apache2
Работа с потоками в Node.js
stream
▍О сильных сторонах использования потоков
- Эффективное использование памяти. Работа с потоком не предполагает хранения в памяти больших объёмов данных, загружаемых туда заранее, до того, как появится возможность их обработать.
- Экономия времени. Данные, получаемые из потока, можно начать обрабатывать гораздо быстрее, чем в случае, когда для того, чтобы приступить к их обработке, приходится ждать их полной загрузки.
▍API Node.js, в которых используются потоки
- — возвращает поток, подключённый к .
- — возвращает поток, подключённый к .
- — возвращает поток, подключённый к .
- — создаёт читаемый поток для работы с файлом.
- — создаёт записываемый поток для работы с файлом.
- — инициирует соединение, основанное на потоке.
- — возвращает экземпляр класса , предоставляющий доступ к записываемому потоку.
- — сжимает данные с использованием алгоритма и отправляет их в поток.
- — выполняет декомпрессию -потока.
- — сжимает данные с использованием алгоритма и отправляет их в поток.
- — выполняет декомпрессию -потока.
▍Разные типы потоков
- Поток для чтения () — это поток, из которого можно читать данные. Записывать данные в такой поток нельзя. Когда в такой поток поступают данные, они буферизуются до того момента пока потребитель данных не приступит к их чтению.
- Поток для записи () — это поток, в который можно отправлять данные. Читать из него данные нельзя.
- Дуплексный поток () — в такой поток можно и отправлять данные и читать их из него. По существу это — комбинация потока для чтения и потока для записи.
- Трансформирующий поток () — такие потоки похожи на дуплексные потоки, разница заключается в том, что то, что поступает на вход этих потоков, преобразует то, что из них можно прочитать.
Command Options
accepts the following command options:
Command | Description |
---|---|
, | Run in parallel. The value will use all available CPU cores |
Node.js version to build for (default is ) | |
, | Log all progress to console |
, | Log most progress to console |
, | Don’t log anything to console |
, | Make Debug build (default is ) |
, | Make Release build |
, | Run command in different directory |
Override command (e.g. ) | |
Enable thin static libraries | |
Set target architecture (e.g. ia32) | |
Get headers from a local tarball | |
SDK download directory (default is OS cache directory) | |
Don’t reinstall headers if already present | |
Download header tarball from custom URL | |
Set HTTP(S) proxy for downloading header tarball | |
Set urls to ignore proxies when downloading header tarball | |
Override default CA chain (to download tarball) | |
Set the path to the node source code | |
Set path to the Python binary | |
Set Visual Studio version (Windows only) | |
Set Visual Studio Solution version (Windows only) |
How to Use
To compile your native addon, first go to its root directory:
cd my_node_addon
The next step is to generate the appropriate project build files for the current
platform. Use for that:
node-gyp configure
Auto-detection fails for Visual C++ Build Tools 2015, so
needs to be added (not needed when run by npm as configured above):
node-gyp configure --msvs_version=2015
Note: The step looks for a file in the current
directory to process. See below for instructions on creating a file.
Now you will have either a (on Unix platforms) or a file
(on Windows) in the directory. Next, invoke the command:
node-gyp build
Now you have your compiled bindings file! The compiled bindings end up
in or , depending on the build mode. At this point,
you can require the file with Node.js and run your tests!
Note: To create a Debug build of the bindings file, pass the (or
) switch when running either the , or commands.
Release schedule
Release | Status | Codename | Initial Release | Active LTS Start | Maintenance Start | End-of-life |
---|---|---|---|---|---|---|
Maintenance | 2019-04-23 | 2019-10-21 | 2020-11-30 | 2022-04-30 | ||
Active LTS | 2020-04-21 | 2020-10-27 | 2021-10-19 | 2023-04-30 | ||
Current | 2021-04-20 | 2021-10-26 | 2022-10-18 | 2024-04-30 | ||
17.x | Pending | 2021-10-19 | — | 2022-04-01 | 2022-06-01 | |
18.x | Pending | 2022-04-19 | 2022-10-25 | 2023-10-18 | 2025-04-30 |
Dates are subject to change.
The Release schedule is available also as a JSON file.
Release Phases
There are three phases that a Node.js release can be in: ‘Current’, ‘Active
Long Term Support (LTS)’, and ‘Maintenance’. Odd-numbered release lines are not
promoted to LTS — they will not go through the ‘Active LTS’ or ‘Maintenance’
phases.
- Current — Should incorporate most of the non-major (non-breaking)
changes that land on master branch. - Active LTS — New features, bug fixes, and updates that have been audited by
the LTS team and have been determined to be appropriate and stable for the
release line. - Maintenance — Critical bug fixes and security updates. New features may be
added at the discretion of the LTS team — typically only in cases where
the new feature supports migration to later release lines.
Changes required for critical security and bug fixes may lead to semver-major
changes landing within a release stream, such situations will be rare and will
land as semver-minor.
The term ‘supported release lines’ will be used to refer to all release lines
that are not End-of-Life.
End-of-Life Releases
Release | Status | Codename | Initial Release | Active LTS Start | Maintenance LTS Start | End-of-life |
---|---|---|---|---|---|---|
v0.10.x | End-of-Life | — | 2013-03-11 | — | 2015-10-01 | 2016-10-31 |
v0.12.x | End-of-Life | — | 2015-02-06 | — | 2016-04-01 | 2016-12-31 |
End-of-Life | 2015-09-08 | 2015-10-01 | 2017-04-01 | 2018-04-30 | ||
End-of-Life | 2015-10-29 | — | 2016-06-30 | |||
End-of-Life | 2016-04-26 | 2016-10-18 | 2018-04-30 | 2019-04-30 | ||
End-of-Life | 2016-10-25 | — | 2017-06-30 | |||
End-of-Life | 2017-05-30 | 2017-10-31 | 2019-01-01 | 2019-12-31 | ||
End-of-Life | 2017-10-01 | — | 2018-06-30 | |||
End-of-Life | 2018-04-24 | 2018-10-30 | 2020-05-19 | 2021-04-30 | ||
End-of-Life | 2018-10-23 | — | 2019-06-01 | |||
End-of-Life | 2019-10-22 | — | 2020-06-01 | |||
End-of-Life | 2020-10-20 | — | 2021-06-01 |
How to Install Node.js on Windows
The first step in using Node.js is the installation of the Node.js libraries on the client system. Below are the steps to download and install Node.js in Windows:
Step 1)
Go to the site https://nodejs.org/en/download/ and download the necessary binary files.
In our example, we are going to Download Node.js on Windows with the 32-bit setup files.
Step 2) Run the installation
Double click on the downloaded .msi file to start the installation.
Click the Run button on the first screen to begin the installation.
Step 3) Continue with the installation steps
In the next screen, click the “Next” button to continue with the installation
Step 4)
In the next screen, Accept the license agreement and click on the Next button.
Step 5) Set up the path
In the next screen, choose the location where Node.js needs to be installed and then click on the Next button.
1. First, enter the file location for the installation of Node.js. This is where the files for Node.js will be stored after the installation.
2. Click on the Next button to proceed ahead with the installation.
Step 6) Select the default components to be installed
Accept the default components and click on the Next button.
Step 7) Start the installation
In the next screen, click the Install button to start installing Node.js on Windows.
Step 8) Complete the installation
Click the Finish button to complete the installation.
Specification Compliance
This section documents parts of the HTTP/1.1 specification which Undici does
not support or does not fully implement.
Expect
Undici does not support the request header field. The request
body is always immediately sent and the response will be
ignored.
Pipelining
Undici will only use pipelining if configured with a factor
greater than .
Undici always assumes that connections are persistent and will immediately
pipeline requests, without checking whether the connection is persistent.
Hence, automatic fallback to HTTP/1.0 or HTTP/1.1 without pipelining is
not supported.
Undici will immediately pipeline when retrying requests afters a failed
connection. However, Undici will not retry the first remaining requests in
the prior pipeline and instead error the corresponding callback/promise/stream.
Undici will abort all running requests in the pipeline when any of them are
aborted.
How to Install NPM on Windows 10/8/7
The other way to install Node.js on any client machine is to use a “package manager.”
On Windows, the NPM (Node Package Manager) download is known as Chocolatey. It was designed to be a decentralized framework for quickly installing applications and tools that you need.
For installing NPM on Windows via Chocolatey, the following steps need to be performed.
Step 1) Installing Chocolatey – The Chocolatey website (https://chocolatey.org/) has very clear instructions on how this framework needs to be installed.
- The first step is to run the below command in the command prompt windows. This command is taken from the Chocolatey web site and is the standard command for installing Node.js via Chocolatey.
- The below command is a PowerShell command which calls the remote PowerShell script on the Chocolatey website. This command needs to be run in a PowerShell command window.
- This PowerShell script does all the necessary work of downloading the required components and installing them accordingly.
@powershell -NoProfile -ExecutionPolicy Bypass -Command “iex ((new-object wet.webclient).DownloadString(‘https://chocolatey.org/install.ps1’))” && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
Step 2) The next step is to install Node.js to your local machine using the Chocolatey, package manager. This can be done by running the below command in the command prompt.
cinst nodejs install
If the installation is successful, you will get the message of the successful installation of Node.js.
Цикл событий
Цикл событий — это магия, которая происходит внутри Node.js. Это буквально бесконечный цикл и на самом деле один поток.
Libuv — C библиотека которая реализует этот паттерн и является частью ядра Node.js. Вы можете узнать больше о libuv здесь.
Цикл событий имеет 6 фаз, каждое исполнение всех 6 фаз называют tick-ом.
- timers: в этой фазе выполняются коллбэки, запланированные методами и ;
- pending callbacks: выполняются почти все коллбэки, за исключением событий , таймеров и ;
- idle, prepare: используется только для внутренних целей;
- poll: ответственен за получение новых событий ввода/вывода. Node.js может блокироваться на этом этапе;
- check: коллбэки, вызванные методом , выполняються на этом этапе;
- close callbacks: например, ;
Хорошо, есть только один поток, и этот поток и есть цикл событий, но тогда кто выполняет все операции ввода/вывода?
Обратите внимание!!!Когда циклу событий нужно выполнить операцию ввода/вывода он использует поток ОС с тредпула (thread pool), а когда задача выполнена, коллбэк ставится в очередь во время фазы pending callbacks
Разве это не круто?
Проблема CPU-ёмких задач
Node.js кажется идеальным! Вы можете создавать всё, что захотите.
Давайте напишем API для вычислений простых чисел.
Простое число — это целое (натуральное) число больше единицы и делимое только на 1 и на само себя.
Дано число N, API должен вычислять и возвращать первые N простых чисел в список (или массив).
primes.js
index.js
это реализация нужных вычислений: функция проверяет является ли число простым, а nthPrime возвращает N таких чисел.
Файл же отвечает за создание сервера и использует модуль для обработки каждого запроса на . Число N прокидывается через строку запроса в URL-адресе.
Что бы получить первых 20 простых чисел нам нужно сделать запрос на .
Предположим, к нам стучатся 3 клиента и пытаются получить доступ к нашему не блокирующемуся вводом/выводом API:
- Первый запрашивает 5 простых чисел каждую секунду.
- Второй запрашивает 1000 простых чисел каждую секунду
- Третий запрашивает 10 000 000 000 простых чисел, но…
Когда третий клиент шлёт запрос — главный поток блокируется и это главный признак проблемы CPU-ёмких задач. Когда главный поток занят исполнением «тяжёлой» задачи он становится недоступен для других задач.
Но как насчёт libuv? Если Вы помните, эта библиотека помогает Node.js исполнять операции ввода/вывода с помощью потоков ОС избегая блокировки главного потока и Вы абсолютно правы, это решение нашей проблемы, но для того, что бы это стало возможным, наш модуль должен быть написан на языке C++, что бы libuv могла с ним работать.
К счастью, начиная с v10.5 в Node.js добавлен нативный модуль Worker Threads.
Шаг 6. Проксирование Node.js-приложения через Apache2 Proxy
У нас уже запущено приложение на Nuxt.js на порту 3000 (по-умолчанию)
Теперь нам необходимо проксировать его на определенный адрес и стандартный порт 80 (для HTTP).
Для этого установим и включим модуль Apache2 Proxy:
И перезагрузим веб-сервер командой:
Включение модуля Apache2 Proxy HTTP
Переходим в папку с виртуальными хостами Apache2 командой:
и дублируем дефолтный файл конфигурации виртуального хоста Apache2:
Открываем файл ваш_домен.conf с помощью редактора nano. Изменяем на Ваши следующие значения:
-
ServerName: необходимо раскомментировать и значение example.com поменять на ваше доменное имя
-
DocumentRoot: можно закомментировать значком #
Пример оформления файла конфигурации виртуального хоста
Затем, чтобы проксировать наше приложение на этот адрес, нам необходимо добавить следующие строки:
Где :3000 — Ваш порт приложения
Сохраняем изменения комбинацией клавиш Ctrl+O и жмем Enter. Выходим из редактора комбинацией Ctrl+Z
Проксирование 3000 порта
Теперь можно включить виртуальный хост и перезагрузить веб-сервер*:
Смотрим результат
Как видим — приложение успешно открывается на необходимом нам адресе и стандартном порту веб-сервера Apache2
Установка nvm-windows, Node.js и npm
Наряду с возможностью выбора системы для разработки (Windows или WSL) при установке Node.js доступны и другие возможности. Мы рекомендуем использовать диспетчер версий, так как версии меняются достаточно быстро. Вероятно, вам придется переключаться между несколькими версиями Node.js в зависимости от потребностей для различных проектов, над которыми вы работаете. Диспетчер версий Node Version Manager, чаще называемый nvm, является наиболее популярным средством установки нескольких версий Node.js, но он доступен только для Mac и Linux и не поддерживается в Windows. Вместо этого выполним шаги ниже, чтобы установить nvm-windows, а затем используем его для установки Node.js и диспетчера пакетов Node Package Manager (npm). Существуют также , которые описаны в следующем разделе.
Важно!
Рекомендуем всегда удалять любые имеющиеся установки Node.js или npm из операционной системы перед установкой диспетчера версий, так как эти установки могут создавать необычные и запутанные конфликты. Сюда относится удаление всех существующих каталогов установки Node.js (например, C:\Program Files\nodejs), которые могут остаться. Созданная символьная ссылка NVM не будет перезаписывать существующий (даже пустой) каталог установки. Справку по полному удалению предыдущих установок см. здесь.
-
Откройте в Интернет-браузере и щелкните ссылку Загрузить сейчас.
-
Скачайте последний выпуск файла nvm-setup.zip.
-
После скачивания откройте ZIP-файл, а затем запустите файл nvm-setup.exe.
-
Мастер установки Setup-NVM-for-Windows поможет выполнить все этапы установки, в том числе выбрать каталог, в котором будут установлены репозиторий nvm-windows и Node.js.
-
Установка завершится. откройте PowerShell и попробуйте использовать windows-nvm, чтобы просмотреть список установленных версий Node (на этом этапе их еще не должно быть):
-
Установите текущий выпуск Node.js (в нем вы сможете протестировать новейшие улучшенные возможности, но вероятность возникновения проблем при этом будет больше, чем при использовании версии LTS) с помощью команды .
-
Установите последний стабильный выпуск LTS Node.js (рекомендуется). Для этого сначала выполните поиск номера текущей версии LTS с помощью команды , а затем установите версию LTS по номеру с помощью команды (замените номером, например: ).
-
Вызовите список установленных версий Node, выполнив команду . Теперь в нем должны отображаться две недавно установленные версии.
-
После установки требуемых версий Node.js выберите нужную версию, введя (замените нужным номером, например ).
-
Чтобы изменить версию Node.js на ту, которую вы хотите использовать для проекта, создайте каталог проекта с помощью команды и укажите каталог, выполнив команду . Затем введите , заменив номером версии, который вы хотите использовать (т. е. версии 10.16.3).
-
Проверьте, какая версия npm установлена, с помощью . Этот номер версии автоматически изменится на номер той версии npm, которая связана с вашей текущей версией Node.js.
Альтернативные диспетчеры версий
Несмотря на то что windows-nvm сейчас является самым популярным менеджером версий для Node, есть несколько альтернативных вариантов:
-
nvs (Node Version Switcher) — это кроссплатформенный вариант с возможностью интеграции с VS Code.
-
— это новый диспетчер версий, созданный командой LinkedIn. Заявлено, что он отличается увеличенной скоростью и межплатформенной поддержкой.
Чтобы установить Volta в качестве диспетчера версий (вместо windows-nvm), перейдите в раздел Установка Windows руководства Начало работы, затем скачайте и запустите установщик Windows, следуя инструкциям.
Важно!
Перед установкой Volta необходимо убедиться, что на компьютере с Windows включен .
Дополнительные сведения об использовании Volta для установки нескольких версий Node.js в Windows см. в .
Шаг 3. Установка менеджера версий Node.js (nvm) и самого Node.js
Для установки и более удобного дальнейшего контроля версий NodeJS мы установки менеджер версии NodeJS. Пакет называется nvm.
Для этого перейдем в официальный репозиторий на GitHub.
И перейдем в раздел Installing and Updating и выберем один их способов установки скрипта. Я выберу второй через утилиту wget:
Раздел установки и обновления скрипта NVM в официальном репозитории на GitHub
Копируем команду и вставляем ее в терминал сервера:
Команда установки NVM в терминале
И жмем клавишу Enter
После установки перезагружаем сервер при помощи кнопки перезагрузки в панели управления сервером, либо через команду в терминале
Примечание. Вместо перезапуска сервера можно переподключиться к нему по SSH так, как указано в шаге 1.
Автоматическое отключение от сервера после применения команды перезагрузки
После перезагрузки снова подключаемся к серверу согласно шагу 1.
Запускаем команду nvm для того, чтобы посмотреть и ознакомится со списком команд скрипта. Находим команду установки NodeJS в версии LTS:
Команда установки NodeJS LTS-версии
Пакет NVM поможет вам «в 2 клика» поддерживать всегда актуальную версию Node.js
Вводим эту команду в терминал и жмем клавишу Enter:
Успешная установка NodeJS через менеджер NVM
Проверяем установленную версию Node.js следующей командой:
И получаем сообщение об установленной версии Node.js:
Установленная версия NodeJS
Шаг 4. Установка менеджера процессов pm2
Для того, чтобы управлять процессами и приложениями, запущенными в среде Node.js, а также автоматического их запуска после перезагрузки сервера, нам понадобится менеджер процессов Node.js, который мы установим глобально в систему через пакетный менеджер npm. Пакет называется pm2:
При успешной установке мы увидим следующее:
Успешная установка пакета pm2
При помощи командыможно посмотреть список доступных команд
Hello world¶
Простой пример «Hello world» — аддон. написанный на С++, являющийся эквивалентом нижеприведенному JavaScript коду:
Сначала нужно создать файл :
Следует заметить, что все аддоны в Node.js должны экспортировать фукцию инициализации по следующему шаблону:
После нет точки с запятой, как как это не функция (см. )
должно совпадать с окончательным именем бинарного файла (без суффикса )
В примере функцией инициализации является , а имя модуля аддона —
Сборка
После того, как исходный код был написан, нужно скомпилировать его в бинарный файл . Для этого создается файл в верхушке проекта, описывающего конфигурацию вашего модуля в формате JSON. Этот файл будет использован node-gyp инструментом, написанным специально для того, чтобы компилировать аддоны Node.js.
Примечание
Версия утилиты node-gyp поставляется вместе с Node.js как часть npm. Эта версия не является доступной непосредственно для разработчиков и преназначена только для поддержки возможности использования команды для компиляции и установки аддонов. Разработчики, которые хотят использовать node-gyp напрямую, должнв установить эту утилиту с помощью команды . Инструкция по установке, пока на английском.
После создания файла нужно использовать для генерации соответствующих файлов сборки проекта на текущей платформе. Эта команда генерирует либо (для Unix-платформ), либо (для Windows) в директории .
Затем нужно вызвать команду для генерации компилированного файла . Он будет находиться в директории .
При вызове для установки аддона, npm использует собственную версию для выполнения такого же набора действий, генерируя скомпирированную версию аддона для платформы пользователя по запросу.
После сборки бинарный аддон может быть использован внутри Node.js посредством во встроенном модуле :
Более подробное объяснение см. в примерах ниже для применения на практике.
Так как точный путь к скомпилированному бинарному файлу аддона может изменяться в зависимости от способа компиляции (например, иногда он находится в ), аддоны могут использовать пакет bindings для загрузки скомпилированного модуля.
Следует заметить, что реализация пакета bindings достаточно сложна (а именно в том, как размещаются модули). Здесь используется шаблон try-catch:
Связка с собственными зависимостями Node.js
Node.js использует большое количество статичных библиотек, типа V8, libuv, OpenSSL. Все аддоны должны ссылаться на V8, а также могут содержать ссылку на любую другую зависимость. Это довольно просто осуществить: нужно добавить соответствующее выражение (например, ) и разместит соответствующие заголовки автоматически. Однако, здесь тоже можно напороться на подводные камни:
- При запуске определяется версия релиза Node.js и загружается либо полный архив с исходным кодом, либо только заголовки. Если полный архив загружен, аддоны будут иметь абсолютный доступ к полному набору зависимостей Node.js. Тем не менее, если загружены только заголовки, будут доступны лишь экспортированные Node.js символы.
- Утилита может быть запущена с помощью флага , указывающего на исходный образ Node.js. Используя эту опцию, аддоны могут получить доступ к полному набору зависимостей.
Загрузка аддонов с помощью reqiure()
Расширение бинарного файла скомпилированного аддона — . Функция написана для того. чтобы мониторить файлы с расширением и инициализировать их как динамически подключаемые библиотеки.
При вызове расширение обычно опускается и Node.js все еще может найти и инициализировать аддон. Однако, есть загвоздка: Node.js сначала попытается разместить и загрузить модули файлов JavaScript, что может привести к повторению имен файлов. К примеру: Если файл находится в той же директории, что и , вызов может отдать приоритет и загрузить этот файл вместо .
Первое приложение на Node.js
Последнее обновление: 14.11.2018
Напишем первое простейшее приложение для NodeJS. Для создания приложений можно использовать практически все стандартные конструкции языка JavaScript.
Исключением является работа с DOM, так как приложение будет запускаться на сервере, а не в браузере, поэтому DOM и такие объекты как или
в данном случае нам будут недоступны.
Для этого вначале создадим для приложения каталог на жестком диске. К примеру, я создал каталог
C:\node\helloapp. В этом каталоге создадим файл app.js.
Определим в файле app.js следующий код:
const http = require("http"); http.createServer(function(request,response){ response.end("Hello NodeJS!"); }).listen(3000, "127.0.0.1",function(){ console.log("Сервер начал прослушивание запросов на порту 3000"); });
Вкратце разберем этот код.
На первой строке мы получаем модуль http, который необходим для создания сервера. Это встроенный модуль, и для его загрузки необходимо применить функцию :
const http = require("http");
Далее с помощью метода создается новый сервер для прослушивания входящих подключений и обработки запросов. В качестве параметра
этот метод принимает функцию, которая имеет два параметра. Первый параметр request хранит всю информацию о запросе, а второй параметр response используется
для отправки ответа. В данном случае ответ представляет простую строку «Hello NodeJS!» и отправляется с помощью метода .
Но метод только создает сервер. Чтобы сервер начал прослушивать входящие подключения у него надо вызвать метод :
.listen(3000, "127.0.0.1",function(){ console.log("Сервер начал прослушивание запросов на порту 3000"); });
Этот метод принимает три параметра. Первый параметр указывает на локальный порт, по которому запускается сервер. Второй параметр указывает
на локальный адрес. То есть в данном случае сервер будет запускаться по адресу 127.0.0.1 или localhost на порту 3000.
Третий параметр представляет функцию, которая запускается при начале прослушивания подключений. Здесь эта функция просто выводит диагностическое сообщение на консоль.
Теперь запустим сервер. Для этого откроем терминал (в OS X или Linux) или командную строку (в Windows). С помощью команды cd
перейдем к каталогу приложения:
cd C:\node\helloapp
Затем вызовем следующую команду:
node app.js
Она запускает сервер:
Далее откроем браузер и введем в адресную стоку адрес http://localhost:3000/:
И нам отобразится то сообщение, которое было послано в методе .
НазадВперед
Проблема
C10k (англ. C10k; 10k connections — проблема 10 тысяч соединений)
В ранние 2000-е, серверные и клиентские машины были медленными. Проблема возникала при параллельной обработке 10 000 клиентских соединений к одной машине.
Но почему традиционная модель thread-per-request (поток на запрос) не могла решить эту проблему? Что ж, давайте используем немного математики.
Нативная реализация потоков выделаят больше 1 Мб памяти на поток, выходя из этого — для 10 тысяч потоков требуется 10 Гб оперативной памяти и это только для стека потоков. Да, и не забывайте, мы в начале 2000-х!!
В наши дни серверные и клиентские компьютеры работают быстрее и эффективней и почти любой язык программирования или фреймворк справляются с этой проблемой. Но фактически проблема не исчерпана. Для 10 миллионов клиентских соединений к одной машине проблема возвращается вновь (но теперь она C10M Problem).
Нативные абстракции в Node.js¶
Каждый из примеров, приведенных в этой документации, иллюстрирует прямое использование Node.js и V8 API для реализации аддонов
Важно понимать, что V8 API может изменяться от релиза к релизу (и с релизами Node.js). С каждым изменением аддоны, возможно, нужно будет обновлять и рекомпилировать для того, чтобы они продолжали функционировать
График релизов Node.js разработан так, чтобы минимизировать частоту таких изменений, однако, это все, что на данный момент может сделать Node.js для гарантии стабильности V8 API.
Нативные абстракции для Node.js (или nan) предоставляют набор инструментов, которые рекомендуют использовать разработчики аддонов для сохранения совместимости между прошлыми и будущими релизами V8 и Node.js. В примерах nan наглядно показывается их использование.