CSS в сборке Rollup подключается не напрямую, а через систему плагинов, поскольку сам Rollup изначально ориентирован на работу исключительно с JavaScript-модулями и их зависимостями. Любые нефайловые ресурсы, включая стили, изображения и шрифты, обрабатываются через расширения, которые интегрируются в пайплайн сборки.
Модель Rollup основана на графе модулей, где каждый импорт рассматривается как узел. CSS-файлы не являются JavaScript-модулями, поэтому при их подключении требуется преобразование в совместимый формат.
Основные стратегии обработки CSS:
Каждая стратегия реализуется через соответствующие плагины, подключаемые в конфигурации Rollup.
Наиболее распространённым решением является плагин PostCSS-экосистемы.
Установка:
npm install -D rollup-plugin-postcss postcss
Конфигурация Rollup:
import postcss from 'rollup-plugin-postcss';
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'esm'
},
plugins: [
postcss()
]
};
При таком подключении CSS может импортироваться прямо в Jav * aScript:
import './styles.css';
Плагин предоставляет несколько ключевых режимов работы, определяющих поведение сборки.
В этом режиме CSS преобразуется в строку и вставляется в DOM во время выполнения.
postcss({
inject: true
})
Механизм основан на создании тега <style>:
<head>Такой подход часто используется для небольших библиотек и компонентов.
Для production-сборок чаще используется стратегия выделения CSS в отдельный файл.
postcss({
extract: true
})
Результат сборки:
dist/
bundle.js
styles.css
Преимущества такого подхода:
Имя файла можно задать явно:
postcss({
extract: 'dist/styles.css'
})
Также поддерживается динамическое именование через шаблоны в более сложных конфигурациях сборки.
CSS Modules позволяют локализовать стили на уровне компонентов.
postcss({
modules: true
})
Пример использования:
/* button.css */
.button {
color: red;
}
import styles from './button.css';
element.className = styles.button;
Механизм работы:
PostCSS в Rollup выступает как промежуточный слой, позволяющий подключать дополнительные инструменты обработки CSS.
Типичный набор:
Пример конфигурации:
import postcss from 'rollup-plugin-postcss';
import autoprefixer from 'autoprefixer';
import cssnano from 'cssnano';
export default {
plugins: [
postcss({
plugins: [
autoprefixer(),
cssnano()
]
})
]
};
CSS-препроцессоры подключаются через расширения PostCSS или отдельные плагины.
npm install -D sass
postcss({
extensions: ['.css', '.scss'],
use: [
['sass', {
includePaths: ['./src/styles']
}]
]
})
npm install -D less
postcss({
extensions: ['.css', '.less'],
use: ['less']
})
Препроцессоры позволяют:
Rollup позволяет импортировать несколько CSS-файлов в одном проекте, при этом плагин объединяет их в единый результат.
import './reset.css';
import './layout.css';
import './theme.css';
Поведение зависит от конфигурации:
Порядок импортов критически важен, поскольку влияет на каскад:
Rollup сохраняет порядок зависимостей в графе модулей, что обеспечивает предсказуемое применение CSS.
CSS можно подключать динамически через условные импорты:
if (theme === 'dark') {
import('./dark.css');
}
При использовании PostCSS-плагина такой CSS может быть вынесен в отдельный чанк или встроен в основной бандл, в зависимости от настроек code splitting.
При использовании code splitting CSS также разделяется по чанкам.
Пример:
import('./feature.js');
Если внутри feature.js есть импорт CSS:
import './feature.css';
Rollup может:
При сборке библиотек важно контролировать экспорт CSS.
Основные подходы:
Пример настройки:
postcss({
extract: true,
minimize: true,
sourceMap: true
})
Source maps позволяют отлаживать стили в браузере, сопоставляя итоговый CSS с исходными файлами.
postcss({
sourceMap: true
})
Преимущества:
Минификация обычно выполняется через cssnano:
postcss({
plugins: [
require('cssnano')()
]
})
Процесс включает:
На практике часто встречаются следующие проблемы:
Оптимизация включает несколько уровней:
Грамотная конфигурация плагинов позволяет выстроить предсказуемую систему обработки стилей, полностью интегрированную в граф модулей Rollup, сохраняя при этом модульность JavaScript-архитектуры и обеспечивая эффективную доставку CSS в браузер.