Модули, npm, package.json
↑ 6.1 Node.js изнутри · ← Предыдущая · → Следующая
Зачем это на собесе
Базовые вопросы: CommonJS против ES modules, версии зависимостей, lock-файл.
Объяснение
| Система | Синтаксис | Особенности |
|---|---|---|
| CommonJS | require, module.exports | синхронная загрузка, значения кэшируются |
| ES modules | import/export | статический анализ, асинхронная загрузка, "type": "module" |
{
"name": "orders-api",
"version": "1.0.0",
"type": "module",
"scripts": { "dev": "tsx watch src/main.ts", "build": "tsc", "test": "vitest" },
"dependencies": { "fastify": "^4.28.0" },
"devDependencies": { "typescript": "~5.5.0" },
"engines": { "node": ">=20" }
}Семантическое версионирование (major.minor.patch): ^4.28.0 разрешает minor и patch, ~5.5.0 — только patch. package-lock.json фиксирует точные версии и хэши; в CI используйте npm ci (строго по lock-файлу, быстрее и воспроизводимо).
| Менеджер | Особенности |
|---|---|
| npm | стандарт |
| pnpm | жёсткие ссылки, экономия диска, строгая структура зависимостей |
| yarn | workspaces, plug’n’play |
Нюансы и подводные камни
dependenciesиdevDependencies: в образ продакшена ставьте только первые (npm ci --omit=dev).- Цепочки транзитивных зависимостей — риск supply chain:
npm audit, фиксация версий, проверка пакетов. - Скрипты
postinstallвыполняют код при установке. - Смешение CJS и ESM даёт ошибки (
ERR_REQUIRE_ESM,__dirnameотсутствует в ESM). - Не коммитьте
node_modules; коммитьте lock-файл.
Практика
- Настройте проект на ESM с TypeScript.
- Сравните время установки npm и pnpm.
- Выполните
npm auditи разберите найденные уязвимости.
Вопросы с ответами
Чем npm ci отличается от npm install?
ciставит строго по lock-файлу, удаляетnode_modulesи падает при расхождении сpackage.json; предназначен для CI.
Что значит ^1.2.3?
Любая версия
>=1.2.3и<2.0.0.
CommonJS или ESM?
Для новых проектов ESM; CJS остаётся в legacy-коде.