Как установить проект без devDependencies?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как установить проект без devDependencies?
Часто нужно установить зависимости проекта БЕЗ инструментов разработки (тестирование, линтинг, сборка и т.д.). Это нужно для production окружения, чтобы снизить размер node_modules и ускорить деплой.
Метод 1: npm install --production
Это самый простой и популярный способ.
# Установить только production зависимости
npm install --production
# Или альтернативный флаг
npm install --omit=dev
Что происходит:
- Устанавливаются только пакеты из
"dependencies"в package.json - Пакеты из
"devDependencies"НЕ устанавливаются - Размер node_modules значительно меньше
Пример package.json
{
"dependencies": {
"react": "^19.0.0",
"next": "^16.0.0",
"axios": "^1.6.0"
},
"devDependencies": {
"@types/node": "^20.0.0",
"typescript": "^5.0.0",
"eslint": "^8.0.0",
"jest": "^29.0.0",
"prettier": "^3.0.0"
}
}
# npm install --production установит:
# react, next, axios
# НЕ установит:
# @types/node, typescript, eslint, jest, prettier
Метод 2: NODE_ENV переменная
Часто используется при деплое.
# Linux/Mac
NODE_ENV=production npm install
# Windows (PowerShell)
$env:NODE_ENV='production'; npm install
# Windows (cmd)
set NODE_ENV=production && npm install
Как это работает:
- npm проверяет переменную NODE_ENV
- Если она = production, устанавливает только production зависимости
- Это поведение по умолчанию для npm
Метод 3: npm ci --production
Для CI/CD окружения (более надёжно, чем npm install).
# Установить точные версии из package-lock.json без dev зависимостей
npm ci --production
# Или
npm ci --omit=dev
Разница npm install vs npm ci:
npm install- обновляет package-lock.json если нужноnpm ci- использует точные версии из package-lock.jsonnpm ciболее стабилен и надёжен для CI/CD
Метод 4: Selective dependency installation
Если ты используешь monorepo или нужны не все пакеты.
# Установить конкретные пакеты
npm install package1 package2 package3
# Установить пакет в production
npm install package-name --save
# Установить пакет в dev
npm install package-name --save-dev
Pnpm альтернатива
Если используешь pnpm:
# Установить без dev зависимостей
pnpm install --prod
# Или
pnpm install --production
Yarn альтернатива
Если используешь yarn:
# Установить без dev зависимостей
yarn install --production
# Или (yarn 2+)
yarn install --mode=production
Практический пример: Docker
Часто используется при сборке Docker образа.
# Dockerfile
FROM node:20-alpine
WORKDIR /app
# Копировать package файлы
COPY package*.json ./
# Stage 1: Установить ВСЕ зависимости для сборки
RUN npm install
# Собрать приложение
RUN npm run build
# Stage 2: Production образ
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
# Установить ТОЛЬКО production зависимости
RUN npm install --production
# Копировать собранное приложение из stage 1
COPY --from=0 /app/.next ./.next
COPY --from=0 /app/public ./public
# Стартовать приложение
CMD ["npm", "start"]
Почему это хорошо:
- Первый образ большой (со всеми dev зависимостями)
- Второй образ маленький (только production зависимости)
- Финальный образ для деплоя маленький и быстрый
CI/CD Pipeline пример
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '20'
# Build step: нужны все зависимости
- run: npm install
- run: npm run build
- run: npm run test
# Production: без dev зависимостей
- run: npm install --production
# Деплой
- run: npm start
Что попадёт в production
node_modules/
├── react/
├── next/
├── axios/
├── ... другие production зависимости
ПОПУЛЯРНЫЕ devDependencies (которые НЕ будут установлены):
├── typescript
├── eslint
├── prettier
├── jest
├── vitest
├── @types/*
├── webpack
├── babel
├── postcss
├── tailwindcss (для разработки, если не нужен runtime)
Как проверить, что devDependencies не установлены
# Посмотреть что установилось
ls node_modules/
# Проверить через npm
npm list --production
# Должны видеть ТОЛЬКО production пакеты
npm list
Потенциальные проблемы и решения
Проблема 1: Код зависит от devDependency
// Это неправильно!
import { render } from '@testing-library/react'; // devDependency!
export function MyComponent() {
// ...
}
Решение: Перемести в dependencies
npm install @testing-library/react --save
Проблема 2: TypeScript не компилируется
Если TypeScript в devDependencies, но нужен для production:
# Перемести TypeScript в dependencies
npm uninstall --save-dev typescript
npm install --save typescript
Проблема 3: Переменные окружения не работают
Если приложение использует dotenv:
# dotenv должен быть в dependencies
npm install dotenv
Оптимизация размера
# Просмотри размер node_modules
du -sh node_modules/
# Найди тяжёлые пакеты
npm list --depth=0
# Удали неиспользуемые зависимости
npm prune
# С production флагом
npm prune --production
Best Practices
1. Используй package-lock.json
# Всегда коммитьте package-lock.json
git add package-lock.json
2. Регулярно проверяй зависимости
# Найди уязвимости
npm audit
# Обновись
npm audit fix
3. Используй npm ci для CI/CD
# В CI/CD пайплайне всегда
npm ci --production
4. Проверяй что устанавливается
# Перед деплоем
npm ls --production
Размер разницы
С devDependencies:
node_modules/ -> ~500MB
Без devDependencies:
node_modules/ -> ~50MB
В контейнере разница критична для скорости деплоя и холодного старта!
Вывод
Для установки проекта без devDependencies используй:
# Самый простой способ
npm install --production
# Или для CI/CD
npm ci --production
# Или установи NODE_ENV
NODE_ENV=production npm install
Это снизит размер node_modules в 5-10 раз и ускорит деплой на production!