# Node JS

NodeJS - среда выполнения (runtime) для JS

Node.js также дополнительно предоставляет экосистему инструментов JavaScript, которые используются для React Native разработки, тестирования и сборки приложений. Например:

* **Babel** — для транспиляции современного JavaScript (ES6+) в код, понятный старым версиям JavaScript. Babel встроен из коробки в React Native;

* **Metro** — сборщик, который используется React Native для компиляции и упаковки вашего кода и обеспечения таких функций, как горячая перезагрузка (Hot Reloading);

* **ESLint, Prettier** — для линтинга и форматирования кода.

Эти инструменты необходимы для вашего проекта на RN и управляются через пакетный менеджер npm. 

> npm doctor

## NPM (node package manager)

**npm (Node Package Manager)** поставляется вместе с Node.js "из коробки". Это означает, что когда вы устанавливаете Node.js на свой компьютер, npm автоматически устанавливается вместе с ним.

> npm -v

**Peer dependencies** — это про одноуровневые зависимости, которые ваш пакет ожидает найти в проекте, но не устанавливает их автоматически. Н/р: react-router (используют "react": "^2.0.0") и react-bootstrap (используют "react": ">=1.0.0 <3.0.0"). **Peer dependencies** заставит их использовать одну и ту же библиотеку реакт v2, во избежание дублирований.


<details>
  <summary style="color: lightblue; font-weight: bold;">Полный пример использования peerDependencies -></summary>
  <p>
    1) package.json для react-router (без изменений):
    <pre><code>{
  "name": "react-router",
  "version": "1.0.0",
  "peerDependencies": {
    "react": "^2.0.0"
  }
}</code></pre>
    2) package.json для react-bootstrap (обновлённый диапазон):
    <pre><code>{
  "name": "react-bootstrap",
  "version": "1.0.0",
  "peerDependencies": {
    "react": ">=1.0.0 <3.0.0"
  }
}</code></pre>
    3) package.json для проекта:
    <pre><code>{
  "name": "my-app",
  "version": "1.0.0",
  "dependencies": {
    "react": "2.0.0",
    "react-router": "1.0.0",
    "react-bootstrap": "1.0.0"
  }
}</code></pre>

  </p>
</details>



<br>

**legacy peer dependencies** — это поведение, которое игнорирует конфликты версий для peerDependencies. Пакет проверяется на название, но не проверяется на совпадение версий

**Когда использовать?**
Это полезно, если вы работаете с проектами, которые используют старые версии пакетов, и вы не хотите обновлять их или сталкиваться с конфликтами версий.

### Execute пакетов и команд (скриптов) npm

`npm exec` и `npx` работают одинаково: они оба позволяют запускать пакеты без глобальной установки. Разница в том, что `npm exec` — это **более современная и интегрированная команда**, доступная в npm 7+, а `npx` — это отдельная утилита, которая была введена раньше.

Существует два способа запуска пакетов npm:

`npm exec eslint .` или `npx eslint .` // если eslint установлен, он запустит оттуда, если нет - временно eslint установится в кеш npm, выполнится команда и удалится из кэша

Запуск команды (скрипта) из package.json:

`npm exec my-script` или `npx my-script`

В npm exec войной дефис -- как разделитель м/у опциями команды и её аргументами:

`npm exec eslint -- --version` - показывает версию eslint // ESLint v9.21.0

`npm --version exec eslint` - показывает версию npm // node v10.9.2

### Команды инсталяции

|**Характеристика**|**`npm install`**|**`npm ci (clean install)`**|
|------------------|-----------------|------------|
|**Удаляет `node_modules`**|Нет|Да|
|**Использует `package-lock.json`**|Да (но может обновить на основе package.json)|Да (строго, без изменений)|
|**Требует `package-lock.json`**|Нет (может создать его)|Да (иначе ошибка)|
|**Изменяет `package-lock.json`**|Да (если версии в `package.json` изменились)|Нет|
|**Скорость**|Медленнее (анализирует зависимости)|Быстрее (работает строго по `package-lock.json`)|
|**Использование**|Локальная разработка, добавление зависимостей|CI/CD, воспроизводимые сборки|

### Полезные команды

`npm ls` - отображения дерева зависимостей вашего проекта (в текущей папке);

`npm ls -g` - отображение дерева глобально установленных пакетов в вашей системе;

`npm ls --long` - доп. инфа о каждом пакете (н/р, лицензию и описание);

`npm ls --depth 1 -g` - позволяет управлять глубиной отображения этого дерева (по дефолту 0);

### Конфигурации npm

Файл ~/.npmrc (npm runtime configuration) — это конфигурационный файл, используемый Node Package Manager для управления настройками, связанными с установкой и управлением пакетами в проектах на Node.js. Этот файл позволяет настраивать различные параметры, такие как репозитории пакетов, токены доступа, прокси и другие опции.

---

[4.2.1.0.1 Homebrew Theme](./4.2.1.0.1%20Homebrew.md) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [4.2.1.1 Simulator Theme](../4.2.1.1%20Simulator.md)
