rollup-plugin-postcss представляет собой плагин для Rollup, предназначенный для обработки CSS-файлов и их интеграции в JavaScript-бандл. Его ключевая задача — дать возможность импортировать стили напрямую в JavaScript-модули, обрабатывать их через PostCSS-пайплайн и контролировать способ вывода CSS: инлайн в JS, отдельным файлом или в виде нескольких чанков.
В экосистеме Rollup этот плагин решает проблему отсутствия встроенной поддержки CSS, аналогичной той, что есть в Webpack. Он обеспечивает гибкость при работе со стилями, сохраняя философию Rollup — прозрачную и предсказуемую сборку.
Плагин устанавливается стандартным способом через npm:
npm install rollup-plugin-postcss --save-dev
Подключение в конфигурации Rollup:
import postcss from 'rollup-plugin-postcss';
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'esm'
},
plugins: [
postcss()
]
};
В таком виде плагин уже способен обрабатывать импорт CSS:
import './styles.css';
Плагин принимает объект конфигурации, который определяет поведение обработки CSS.
postcss({
extract: true,
minimize: true,
sourceMap: true
})
Каждая опция влияет на способ генерации и обработки CSS.
extract определяет, будет ли CSS вынесен в отдельный файл.
postcss({
extract: true
})
Результат:
postcss({
extract: 'dist/styles.css'
})
Такой вариант используется при строгом контроле структуры build-артефактов.
postcss({
extract: false
})
CSS инлайнится в JavaScript и вставляется в DOM во время выполнения.
При отключённом extract стили внедряются через runtime-инъекцию:
const style = document.createElement('style');
style.innerHTML = "body { margin: 0; }";
document.head.appendChild(style);
Такой подход:
Опция minimize включает сжатие CSS.
postcss({
minimize: true
})
Минификация включает:
В большинстве случаев используется плагин cssnano под капотом.
import cssnano from 'cssnano';
postcss({
minimize: true,
plugins: [cssnano()]
})
Поддержка source map позволяет отслеживать исходные стили в devtools.
postcss({
sourceMap: true
})
При использовании:
Главная сила rollup-plugin-postcss заключается в интеграции с PostCSS-экосистемой.
import autoprefixer from 'autoprefixer';
import nested from 'postcss-nested';
postcss({
plugins: [
autoprefixer(),
nested()
]
})
.button {
display: flex;
}
После обработки:
.button {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
Плагин поддерживает Sass, Less и Stylus через дополнительные пакеты.
npm install sass
postcss({
extensions: ['.css', '.scss'],
use: ['sass']
})
postcss({
extensions: ['.css', '.less'],
use: ['less']
})
postcss({
extensions: ['.css', '.styl'],
use: ['stylus']
})
Поддержка CSS Modules позволяет изолировать стили по компонентам.
postcss({
modules: true
})
import styles from './button.css';
console.log(styles.button);
.button {
color: red;
}
После обработки класс может быть преобразован в уникальный идентификатор:
.button_3x9a2 {
color: red;
}
CSS Modules позволяет управлять форматом генерации имен:
postcss({
modules: {
generateScopedName: '[name]__[local]___[hash:base64:5]'
}
})
Это обеспечивает:
Для проектов на TypeScript можно генерировать типы для CSS Modules.
postcss({
modules: {
generateScopedName: '[local]_[hash:base64:5]'
}
})
Дополнительно используется декларационный файл:
declare module '*.css' {
const classes: { [key: string]: string };
export default classes;
}
Плагин позволяет фильтровать CSS-файлы:
postcss({
include: '**/*.css',
exclude: 'node_modules/**'
})
Это полезно при:
Можно переопределить механизм внедрения CSS в DOM.
postcss({
inject: false
})
Или задать кастомную функцию:
postcss({
inject: (css) => {
const style = document.createElement('style');
style.setAttribute('data-custom', 'true');
style.appendChild(document.createTextNode(css));
document.head.appendChild(style);
}
})
Это используется для:
Конфигурация может быть динамической:
postcss({
plugins: (defaultPlugins) => [
...defaultPlugins,
autoprefixer()
]
})
Это позволяет:
При использовании нескольких входных точек Rollup плагин способен:
export default {
input: {
app: 'src/app.js',
admin: 'src/admin.js'
},
output: {
dir: 'dist',
format: 'esm'
},
plugins: [
postcss({
extract: true
})
]
};
В dev-режиме плагин часто используется без минификации:
postcss({
minimize: false,
sourceMap: true,
extract: false
})
Особенности:
Типичная production-конфигурация:
postcss({
extract: 'dist/styles.css',
minimize: true,
sourceMap: false,
modules: true,
plugins: [autoprefixer()]
})
Характерные свойства:
При использовании rollup-plugin-postcss важно учитывать ряд архитектурных особенностей:
Позволяет корректно обрабатывать стили из зависимостей:
import resolve from '@rollup/plugin-node-resolve';
Обеспечивает поддержку CommonJS-библиотек, содержащих CSS-инъекции.
Порядок важен:
plugins: [
postcss(),
babel(),
]
Каждый компонент имеет собственный CSS:
Button/
index.js
style.css
Использование extract и modules для изоляции:
Отключение inject и использование extract для серверной подготовки CSS.
Типичные ошибки:
Плагин обычно сообщает:
Пайплайн обработки включает этапы:
rollup-plugin-postcss выполняет функцию связующего слоя между JavaScript-модульностью Rollup и декларативной природой CSS. Он обеспечивает единый процесс сборки, где стили становятся частью графа модулей и подчиняются тем же правилам зависимости и оптимизации.