1. Введение


1.1. Целевая аудитория

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


1.2. Темы (не) затронутые

Это просто введение в node и npm (менеджер пакетов узла). Это не упоминать альтернативы.


2. Узел


2.1. Об узле

Node — это среда выполнения на стороне сервера, построенная на основе движка JavaScript Google Chrome V8.
Node просто запускает ваш код javascript на сервере (без окна браузера).


2.2. Применение

Простое использование: node myscript.js
Обычно основной файл называется index.js


2.3. Настраивать

Вы можете скачать узел из https://nodejs.org/en/
Вы также можете запустить его в контейнере, например. запустив docker run --rm -it node:lts bash (при условии, что у вас установлен докер).


2.4. Важные примечания о многопоточности для разработчиков, не знакомых с JavaScript

JavaScript является однопоточным по дизайну. Это означает, что все команды выполняются последовательно но каждый фрагмент может выполняться не по порядку.
Однако операции ввода/вывода являются многопоточными.
Знание многопоточности из других языков усложняет вам задачу.
Попробуйте разделить свой код на более мелкие фрагменты, которые быстро заканчиваются. Пример ловушки, ожидающей вас, — это итерация for, которая выполняет трудоемкую операцию — вы заблокируете весь процесс узла, пока итерация не будет завершена.

Node использует либо промисы (вызов метода, который отложен, но вы можете планировать дальнейшие вызовы на основе его результата), либо async/await (который внутренне работает с промисами). См. пример кода в конце.

Если вы думаете, что однопоточность — это плохо, подумайте еще раз. Разработчик, возможно, лучше контролирует процесс, чем при многопоточности, и вам не нужно создавать отдельный поток. Java в настоящее время пытается реализовать аналогичный механизм с проектом ткацкий станок. Однако это решение сопряжено с некоторыми опасностями, поскольку разработчик может легко заблокировать поток, чтобы ваши критические обработчики (которые исключаются для обработки, например, запросов поддержки активности) не могли быть вызваны. Обычный нежелательный эффект заключается в том, что ваше приложение отключается от серверов (база данных, rabbitMQ, kafka и т. д.) или уничтожается (например, проверка работоспособности докера).


3. Менеджер пакетов узлов (npm)


3.1. Что такое нпм

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


3.2. NPM-пакеты

Вы можете создавать собственные проекты и бесплатно публиковать их на npmjs.org с публичным доступом (но также доступен приватный доступ для платных аккаунтов).
Проекты, состоящие из нескольких пакетов, часто группируются в такие организации, как @бабель. Организации имеют префикс «@».

Экосистема npm очень богата и имеет множество пакетов. Их количество часто используется в шутках, например, с нпм пьющая игра.


3.3. Управление версиями пакета Npm

Пакеты выпускаются с тегами, тег по умолчанию — «последний». Можно создать любой пользовательский тег, но часто тег «далее» используется для любых «нестабильных» выпусков.

Версии пакетов должны следовать SemVer. Номер примера 1.2.3 (основной.минорный.патч).
Вы должны увеличить основной номер при внесении критических изменений (все, что может нарушить работу приложений, использующих ваш пакет).
Младший номер следует использовать при добавлении новых функций без нарушения существующей функциональности.
Номер патча используется для небольших исправлений, которые не нарушают логику и не добавляют новые функции.

По умолчанию при установке пакета вы устанавливаете самую последнюю выпущенную версию из тега «последняя» (даже если ее номер меньше, чем ранее выпущенная).
«Нестабильные» релизы должны выпускаться под альтернативным тегом и иметь дополнительный суффикс, например. 1.2.4-next.0 чтобы указать, что это предварительная версия предстоящего 1.2.4 версия под тегом nextкандидат номер 0.
При автоматическом обновлении пакетов npm будет пытаться придерживаться текущей основной версии (что означает «только некритические изменения»), но выбирает самую доступную «стабильную» версию.
На самом деле нет строгих правил для тегов или версий.


3.4. Обновление версии нпм

Вы можете использовать команду npm version чтобы обновить вашу версию.
Пример потока:

npm version 0.0.1  # versions starting with 0 are often considered to be not yet completed
npm version major  # bumps to 1.0.0 (breaking change)
npm version minor  # bumps to 1.1.0 (new feature)
npm version patch  # bumps to 1.1.1 (bugfix)
npm version prerelease --preid next  # bumps to 1.1.2-next.0
npm version prerelease --preid next  # bumps to 1.1.2-next.1
npm version minor  # bumps to 1.2.0
npm version prerelease --preid next  # bumps to 1.2.1-next.0
npm version patch  # bumps to 1.2.1
Войти в полноэкранный режим

Выйти из полноэкранного режима

Команда npm version имеет особую логику при переходе из репозитория git — затем создается новая фиксация с обновлением версии и создается новый аннотированный тег.

Сохранение версии в исходном коде имеет свои плюсы и минусы. Наиболее важным минусом, вероятно, является то, что версия должна быть известна «заранее», в то время как многие могут предпочесть иметь результат сборки (артефакт), который тестируется и получает свой номер после прохождения тестов.


3.5. Сканирование NPM-кода

В Npm есть встроенные команды для сканирования кода:
npm outdated показывает все пакеты, имеющие более новые версии (остерегайтесь таких пакетов, как трассировки стека который имеет нестандартный предварительный выпуск, опубликованный по последнему тегу).
npm audit сканирует ваш код на наличие известных уязвимостей.


4. Примеры кода

Я мог бы обновить примеры в будущем


4.1. Пример асинхронного/ожидания

async function myMethod(){
  const result1 = readFileAsync('/filename');
  console.log('This gets immediately printed BEFORE file is read');
  console.log(result1); // Prints "Promise" and is not yet resolved
  const result2 = await readFileAsync('/filename');
  console.log('This is not executed until result2 promise gets fulfilled').
  console.log(result2); // Prints result as it was already read
}

myMethod(); // Here I can use promises but not async/await - but I could "run" the async method "in the background"
Войти в полноэкранный режим

Выйти из полноэкранного режима


5. IDE (интегрированная среда разработки)

Платный (IntelliJ Ultimate включает в себя все его функции).

Бесплатный и предоставляющий очень похожий опыт:

Доступно много других IDE (напр. который написан с использованием узла, javascript и npm).

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