В экосистеме сборщика Esbuild работа с CSS реализована через систему loader’ов, которая определяет, как конкретные типы файлов должны интерпретироваться в процессе бандлинга. CSS loader — один из ключевых механизмов, позволяющих встроить стили в граф модулей JavaScript без дополнительных инструментов.
CSS в Esbuild не рассматривается как вторичный ресурс. Он становится полноценным модулем сборки, который может быть импортирован, преобразован, объединён и оптимизирован.
Esbuild поддерживает несколько стратегий обработки CSS через параметр
loader, каждая из которых влияет на итоговую форму
выходного бандла:
css — стандартная обработка CSS как отдельного файла
или части общего CSS-бандлаlocal-css — обработка с изоляцией классов (CSS
Modules-стиль поведения)Базовый режим css применяется для большинства типичных
сценариев.
CSS может быть импортирован напрямую из JavaScript или TypeScript:
import './styles.css';
При использовании loader css Esbuild:
Если включена опция сборки:
esbuild app.js --bundle --outfile=dist/out.js
и присутствует CSS-импорт, то:
Loader задаётся через API или CLI:
esbuild app.js --bundle --loader:.css=css --outfile=dist/out.js
import * as esbuild from 'esbuild';
esbuild.build({
entryPoints: ['app.js'],
bundle: true,
outfile: 'dist/out.js',
loader: {
'.css': 'css'
}
});
Здесь .css ассоциируется с режимом css,
который определяет поведение обработки.
При встрече CSS-файла в графе зависимостей происходит несколько этапов:
CSS читается как строка и анализируется на уровне синтаксических правил:
Каждый импорт CSS становится узлом графа сборки. Это позволяет:
На этапе вывода Esbuild:
Если проект содержит несколько импортов:
import './reset.css';
import './layout.css';
import './theme.css';
Esbuild:
CSS loader не просто подключает стили, но и интегрируется с системой модулей.
import './styles.css';
Такой импорт:
CSS может импортироваться динамически:
if (theme === 'dark') {
import('./dark.css');
}
В этом случае Esbuild:
Режим local-css используется для изоляции классов.
import styles from './button.css';
Конфигурация:
loader: {
'.css': 'local-css'
}
Пример трансформации:
.button {
color: red;
}
Может быть преобразован в:
.button_hash123 {
color: red;
}
А в Jav * aScript:
styles.button // "button_hash123"
Esbuild выполняет базовые оптимизации:
Если несколько правил совпадают:
.a { color: red; }
.a { color: red; }
результат будет объединён.
При включённом code splitting:
esbuild app.js --bundle --splitting --format=esm
CSS ведёт себя аналогично Jav * aScript:
Esbuild обрабатывает CSS из зависимостей:
import 'library/dist/style.css';
Особенности:
Хотя loader сам по себе не является трансформером, он может быть расширен через плагины PostCSS.
Плагины позволяют:
Пример интеграции:
plugins: [
{
name: 'postcss',
setup(build) {
build.onLoad({ filter: /\.css$/ }, async (args) => {
const css = await fs.promises.readFile(args.path, 'utf8');
const result = await postcss.process(css);
return { contents: result.css, loader: 'css' };
});
}
}
]
Хотя основной режим предполагает отдельный файл, возможна инлайнизация:
В этом случае CSS может быть:
<style> через JSНесмотря на гибкость, существуют ограничения:
При синтаксических ошибках CSS:
Пример типов ошибок:
CSS loader в Esbuild оптимизирован под скорость:
Это позволяет: