<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[NPM: Полный справочник для опытных разработчиков]]></title><description><![CDATA[<p dir="auto">Node Package Manager (npm) — это не просто инструмент для установки пакетов, а полнофункциональная экосистема управления зависимостями, публикации модулей и автоматизации рабочих процессов. Для опытного разработчика важно понимать не только базовые команды, но и тонкие механизмы версионирования, разрешения зависимостей, оптимизации и лучшие практики при разработке собственных библиотек.</p>
<h2>1. Архитектура и базовые концепции</h2>
<h3>1.1 Структура реестра и локального хранилища</h3>
<p dir="auto">npm состоит из трёх ключевых компонентов:</p>
<ul>
<li><strong>Реестр npm</strong> (<code>registry.npmjs.org</code>) — центральный репозиторий всех опубликованных пакетов с метаданными</li>
<li><strong>npm CLI</strong> — локальный инструмент для взаимодействия с реестром и управления проектами</li>
<li><strong>node_modules</strong> — локальное хранилище установленных пакетов в вашем проекте</li>
</ul>
<pre><code class="language-bash"># Проверка текущего реестра
npm config get registry

# Изменение реестра (например, на зеркало)
npm config set registry https://registry.yarnpkg.com
</code></pre>
<h3>1.2 Семантическое версионирование (semver)</h3>
<p dir="auto">Версии пакетов следуют формату <code>MAJOR.MINOR.PATCH</code>:</p>
<pre><code>^1.2.3  — совместимо с версиями 1.x.x (изменения в minor и patch)
~1.2.3  — совместимо с версиями 1.2.x (изменения только в patch)
1.2.3   — точная версия
&gt;=1.2.3 — 1.2.3 и выше
1.2.3 - 2.0.0 — диапазон версий
</code></pre>
<h2>2. Управление зависимостями</h2>
<h3>2.1 Типы зависимостей в package.json</h3>
<pre><code class="language-json">{
  "dependencies": {
    "express": "^4.18.2"
  },
  "devDependencies": {
    "typescript": "^5.0.0",
    "jest": "^29.0.0"
  },
  "peerDependencies": {
    "react": "&gt;=16.8.0",
    "react-dom": "&gt;=16.8.0"
  },
  "optionalDependencies": {
    "bcrypt": "^5.0.0"
  },
  "bundledDependencies": [
    "lodash"
  ]
}
</code></pre>
<p dir="auto"><strong>Ключевые отличия:</strong></p>
<ul>
<li><code>dependencies</code> — необходимы в production</li>
<li><code>devDependencies</code> — нужны только для разработки (не устанавливаются при <code>npm install --production</code>)</li>
<li><code>peerDependencies</code> — указывают, какие версии других библиотек ожидаются в проекте-потребителе</li>
<li><code>optionalDependencies</code> — пакеты, которые не должны ломать установку при ошибке</li>
<li><code>bundledDependencies</code> — пакеты, которые включаются в распределение npm</li>
</ul>
<h3>2.2 Алгоритм разрешения зависимостей</h3>
<p dir="auto">npm использует <strong>flat tree algorithm</strong> (начиная с npm 3+):</p>
<pre><code>project/
├── node_modules/
│   ├── express/ (версия 4.18.2)
│   ├── body-parser/ (зависимость express)
│   └── debug/ (зависимость body-parser)
</code></pre>
<p dir="auto">При конфликтах версий npm размещает дополнительные копии на уровне зависимостей:</p>
<pre><code>project/
├── node_modules/
│   ├── packageA@1.0.0/
│   │   └── node_modules/
│   │       └── packageB@2.0.0/ (конфликт версии)
│   └── packageB@1.0.0/
</code></pre>
<h3>2.3 Lock-файлы и воспроизводимость</h3>
<pre><code class="language-bash"># package-lock.json — точная фиксация всех версий (npm)
npm install

# npm-shrinkwrap.json — публикуется вместе с пакетом
npm shrinkwrap

# Игнорирование lock-файла при установке
npm install --no-save
</code></pre>
<h2>3. Установка пакетов из различных источников</h2>
<h3>3.1 Установка из npm реестра</h3>
<pre><code class="language-bash"># Последняя версия
npm install express

# Конкретная версия
npm install express@4.17.1

# Диапазон версий
npm install "express@&gt;=4.17.0 &lt;5.0.0"

# Последняя beta-версия
npm install express@latest-beta

# Dev-зависимость
npm install --save-dev typescript

# Global установка
npm install -g pm2

# Без сохранения в package.json
npm install lodash --no-save
</code></pre>
<h3>3.2 Установка из GitHub</h3>
<pre><code class="language-bash"># Из главной ветки репозитория
npm install github:username/repository

# Из определённой ветки
npm install github:username/repository#branch-name

# Из конкретного коммита
npm install github:username/repository#commit-sha

# С прямым URL на репозиторий
npm install https://github.com/username/repository.git

# Из приватного репозитория (требует токена)
npm install git+https://github.com/username/private-repo.git
</code></pre>
<p dir="auto"><strong>Конфигурация для приватных репозиториев:</strong></p>
<pre><code class="language-bash"># Глобально для github.com
npm config set git+https://github.com/:_authToken YOUR_TOKEN

# Или через .npmrc
echo "//github.com/:_authToken=YOUR_TOKEN" &gt;&gt; ~/.npmrc
</code></pre>
<h3>3.3 Локальная установка пакетов</h3>
<pre><code class="language-bash"># Установка из локальной папки (npm)
npm install ../my-local-package

# Через npm link (создаёт symlink)
cd ~/my-library
npm link
cd ~/my-project
npm link my-library

# Прямой путь в package.json
{
  "dependencies": {
    "my-package": "file:../my-local-package"
  }
}

# Установка из tar-архива
npm install ./package.tar.gz

# Установка из zip
npm install ./package.zip
</code></pre>
<p dir="auto"><strong>Особенность npm link:</strong> создаёт глобальную symlink-ссылку, которая работает с различными проектами для локальной разработки.</p>
<h3>3.4 Установка с пользовательского реестра</h3>
<pre><code class="language-bash"># Конкретный реестр для scoped-пакета
npm config set @myorg:registry https://private-registry.example.com

# Или в .npmrc
@myorg:registry=https://private-registry.example.com
//private-registry.example.com/:_authToken=TOKEN

# Установка из приватного реестра
npm install @myorg/private-package
</code></pre>
<h2>4. Жизненный цикл npm скриптов и хуки</h2>
<h3>4.1 Полный жизненный цикл npm команд</h3>
<p dir="auto">npm имеет систему хуков, которые выполняются на разных этапах выполнения команд. Это позволяет автоматизировать разработку и развертывание приложений.</p>
<p dir="auto"><strong>Общий порядок выполнения:</strong></p>
<pre><code>pre&lt;command&gt; → &lt;command&gt; → post&lt;command&gt;
</code></pre>
<p dir="auto">Каждая npm команда может быть окружена <code>pre</code> и <code>post</code> скриптами, которые выполняются автоматически.</p>
<h3>4.2 Жизненный цикл install и postinstall</h3>
<p dir="auto"><code>postinstall</code> — это один из самых важных и часто используемых хуков в npm. Он выполняется <strong>сразу после успешной установки зависимостей</strong>.</p>
<p dir="auto"><strong>Когда выполняется:</strong></p>
<ol>
<li>После <code>npm install</code> (установка всех зависимостей)</li>
<li>После <code>npm ci</code> (clean install)</li>
<li>После любой операции, которая модифицирует <code>node_modules</code> (например, <code>npm link</code>)</li>
<li><strong>Для каждого пакета отдельно</strong> — если пакет имеет собственный <code>postinstall</code>, он выполняется при установке этого пакета</li>
</ol>
<p dir="auto"><strong>Для чего нужен:</strong></p>
<ul>
<li>Компиляция нативных модулей (например, <code>node-gyp</code> для пакетов с C++ кодом)</li>
<li>Создание необходимых директорий и файлов конфигурации</li>
<li>Загрузка дополнительных ресурсов</li>
<li>Генерация типов TypeScript или документации</li>
<li>Инициализация пакета</li>
<li>Установка Git хуков (например, через <code>husky</code>)</li>
<li>Кэширование или оптимизация</li>
</ul>
<p dir="auto"><strong>Пример использования в package.json:</strong></p>
<pre><code class="language-json">{
  "name": "my-app",
  "version": "1.0.0",
  "scripts": {
    "postinstall": "node scripts/setup.js &amp;&amp; npm run build:types",
    "build:types": "tsc --emitDeclarationOnly"
  }
}
</code></pre>
<p dir="auto"><strong>Практический пример — установка Git хуков через Husky:</strong></p>
<pre><code class="language-json">{
  "name": "my-project",
  "devDependencies": {
    "husky": "^8.0.0"
  },
  "scripts": {
    "postinstall": "husky install"
  }
}
</code></pre>
<p dir="auto">При выполнении <code>npm install</code> будут автоматически установлены Git хуки.</p>
<p dir="auto"><strong>Пример — компиляция нативных модулей:</strong></p>
<p dir="auto">Для пакетов типа <code>node-sqlite3</code> или <code>bcrypt</code>, которые содержат нативный код:</p>
<pre><code class="language-json">{
  "name": "sqlite3",
  "scripts": {
    "postinstall": "node-gyp rebuild"
  }
}
</code></pre>
<h3>4.3 Полный цикл жизненных циклов npm команд</h3>
<p dir="auto"><strong>Цикл для <code>npm install</code>:</strong></p>
<pre><code>preinstall → install → postinstall
</code></pre>
<p dir="auto"><strong>Цикл для <code>npm version</code>:</strong></p>
<pre><code>preversion → version → postversion
</code></pre>
<p dir="auto"><strong>Цикл для <code>npm publish</code>:</strong></p>
<pre><code>prepublishOnly → prepare → prepublish → publish → postpublish
</code></pre>
<p dir="auto"><strong>Цикл для пользовательских скриптов:</strong></p>
<pre><code class="language-bash">npm run build
# Выполнится в этом порядке:
# 1. prebuild (если существует)
# 2. build
# 3. postbuild (если существует)
</code></pre>
<h3>4.4 Другие важные хуки</h3>
<h4>preinstall</h4>
<p dir="auto">Выполняется <strong>перед</strong> установкой зависимостей. Используется редко.</p>
<p dir="auto"><strong>Для чего:</strong></p>
<ul>
<li>Проверка версии Node.js</li>
<li>Предварительная валидация окружения</li>
<li>Отказ в установке если не соблюдены требования</li>
</ul>
<pre><code class="language-json">{
  "scripts": {
    "preinstall": "node -v &amp;&amp; npm -v"
  }
}
</code></pre>
<h4>prepare</h4>
<p dir="auto">Выполняется:</p>
<ul>
<li>После <code>npm install</code></li>
<li>После <code>npm ci</code></li>
<li>Перед <code>npm publish</code></li>
<li>Когда пакет устанавливается из Git репозитория</li>
</ul>
<p dir="auto"><strong>Для чего:</strong></p>
<ul>
<li>Компиляция TypeScript в JavaScript</li>
<li>Генерация файлов</li>
<li>Подготовка пакета к публикации</li>
</ul>
<p dir="auto">Часто используется вместо <code>postinstall</code> для более надёжного выполнения.</p>
<pre><code class="language-json">{
  "scripts": {
    "prepare": "npm run build",
    "build": "tsc"
  }
}
</code></pre>
<h4>prepublishOnly</h4>
<p dir="auto">Выполняется <strong>только перед публикацией</strong> (<code>npm publish</code>), но не при локальной установке.</p>
<p dir="auto"><strong>Для чего:</strong></p>
<ul>
<li>Запуск тестов перед публикацией</li>
<li>Проверка версии</li>
<li>Очистка артефактов</li>
<li>Финальная валидация кода</li>
</ul>
<pre><code class="language-json">{
  "scripts": {
    "prepublishOnly": "npm run test &amp;&amp; npm run lint &amp;&amp; npm run build"
  }
}
</code></pre>
<p dir="auto"><strong>Различие между <code>prepare</code> и <code>prepublishOnly</code>:</strong></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Хук</th>
<th>npm install</th>
<th>npm ci</th>
<th>npm publish</th>
<th>Git install</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>prepare</code></td>
<td><img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=a1e94250dac" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /></td>
<td><img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=a1e94250dac" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /></td>
<td><img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=a1e94250dac" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /></td>
<td><img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=a1e94250dac" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /></td>
</tr>
<tr>
<td><code>prepublishOnly</code></td>
<td><img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/274c.png?v=a1e94250dac" class="not-responsive emoji emoji-android emoji--x" style="height:23px;width:auto;vertical-align:middle" title="❌" alt="❌" /></td>
<td><img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/274c.png?v=a1e94250dac" class="not-responsive emoji emoji-android emoji--x" style="height:23px;width:auto;vertical-align:middle" title="❌" alt="❌" /></td>
<td><img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=a1e94250dac" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /></td>
<td><img src="https://forum.exlends.ru/assets/plugins/nodebb-plugin-emoji/emoji/android/274c.png?v=a1e94250dac" class="not-responsive emoji emoji-android emoji--x" style="height:23px;width:auto;vertical-align:middle" title="❌" alt="❌" /></td>
</tr>
</tbody>
</table>
<h4>postversion</h4>
<p dir="auto">Выполняется после обновления версии в <code>package.json</code> с помощью <code>npm version</code>.</p>
<p dir="auto"><strong>Для чего:</strong></p>
<ul>
<li>Автоматический коммит и тег в Git</li>
<li>Публикация пакета</li>
<li>Уведомление о новой версии</li>
</ul>
<pre><code class="language-json">{
  "scripts": {
    "postversion": "git push &amp;&amp; git push --tags &amp;&amp; npm publish"
  }
}
</code></pre>
<h3>4.5 Цикл для глобальной установки пакетов</h3>
<p dir="auto">Когда устанавливается глобальный пакет с <code>npm install -g</code>, хуки работают иначе:</p>
<pre><code class="language-bash">npm install -g my-cli-tool
# Выполнится: preinstall → install → postinstall
</code></pre>
<p dir="auto">Но для глобальных пакетов <code>postinstall</code> должен выполняться с осторожностью, так как может повлиять на всю систему.</p>
<h3>4.6 Практический пример комплексного использования хуков</h3>
<pre><code class="language-json">{
  "name": "@company/my-library",
  "version": "1.2.0",
  "scripts": {
    "preinstall": "node scripts/check-node-version.js",
    "postinstall": "husky install &amp;&amp; npm run generate:types",
    "prepare": "npm run build",
    "prebuild": "npm run clean &amp;&amp; npm run lint",
    "build": "tsc &amp;&amp; esbuild src/index.ts --bundle --outfile=dist/index.js",
    "postbuild": "npm run test",
    "prepublishOnly": "npm run test:full &amp;&amp; npm run audit",
    "postpublish": "npm run notify:slack",
    "postversion": "git push &amp;&amp; git push --tags"
  }
}
</code></pre>
<p dir="auto"><strong>Порядок выполнения при различных командах:</strong></p>
<p dir="auto"><strong>При <code>npm install</code>:</strong></p>
<pre><code>1. preinstall (проверка версии Node.js)
2. postinstall (установка Git хуков и генерация типов)
3. prepare (компиляция кода)
</code></pre>
<p dir="auto"><strong>При <code>npm run build</code>:</strong></p>
<pre><code>1. prebuild (очистка, линтинг)
2. build (основная компиляция)
3. postbuild (запуск тестов)
</code></pre>
<p dir="auto"><strong>При <code>npm publish</code>:</strong></p>
<pre><code>1. prepublishOnly (полное тестирование и аудит)
2. prepare (компиляция)
3. publish (публикация в npm)
4. postpublish (уведомление в Slack)
</code></pre>
<p dir="auto"><strong>При <code>npm version patch</code>:</strong></p>
<pre><code>1. preversion (проверки)
2. version (обновление версии)
3. postversion (Git push и публикация)
</code></pre>
<h2>5. Разработка и публикация собственных библиотек</h2>
<h3>5.1 Инициализация и структура проекта</h3>
<pre><code class="language-bash">npm init -y
npm link
</code></pre>
<p dir="auto"><strong>Структура стандартной библиотеки:</strong></p>
<pre><code>my-library/
├── package.json
├── package-lock.json
├── README.md
├── .npmignore                 # Что исключить из публикации
├── .gitignore
├── src/
│   └── index.ts
├── dist/                      # Скомпилированный код
├── types/                     # TypeScript definitions
├── tests/
└── .github/workflows/         # CI/CD
</code></pre>
<h3>5.2 Конфигурация package.json для библиотеки</h3>
<pre><code class="language-json">{
  "name": "@username/my-library",
  "version": "1.0.0",
  "description": "Краткое описание",
  "main": "dist/index.js",
  "types": "types/index.d.ts",
  "exports": {
    ".": {
      "import": "./dist/index.mjs",
      "require": "./dist/index.js",
      "types": "./types/index.d.ts"
    },
    "./package.json": "./package.json"
  },
  "files": [
    "dist",
    "types",
    "README.md"
  ],
  "scripts": {
    "build": "tsc &amp;&amp; esbuild src/index.ts --bundle --outfile=dist/index.js",
    "test": "jest",
    "prepublishOnly": "npm run build &amp;&amp; npm run test",
    "version": "npm run format &amp;&amp; git add -A src"
  },
  "keywords": [
    "useful",
    "keywords"
  ],
  "author": "Your Name",
  "license": "MIT",
  "peerDependencies": {
    "react": "&gt;=16.8.0"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/username/my-library.git"
  },
  "bugs": {
    "url": "https://github.com/username/my-library/issues"
  },
  "homepage": "https://github.com/username/my-library#readme"
}
</code></pre>
<p dir="auto"><strong>Критические поля:</strong></p>
<ul>
<li><code>main</code> — entry point для CommonJS</li>
<li><code>types</code> — путь к TypeScript definitions</li>
<li><code>exports</code> — conditional exports для разных модульных систем</li>
<li><code>files</code> — массив файлов/папок для включения в пакет</li>
<li><code>prepublishOnly</code> — выполняется перед публикацией</li>
</ul>
<h3>5.3 Настройка для ESM и CJS одновременно</h3>
<pre><code class="language-json">{
  "exports": {
    ".": {
      "types": "./dist/index.d.ts",
      "import": "./dist/index.mjs",
      "require": "./dist/index.js"
    },
    "./package.json": "./package.json"
  }
}
</code></pre>
<p dir="auto"><strong>Скрипт build для обеих систем:</strong></p>
<pre><code class="language-bash"># package.json scripts
"build": "npm run build:cjs &amp;&amp; npm run build:esm",
"build:cjs": "tsc --module commonjs --outDir dist --declaration",
"build:esm": "tsc --module es2020 --outDir dist --outFileExtension .mjs"
</code></pre>
<h3>5.4 Публикация в npm</h3>
<pre><code class="language-bash"># Версионирование
npm version major    # 1.0.0 → 2.0.0
npm version minor    # 1.0.0 → 1.1.0
npm version patch    # 1.0.0 → 1.0.1

# Публикация (требует npm аккаунт)
npm login
npm publish

# Публикация scoped-пакета как public
npm publish --access public

# Pre-release версия
npm publish --tag beta
npm install my-package@beta

# Распубликование старой версии
npm publish --force

# Отмена публикации (только в первые 72 часа)
npm unpublish my-package@1.0.0
</code></pre>
<h3>5.5 CI/CD для автоматической публикации</h3>
<p dir="auto"><strong>.github/workflows/publish.yml:</strong></p>
<pre><code class="language-yaml">name: Publish to npm
on:
  push:
    tags:
      - 'v*'
jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '18'
          registry-url: 'https://registry.npmjs.org'
      - run: npm ci
      - run: npm run build
      - run: npm run test
      - run: npm publish
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
</code></pre>
<h2>6. Оптимизация и производительность</h2>
<h3>6.1 Анализ размера bundle</h3>
<pre><code class="language-bash"># Анализ зависимостей
npm ls

# Размер пакета перед публикацией
npm pack

# Отчёт об использовании диска
npm ls --depth=0

# Поиск дублирующихся версий
npm dedupe
</code></pre>
<h3>6.2 Виртуальные зависимости и workspaces</h3>
<pre><code class="language-bash"># Инициализация монорепозитория
npm init -w ./packages/package-a
npm init -w ./packages/package-b
</code></pre>
<p dir="auto"><strong>root package.json:</strong></p>
<pre><code class="language-json">{
  "name": "my-monorepo",
  "private": true,
  "workspaces": [
    "packages/*"
  ]
}
</code></pre>
<p dir="auto"><strong>Команды для workspaces:</strong></p>
<pre><code class="language-bash"># Установка для всех workspaces
npm install

# Запуск скрипта для конкретного workspace
npm run build -w ./packages/package-a

# Добавление зависимости в workspace
npm install lodash -w ./packages/package-a

# Линк между internal пакетами автоматический
</code></pre>
<h3>6.3 Снижение размера установки</h3>
<pre><code class="language-bash"># Production-only установка (без devDependencies)
npm install --production

# Чистка кэша
npm cache clean --force

# Деструктивная оптимизация (удаление дублей)
npm dedupe --force

# Игнорирование опциональных зависимостей
npm install --no-optional
</code></pre>
<h2>7. Продвинутые техники</h2>
<h3>7.1 npm scripts и автоматизация</h3>
<pre><code class="language-json">{
  "scripts": {
    "test": "jest",
    "test:watch": "jest --watch",
    "test:coverage": "jest --coverage",
    "prebuild": "npm run clean",
    "build": "tsc",
    "postbuild": "npm run test",
    "start": "node dist/index.js",
    "dev": "ts-node src/index.ts",
    "lint": "eslint src --fix",
    "format": "prettier --write 'src/**/*'",
    "precommit": "npm run lint &amp;&amp; npm run test"
  }
}
</code></pre>
<p dir="auto"><strong>Жизненный цикл скриптов:</strong></p>
<ul>
<li><code>pre{script}</code> — выполняется перед скриптом</li>
<li><code>{script}</code> — сам скрипт</li>
<li><code>post{script}</code> — выполняется после скрипта</li>
</ul>
<h3>7.2 Переменные окружения и конфигурация</h3>
<pre><code class="language-bash"># npm-переменные доступны в скриптах через process.env
npm_package_name
npm_package_version
npm_package_main

# Передача переменных
npm run build -- --production

# Конфигурация через .npmrc
npm-auth-token=abc123
registry=https://registry.npmjs.org
</code></pre>
<h3>7.3 Работа с приватными пакетами</h3>
<p dir="auto"><strong>.npmrc для приватного реестра:</strong></p>
<pre><code>@myorg:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=github_token
</code></pre>
<p dir="auto">Или переменная окружения:</p>
<pre><code class="language-bash">export NPM_TOKEN=your_token
echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" &gt; ~/.npmrc
</code></pre>
<h3>7.4 Версионирование и теги</h3>
<pre><code class="language-bash"># Публикация на конкретный тег
npm publish --tag experimental
npm install my-package@experimental

# Перемещение тега
npm dist-tag add my-package@1.0.0 latest
npm dist-tag rm my-package experimental

# Просмотр всех тегов пакета
npm dist-tag ls my-package
</code></pre>
<h2>8. Отладка и диагностика</h2>
<h3>8.1 Логирование и verbose-режим</h3>
<pre><code class="language-bash"># Подробный лог всех операций
npm install --verbose

# Максимальный уровень логирования
npm --loglevel verbose install

# Очистка логов
npm cache clean --force

# Проверка целостности установки
npm audit
npm audit fix
</code></pre>
<h3>8.2 Разрешение проблем с зависимостями</h3>
<pre><code class="language-bash"># Поиск конфликтов peer-зависимостей
npm ls

# Принудительное переустановление
npm ci  # clean install с lock-файла

# Очистка node_modules
rm -rf node_modules package-lock.json
npm install

# Диагностика проблем с путями
npm config get prefix
npm list -g

# Удаление осиротевших пакетов
npm prune
npm prune --production
</code></pre>
<h3>8.3 Отладка хуков и скриптов</h3>
<pre><code class="language-bash"># Просмотр всех конфигурированных скриптов
npm run

# Выполнение скрипта с максимальным логированием
npm run build --verbose

# Проверка конкретного хука (без фактического выполнения)
npm run --dry-run postinstall

# Просмотр переменных окружения доступных в скриптах
npm run env
</code></pre>
<h2>9. Лучшие практики</h2>
<h3>При разработке библиотек:</h3>
<ul>
<li>Используйте <code>exports</code> для условных импортов вместо <code>main</code></li>
<li>Поставляйте TypeScript definitions или используйте <code>@types</code></li>
<li>Регулярно запускайте <code>npm audit</code> для проверки уязвимостей</li>
<li>Поддерживайте <code>peerDependencies</code> в актуальном состоянии</li>
<li>Используйте semantic versioning строго</li>
<li>Документируйте breaking changes в CHANGELOG</li>
<li>Автоматизируйте публикацию через CI/CD</li>
<li>Используйте <code>prepublishOnly</code> для финальной валидации перед публикацией</li>
<li>Используйте <code>postinstall</code> для инициализации необходимых ресурсов (Git хуки, компиляция нативного кода)</li>
</ul>
<h3>При работе с зависимостями:</h3>
<ul>
<li>Регулярно обновляйте пакеты: <code>npm update</code></li>
<li>Проверяйте уязвимости: <code>npm audit</code></li>
<li>Используйте lock-файлы в version control</li>
<li>Минимизируйте количество зависимостей</li>
<li>Проверяйте лицензии: <code>npm ls --depth=0</code></li>
<li>Избегайте использования <code>postinstall</code> в публичных пакетах если это не критично (замедляет установку)</li>
</ul>
<h3>При локальной разработке:</h3>
<ul>
<li>Используйте <code>npm link</code> для синхронной разработки нескольких пакетов</li>
<li>Настройте правильные <code>.npmignore</code> и <code>files</code> поля</li>
<li>Тестируйте локально через <code>npm pack</code> перед публикацией</li>
<li>Используйте workspaces для монорепозиториев</li>
<li>Проверяйте выполнение хуков локально перед коммитом</li>
<li>Используйте <code>npm run --dry-run</code> для тестирования скриптов</li>
</ul>
<h3>При настройке хуков:</h3>
<ul>
<li>Всегда заканчивайте <code>postinstall</code> скрипты успешно (exit code 0)</li>
<li>Избегайте долгих операций в <code>postinstall</code> (замедляют установку)</li>
<li>Используйте <code>prepare</code> вместо <code>postinstall</code> для более надёжного выполнения в различных сценариях</li>
<li>Используйте <code>prepublishOnly</code> для критических проверок перед публикацией</li>
<li>Документируйте, что делают ваши хуки в README</li>
<li>Тестируйте хуки в CI/CD среде перед публикацией</li>
</ul>
<h2>Заключение</h2>
<p dir="auto">npm — это мощный инструмент, который выходит далеко за пределы простой установки пакетов. Понимание системы жизненного цикла и хуков (особенно <code>postinstall</code> и <code>prepublishOnly</code>) позволяет автоматизировать критические операции и обеспечивает надёжное развертывание приложений. Для опытного разработчика овладение механизмами разрешения зависимостей, публикации собственных библиотек, настройки хуков и оптимизации рабочих процессов — критически важно для создания надёжных и масштабируемых проектов. Глубокое знание npm позволяет избежать множества типичных ошибок и значительно ускоряет разработку.</p>
]]></description><link>https://forum.exlends.ru/topic/362/npm-polnyj-spravochnik-dlya-opytnyh-razrabotchikov</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:12:08 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/362.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 22 Dec 2025 13:50:35 GMT</pubDate><ttl>60</ttl></channel></rss>