Create React App использует Webpack как основной механизм сборки, но скрывает его конфигурацию за слоем абстракции. Архитектурно это сделано для упрощения стартовой разработки React-приложений, однако внутренняя структура сборки остаётся достаточно сложной и многоуровневой.
В основе Create React App лежит заранее подготовленный набор
конфигураций, включающий Webpack, Babel, ESLint, PostCSS и набор
вспомогательных утилит. Конфигурация Webpack не экспортируется напрямую
в проект, а формируется динамически через пакеты внутри
react-scripts.
Основная точка входа сборочной системы находится в пакете
react-scripts. Внутри него Webpack конфигурация делится на
несколько логических слоёв:
webpack.config.js)webpackDevServer.config.js)Каждый слой расширяет базовую конфигурацию через функцию композиции, а не через наследование.
Ключевой принцип — отсутствие прямого доступа разработчика к
конфигурации, но наличие возможности частичного расширения через
инструменты вроде craco, react-app-rewired или
eject-механизм.
Внутренний webpack.config.js содержит
стандартизированный набор настроек:
По умолчанию используется:
src/index.js или src/index.tsxWebpack формирует граф зависимостей, начиная с этой точки.
Сборка направляется в:
build/static/js[contenthash])Структура output оптимизирована под долгосрочное хранение и CDN-доставку.
CRA использует строго определённый набор loaders.
Основной трансформер Jav * aScript:
core-js при необходимостиBabel конфиг скрыт, но включает presets:
@babel/preset-react@babel/preset-envCSS обрабатывается цепочкой:
style-loader (dev)MiniCssExtractPlugin.loader (prod)css-loaderpostcss-loaderPostCSS включает:
Webpack 5 в CRA использует встроенные asset modules:
Файлы автоматически классифицируются как:
asset/resourceasset/inlineРазрешение модулей настроено для удобства React-разработки:
.js, .jsx,
.ts, .tsxsrc/ как корневой путьmodule → main →
browserТакже включена оптимизация поиска модулей через
node_modules.
Webpack Dev Server в CRA настроен с упором на скорость итерации.
Основные особенности:
proxyHMR интегрирован с React Refresh runtime, что позволяет сохранять состояние компонентов при изменениях.
Webpack конфигурация разделяется по средам:
CRA использует автоматическое разделение кода через
splitChunks:
Основные стратегии:
Пример логики:
Webpack внутри CRA включает ряд оптимизаций:
Используется ES module анализ:
Scope hoisting объединяет модули в единый контекст выполнения.
Production сборка может включать:
Список ключевых плагинов:
Переменные окружения передаются через:
.env.env.development.env.productionВсе переменные должны иметь префикс REACT_APP_
Webpack подставляет их через DefinePlugin, делая значения статическими на этапе сборки.
CRA использует разные стратегии source maps:
Source maps подключаются через devtool в Webpack
конфигурации.
Скрытие Webpack конфигурации создаёт ряд ограничений:
Расширение возможно через:
react-app-rewiredcracoEject копирует внутреннюю конфигурацию Webpack в проект:
config/webpack.config.jsconfig/paths.jsconfig/modules.jsПосле eject управление полностью переходит разработчику, но теряется обновляемость CRA.
Webpack в CRA строит граф зависимостей:
Этот процесс определяет:
Fast Refresh работает через Webpack plugin:
Это тесно связано с HMR pipeline Webpack.