В процессе сборки приложений, использующих CSS-модули или импорт стилей из JavaScript, система бандлинга сталкивается с задачей разбиения CSS на отдельные файлы (чанки). Это особенно важно при использовании code splitting, динамических импортов и ленивой загрузки модулей. В таких сценариях возникает необходимость управлять тем, как именно будут называться итоговые CSS-файлы.
Опция cssChunkNames в Esbuild предназначена для
настройки шаблона именования CSS-чанков, которые генерируются в
результате разделения кода. Она позволяет контролировать структуру
выходных файлов и интегрировать CSS-чанки в существующую систему
именования ассетов проекта.
При включённом code splitting Esbuild может извлекать CSS из JavaScript-модулей и формировать отдельные CSS-файлы для каждого чанка. Это происходит в следующих случаях:
import()import './styles.css'В результате сборки формируются:
Именно для управления именованием этих CSS-файлов используется
cssChunkNames.
Опция задаётся в конфигурации сборки:
import * as esbuild from 'esbuild';
esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
splitting: true,
outdir: 'dist',
cssChunkNames: 'styles/[name]-[hash]'
});
Значение cssChunkNames представляет собой строковый
шаблон, аналогичный chunkNames, но применяемый
исключительно к CSS-файлам, выделенным из чанков.
Шаблон поддерживает специальные токены, которые заменяются во время сборки.
[name]Подставляет имя чанка, полученное из:
Пример:
styles/[name]-[hash]
Результат:
styles/dashboard-8a3f2c.css
[hash]Генерируемый хеш содержимого CSS-чанка. Используется для:
Хеш зависит от содержимого CSS, включая:
[dir] (при
наличии вложенной структуры)Используется для сохранения структуры каталогов исходного проекта в выходной директории.
Пример:
cssChunkNames: 'styles/[dir]/[name]-[hash]'
Если входной файл:
src/pages/admin/dashboard.js
Результат:
styles/pages/admin/dashboard-8a3f2c.css
Esbuild разделяет именование JavaScript и CSS-чанков:
| Опция | Назначение |
|---|---|
chunkNames |
JS-чанки |
entryNames |
JS entry points |
assetNames |
статические ресурсы |
cssChunkNames |
CSS-чанки |
Это разделение важно, поскольку CSS-чанки часто требуют иной стратегии именования, чем Jav * aScript:
При включённом параметре:
splitting: true
Esbuild анализирует граф зависимостей и формирует отдельные чанки. Если CSS импортируется внутри модуля, он:
.css файлыcssChunkNamesПример структуры:
dist/
app-1a2b3c.js
dashboard-9f8e7d.js
styles/
app-4c5d6e.css
dashboard-7a8b9c.css
Если один CSS импортируется в нескольких чанках, Esbuild может:
В этом случае cssChunkNames применяется к итоговому
объединённому чанку, а не к исходному модулю.
В проектах с глубокой модульной структурой важно сохранять читаемость выходных файлов:
src/
features/
auth/
login.js
login.css
profile/
profile.js
profile.css
Конфигурация:
cssChunkNames: 'styles/[dir]/[name]-[hash]'
Результат:
dist/styles/features/auth/login-a1b2c3.css
dist/styles/features/profile/profile-d4e5f6.css
Такой подход упрощает:
Хеширование ([hash]) в CSS-чанках особенно важно
при:
Файлы становятся immutable:
dashboard-8a3f2c.css
При изменении стилей:
dashboard-91c4d8.css
Браузер загружает новую версию без конфликтов кеша.
В крупных приложениях разные версии одного и того же модуля могут сосуществовать, и хеш гарантирует отсутствие пересечений.
При динамических импортах:
import('./dashboard.js');
Esbuild создаёт отдельный JS-чанк и соответствующий CSS-чанк. Runtime автоматически подгружает оба файла.
Если используется шаблон:
cssChunkNames: 'css/[name]-[hash]'
то при загрузке dashboard.js также будет запрошен:
css/dashboard-xxxxxx.css
Имя [name] может изменяться в зависимости от:
Поэтому для production-сборок рекомендуется сочетать:
[name] для читаемости[hash] для стабильностиЕсли несколько модулей имеют одинаковое имя (например,
index.js в разных директориях), Esbuild автоматически
разрешает конфликт, добавляя контекст пути в name.
esbuild.build({
entryPoints: ['src/app.js'],
bundle: true,
splitting: true,
outdir: 'dist',
format: 'esm',
entryNames: 'js/[name]-[hash]',
chunkNames: 'js/chunks/[name]-[hash]',
assetNames: 'assets/[name]-[hash]',
cssChunkNames: 'styles/chunks/[name]-[hash]'
});
В результате формируется единая структура:
dist/
js/
app-1a2b3c.js
chunks/
dashboard-4d5e6f.js
styles/
chunks/
dashboard-7a8b9c.css
Опция cssChunkNames практически не влияет на скорость
сборки, так как:
Основная нагрузка остаётся связанной с:
Если cssChunkNames не задана, Esbuild использует
дефолтный шаблон, аналогичный стандартному именованию чанков, обычно
включающий:
Это может привести к менее предсказуемой структуре файлов, особенно в крупных проектах с множеством динамических импортов.
assetNamesПри использовании PostCSS или Tailwind CSS:
cssChunkNamesЭто делает опцию независимой от CSS-трансформаций, но зависимой от финального графа модулей.