An Rsbuild plugin to customize CSS minification, allowing you to choose between cssnano (JavaScript-based) or Lightning CSS (Rust-based) for high-performance CSS compression.
rsbuild-plugin-css-optimizer
internally integrates css-minimizer-webpack-plugin to optimize CSS assets in production builds.
- Flexible Minifier Choice: Switch between
cssnano
for extensive optimizations orLightning CSS
for 5-10x faster minification. - Performance: Leverage
Lightning CSS
’s Rust-based engine for parallel processing and native performance. - Type Safety: TypeScript types ensure correct configuration for each minifier.
- Seamless Rsbuild Integration: Automatically applies minification in production builds when
minify.css
is enabled. - Customizable Options: Fine-tune
cssnano
andLightning CSS
settings for browser targeting, CSS features, and more.
Install the plugin and its dependency:
npm add rsbuild-plugin-css-optimizer -D
bun add -d rsbuild-plugin-css-optimizer
Add the pluginCssMinimizer
to your Rsbuild configuration in rsbuild.config.ts
. The plugin enables CSS minification in production builds when output.minify.css
is true
.
// rsbuild.config.ts
import { pluginCssMinimizer } from "rsbuild-plugin-css-optimizer";
export default {
plugins: [
pluginCssMinimizer({
minifier: "lightningcss",
lightningCssOptions: {
minimizerOptions: {
targets: ["> 0.25%", "not dead"],
},
},
}),
],
};
// rsbuild.config.ts
import { pluginCssMinimizer } from "rsbuild-plugin-css-optimizer";
export default {
plugins: [
pluginCssMinimizer(), // Uses cssnano by default
],
};
The plugin accepts a PluginCssMinimizerOptions
object with the following properties:
- Type:
'cssnano' | 'lightningcss'
- Default:
'cssnano'
- Description: Specifies the CSS minifier to use.
'cssnano'
: JavaScript-based minifier with a wide range of optimizations.'lightningcss'
: Rust-based minifier for significantly faster performance.
- Example:
pluginCssMinimizer({ minifier: "lightningcss", });
- Type:
ConfigChain<CssMinimizerPlugin.BasePluginOptions & CssMinimizerPlugin.DefinedDefaultMinimizerAndOptions<CssNanoOptions>> | Function
- Default:
{ minify: CssMinimizerWebpackPlugin.cssnanoMinify, minimizerOptions: { preset: ['default', { mergeLonghand: false }], }, }
- Description: Configuration for
cssnano
, applied whenminifier
is'cssnano'
. Can be an object merged with defaults or a function to modify options. See cssnano documentation for all available options. - Sub-options:
configFile
(string, optional): Path to a cssnano configuration file.preset
(string | [string, object], optional): Preset name and configuration (e.g.,['default', { mergeLonghand: false }]
).
- Example (Object):
pluginCssMinimizer({ minifier: "cssnano", cssnanoOptions: { minimizerOptions: { preset: ["advanced", { discardComments: { removeAll: true } }], }, }, });
- Example (Function):
pluginCssMinimizer({ minifier: "cssnano", cssnanoOptions: (options) => { options.minimizerOptions = { preset: require.resolve("cssnano-preset-simple"), }; return options; }, });
- Type:
ConfigChain<CssMinimizerPlugin.BasePluginOptions & CssMinimizerPlugin.DefinedDefaultMinimizerAndOptions<LightningCssOptions>> | Function
- Default:
{ minify: CssMinimizerWebpackPlugin.lightningCssMinify, minimizerOptions: { targets: 'defaults', }, }
- Description: Configuration for
Lightning CSS
, applied whenminifier
is'lightningcss'
. Can be an object merged with defaults or a function to modify options. See Lightning CSS documentation for all available options. - Sub-options:
targets
(string | string[] | { [key: string]: number }, optional): Browser targets using browserslist syntax (e.g.,['> 0.25%', 'not dead']
) or version objects (e.g.,{ chrome: 80 }
).drafts
(object, optional): Enable draft CSS features, such as{ nesting: true }
.
- Example (Object):
pluginCssMinimizer({ minifier: "lightningcss", lightningCssOptions: { minimizerOptions: { targets: ["chrome >= 80", "firefox >= 78"], drafts: { nesting: true }, }, }, });
- Example (Function):
pluginCssMinimizer({ minifier: "lightningcss", lightningCssOptions: (options) => { options.minimizerOptions.targets = ["> 0.5%"]; return options; }, });
// rsbuild.config.ts
import { pluginCssMinimizer } from "rsbuild-plugin-css-optimizer";
export default {
output: {
minify: {
css: true, // Enable CSS minification
},
},
plugins: [
pluginCssMinimizer({
minifier: "lightningcss",
lightningCssOptions: {
minimizerOptions: {
targets: ["> 0.25%", "not dead"],
drafts: { nesting: true },
},
},
}),
// Alternatively, use cssnano
pluginCssMinimizer({
minifier: "cssnano",
cssnanoOptions: {
minimizerOptions: {
preset: ["default", { discardComments: { removeAll: true } }],
},
},
}),
],
};
- Lightning CSS:
- Speed: 5-10x faster than
cssnano
due to Rust’s compiled performance and parallel processing. - Use Case: Ideal for large projects or frequent builds where build speed is critical.
- Speed: 5-10x faster than
- cssnano:
- Speed: Slower but provides extensive optimization plugins for fine-grained control.
- Use Case: Best for projects prioritizing minimal CSS output size over build performance.
- Source Maps: Enable source maps in Rsbuild with
devtool: 'source-map'
for both minifiers. - Browser Targets: For
Lightning CSS
, use browserslist syntax (e.g.,['> 0.25%']
) or version objects (e.g.,{ chrome: 80 }
). The default ('defaults'
) targets modern browsers. - cssnano Compatibility: The
mergeLonghand: false
default prevents issues with properties likesafe-area-inset-top
(see cssnano issue #803). - Production Only: Minification applies only in production builds when
isProd
istrue
andminify.css
is enabled.
- Minification Not Applied:
- Verify
output.minify.css
istrue
orminify
istrue
in your Rsbuild config. - Ensure the build is in production mode (
isProd: true
).
- Verify
- Invalid Options:
- Check TypeScript errors for incorrect
cssnanoOptions
orlightningCssOptions
. - Refer to cssnano or Lightning CSS documentation for valid options.
- Check TypeScript errors for incorrect
Contributions are welcome! Please submit issues or pull requests to the plugin repository.