Vue CLI и vue.config.js

Vue CLI формирует поверх Webpack абстракцию конфигурации, скрывая большую часть низкоуровневых деталей сборки за предустановленными шаблонами. Основная точка расширения этой системы — файл vue.config.js, через который осуществляется контроль над внутренним webpack-конфигом без необходимости полного eject-подхода.

Vue CLI не заменяет Webpack, а создает слой управления над ним. Внутри каждого проекта сохраняется полноценная webpack-сборка, включающая entry, output, loaders, plugins, optimization и devServer. Разница заключается в том, что базовая конфигурация генерируется автоматически, а пользовательская логика добавляется декларативно.

Конфигурация сборки в Vue CLI делится на несколько уровней:

  • внутренняя базовая конфигурация (managed webpack config)
  • расширение через vue.config.js
  • цепочная модификация через webpack-chain API
  • прямое переопределение через configureWebpack

Базовый слой включает типовые настройки:

  • режим development/production
  • настройку Babel
  • обработку .vue файлов через vue-loader
  • поддержку CSS preprocessors
  • разделение чанков
  • настройку devServer

vue.config.js выступает как интерфейс к этим слоям.

Структура vue.config.js

Файл vue.config.js экспортирует объект конфигурации или функцию, возвращающую объект. Он выполняет роль центрального файла управления поведением сборки.

Основные поля конфигурации:

  • publicPath
  • outputDir
  • assetsDir
  • indexPath
  • filenameHashing
  • runtimeCompiler
  • transpileDependencies
  • productionSourceMap
  • integrity
  • devServer
  • configureWebpack
  • chainWebpack
  • css
  • pluginOptions

Каждое из этих свойств влияет на отдельный аспект сборки Webpack.

Базовые параметры сборки

publicPath управляет базовым URL для всех ассетов. В Webpack это аналог publicPath в output:

  • при деплое в корень сайта используется “/”
  • при размещении в поддиректории задается “/app/”

outputDir определяет каталог, в который Webpack складывает результат сборки. По умолчанию это dist.

assetsDir задает вложенную структуру для статических ресурсов внутри outputDir. Это влияет на организацию файлов после работы file-loader и url-loader.

filenameHashing включает или отключает добавление hash в имена файлов. В Webpack это связано с contenthash, используемым для кэширования.

configureWebpack и прямое расширение Webpack

configureWebpack позволяет модифицировать итоговый webpack-конфиг напрямую. Поддерживается два режима:

  • объект, который будет слит с базовой конфигурацией
  • функция, принимающая config и возвращающая измененный объект

Пример логики:

  • добавление alias
  • подключение новых plugins
  • изменение optimization
  • расширение resolve

В терминах Webpack это эквивалент глубокого merge с исходной конфигурацией.

Важно учитывать, что configureWebpack не всегда подходит для сложных модификаций, так как не дает точного контроля над порядком loader-ов и структурой rules.

chainWebpack и webpack-chain

chainWebpack предоставляет более низкоуровневый доступ к конфигурации через библиотеку webpack-chain. В отличие от прямого объекта, здесь используется цепочный API, позволяющий точно управлять порядком и структурой правил Webpack.

Основные возможности:

  • добавление и модификация rules
  • управление loaders внутри rules
  • настройка plugins с контролем порядка
  • изменение resolve.alias
  • удаление существующих правил

Пример логики работы:

  • доступ к config.module.rule(‘js’)
  • модификация test-условий
  • добавление loader через use()
  • настройка options loader-а

Webpack-chain особенно важен при работе с vue-loader, babel-loader и style-loader, где порядок выполнения влияет на результат.

Настройка devServer

devServer в vue.config.js управляет webpack-dev-server, который отвечает за локальную разработку.

Ключевые параметры:

  • host — адрес сервера
  • port — порт
  • open — автоматическое открытие браузера
  • proxy — проксирование API запросов
  • hot — горячая перезагрузка модулей
  • static — настройка статики
  • historyApiFallback — поддержка SPA маршрутизации

proxy является критически важной частью при разработке фронтенда с отдельным backend API. Он позволяет перенаправлять запросы без CORS-проблем.

Пример логики proxy:

Это реализуется через http-proxy-middleware внутри Webpack dev server.

Работа с alias и resolve

Alias в Vue CLI позволяет управлять Webpack resolve.alias без прямого редактирования конфигурации.

Часто используемые алиасы:

  • @ -> src
  • components -> src/components
  • utils -> src/utils

В Webpack это влияет на механизм module resolution, позволяя упростить импорт:

  • вместо относительных путей ../. ./components
  • используется @/components

Также можно расширять resolve.extensions, добавляя автоматическое разрешение .ts, .tsx, .mjs.

Обработка CSS и препроцессоров

Vue CLI интегрирует Webpack loaders для работы с CSS:

  • css-loader
  • style-loader или mini-css-extract-plugin
  • postcss-loader
  • sass-loader / less-loader / stylus-loader

Через секцию css в vue.config.js можно управлять поведением:

  • modules — включение CSS Modules
  • extract — выделение CSS в отдельные файлы
  • sourceMap — генерация sourcemap
  • loaderOptions — передача опций в конкретные loader-ы

loaderOptions позволяет, например, конфигурировать Sass:

  • глобальные переменные
  • импорт общих файлов
  • настройка precision и includePaths

Работа с Webpack plugins

Vue CLI уже включает набор стандартных плагинов Webpack:

  • HtmlWebpackPlugin
  • DefinePlugin
  • CopyWebpackPlugin
  • MiniCssExtractPlugin
  • VueLoaderPlugin

Через configureWebpack или chainWebpack можно добавлять новые плагины:

  • CompressionWebpackPlugin для gzip/brotli
  • BundleAnalyzerPlugin для анализа бандла
  • ProvidePlugin для глобальных зависимостей

В Webpack плагинная система работает через lifecycle hooks компиляции, такие как compilation, emit, done.

Оптимизация сборки

Webpack в Vue CLI использует встроенные механизмы оптимизации:

  • code splitting через splitChunks
  • tree shaking для ES modules
  • минимизация через terser-webpack-plugin
  • кэширование модулей

splitChunks особенно важен:

  • разделение vendor-кода
  • выделение common chunks
  • асинхронная загрузка модулей

В production режиме Webpack автоматически активирует оптимизации, включая dead code elimination.

Переменные окружения

Vue CLI интегрирует dotenv и Webpack DefinePlugin.

Переменные окружения:

  • .env
  • .env.development
  • .env.production

Все переменные, начинающиеся с VUE_APP_, становятся доступными в коде через process.env.

Webpack подставляет их на этапе сборки, заменяя значения статически.

Расширение обработки модулей

Через chainWebpack можно добавлять новые правила обработки файлов:

  • изображений (svg, png, jpg)
  • шрифтов (woff, ttf)
  • markdown файлов
  • кастомных форматов

Webpack rules определяют:

  • test (regex)
  • loader
  • options
  • include/exclude

Пример логики:

  • для svg можно использовать svg-sprite-loader вместо file-loader
  • для больших изображений — url-loader с лимитом

Разделение конфигурации по окружениям

Vue CLI позволяет условно изменять Webpack-конфигурацию в зависимости от NODE_ENV.

Подход:

  • production: оптимизация, минификация, отключение source maps
  • development: hot reload, быстрые sourcemaps
  • test: минимальный конфиг без лишних плагинов

В vue.config.js можно использовать функцию:

  • проверка process.env.NODE_ENV
  • возврат разных настроек

Внутренний механизм сборки

Vue CLI генерирует Webpack конфигурацию через цепочку функций:

  • базовый preset
  • загрузка плагинов Vue CLI
  • добавление vue-loader
  • настройка Babel
  • добавление пользовательских расширений

После этого итоговый объект передается в Webpack compiler.

Webpack далее выполняет:

  • построение dependency graph
  • трансформацию модулей через loaders
  • упаковку в chunks
  • генерацию output файлов