В чем отличие dependencies от devDependencies
Что проверяют
Понимаете ли вы, на что на самом деле влияет раздел в package.json. Самый частый уточняющий вопрос: попадёт ли пакет из devDependencies в бандл, если импортировать его в коде приложения.
Как отвечать
dependencies: пакеты, нужные коду во время работы.npm install имякладёт пакет сюда по умолчанию;devDependencies: инструменты разработки и сборки: Vite или webpack, TypeScript, ESLint, Vitest или Jest,@types/*. Ставятся с флагом-D(--save-dev).
Разделение влияет на две вещи. Первая это установка: npm ci --omit=dev или установка при NODE_ENV=production пропускает devDependencies, а старый флаг --production устарел. Вторая это публикация библиотек: тот, кто установит вашу библиотеку, получит только её dependencies, а devDependencies останутся у вас.
Для фронтенд-приложения важно понимать, чего это разделение не делает: оно не влияет на бандл. Сборщик включает то, что импортировано в коде, а в каком разделе записан пакет, ему безразлично. Импортировали библиотеку из devDependencies в компонент, и она попала в сборку. Не импортировали библиотеку из dependencies, и в бандле её нет.
Отсюда практика. SPA собирается в Docker в два этапа: на этапе сборки нужен полный npm ci, иначе не будет Vite и TypeScript, а в итоговый образ попадает только статика для nginx. У SSR-приложения на Next.js или Nuxt сервер в рантайме читает node_modules, и тут разделение уже экономит размер образа.
Стоит упомянуть соседние разделы: peerDependencies для библиотек, которые рассчитывают на React или Vue из проекта хоста (npm с седьмой версии ставит их автоматически), и optionalDependencies для пакетов, без которых установка не должна падать.
Где спотыкаются
Говорят, что devDependencies «не попадают в сборку». Для бандла это неверно, решают импорты.
Ставят в Dockerfile npm ci --omit=dev перед npm run build и получают упавшую сборку без сборщика.
Кладут React в dependencies своей библиотеки компонентов вместо peerDependencies. При несовпадении версий у пользователя окажутся две копии React и ошибки хуков.