Skip to content

Commit 435f569

Browse files
committed
v0.0.1
1 parent a6262b5 commit 435f569

File tree

7 files changed

+1783
-42
lines changed

7 files changed

+1783
-42
lines changed

README.md

Lines changed: 201 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,230 @@
1-
# rsbuild-plugin-example
1+
# rsbuild-plugin-css-optimizer
22

3-
Example plugin for Rsbuild.
3+
An Rsbuild plugin to customize CSS minification, allowing you to choose between [cssnano](https://github.com/cssnano/cssnano) (JavaScript-based) or [Lightning CSS](https://lightningcss.dev) (Rust-based) for high-performance CSS compression.
4+
5+
`rsbuild-plugin-css-optimizer` internally integrates [css-minimizer-webpack-plugin](https://github.com/webpack-contrib/css-minimizer-webpack-plugin) to optimize CSS assets in production builds.
46

57
<p>
6-
<a href="https://npmjs.com/package/rsbuild-plugin-example">
7-
<img src="https://img.shields.io/npm/v/rsbuild-plugin-example?style=flat-square&colorA=564341&colorB=EDED91" alt="npm version" />
8+
<a href="https://npmjs.com/package/rsbuild-plugin-css-optimizer">
9+
<img src="https://img.shields.io/npm/v/rsbuild-plugin-css-optimizer?style=flat-square&colorA=564341&colorB=EDED91" alt="npm version" />
810
</a>
911
<img src="https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square&colorA=564341&colorB=EDED91" alt="license" />
10-
<a href="https://npmcharts.com/compare/rsbuild-plugin-example?minimal=true"><img src="https://img.shields.io/npm/dm/rsbuild-plugin-example.svg?style=flat-square&colorA=564341&colorB=EDED91" alt="downloads" /></a>
1112
</p>
1213

13-
## Usage
14+
## Features
15+
16+
- **Flexible Minifier Choice**: Switch between `cssnano` for extensive optimizations or `Lightning CSS` for 5-10x faster minification.
17+
- **Performance**: Leverage `Lightning CSS`’s Rust-based engine for parallel processing and native performance.
18+
- **Type Safety**: TypeScript types ensure correct configuration for each minifier.
19+
- **Seamless Rsbuild Integration**: Automatically applies minification in production builds when `minify.css` is enabled.
20+
- **Customizable Options**: Fine-tune `cssnano` and `Lightning CSS` settings for browser targeting, CSS features, and more.
1421

15-
Install:
22+
## Installation
23+
24+
Install the plugin and its dependency:
1625

1726
```bash
18-
npm add rsbuild-plugin-example -D
27+
npm add rsbuild-plugin-css-optimizer -D
1928
```
2029

21-
Add plugin to your `rsbuild.config.ts`:
30+
## Usage
31+
32+
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`.
33+
34+
### Basic Example (Lightning CSS)
2235

2336
```ts
2437
// rsbuild.config.ts
25-
import { pluginExample } from "rsbuild-plugin-example";
38+
import { pluginCssMinimizer } from "rsbuild-plugin-css-optimizer";
2639

2740
export default {
28-
plugins: [pluginExample()],
41+
plugins: [
42+
pluginCssMinimizer({
43+
minifier: "lightningcss",
44+
lightningCssOptions: {
45+
minimizerOptions: {
46+
targets: ["> 0.25%", "not dead"],
47+
},
48+
},
49+
}),
50+
],
51+
};
52+
```
53+
54+
### Basic Example (cssnano)
55+
56+
```ts
57+
// rsbuild.config.ts
58+
import { pluginCssMinimizer } from "rsbuild-plugin-css-optimizer";
59+
60+
export default {
61+
plugins: [
62+
pluginCssMinimizer(), // Uses cssnano by default
63+
],
2964
};
3065
```
3166

3267
## Options
3368

34-
### foo
69+
The plugin accepts a `PluginCssMinimizerOptions` object with the following properties:
70+
71+
### `minifier`
72+
73+
- **Type**: `'cssnano' | 'lightningcss'`
74+
- **Default**: `'cssnano'`
75+
- **Description**: Specifies the CSS minifier to use.
76+
- `'cssnano'`: JavaScript-based minifier with a wide range of optimizations.
77+
- `'lightningcss'`: Rust-based minifier for significantly faster performance.
78+
- **Example**:
79+
```ts
80+
pluginCssMinimizer({
81+
minifier: "lightningcss",
82+
});
83+
```
3584

36-
Some description.
85+
### `cssnanoOptions`
3786

38-
- Type: `string`
39-
- Default: `undefined`
40-
- Example:
87+
- **Type**: `ConfigChain<CssMinimizerPlugin.BasePluginOptions & CssMinimizerPlugin.DefinedDefaultMinimizerAndOptions<CssNanoOptions>> | Function`
88+
- **Default**:
89+
```ts
90+
{
91+
minify: CssMinimizerWebpackPlugin.cssnanoMinify,
92+
minimizerOptions: {
93+
preset: ['default', { mergeLonghand: false }],
94+
},
95+
}
96+
```
97+
- **Description**: Configuration for `cssnano`, applied when `minifier` is `'cssnano'`. Can be an object merged with defaults or a function to modify options. See [cssnano documentation](https://cssnano.co/docs) for all available options.
98+
- **Sub-options**:
99+
- `configFile` (string, optional): Path to a cssnano configuration file.
100+
- `preset` (string | [string, object], optional): Preset name and configuration (e.g., `['default', { mergeLonghand: false }]`).
101+
- **Example (Object)**:
102+
```ts
103+
pluginCssMinimizer({
104+
minifier: "cssnano",
105+
cssnanoOptions: {
106+
minimizerOptions: {
107+
preset: ["advanced", { discardComments: { removeAll: true } }],
108+
},
109+
},
110+
});
111+
```
112+
- **Example (Function)**:
113+
```ts
114+
pluginCssMinimizer({
115+
minifier: "cssnano",
116+
cssnanoOptions: (options) => {
117+
options.minimizerOptions = {
118+
preset: require.resolve("cssnano-preset-simple"),
119+
};
120+
return options;
121+
},
122+
});
123+
```
41124

42-
```js
43-
pluginExample({
44-
foo: "bar",
45-
});
125+
### `lightningCssOptions`
126+
127+
- **Type**: `ConfigChain<CssMinimizerPlugin.BasePluginOptions & CssMinimizerPlugin.DefinedDefaultMinimizerAndOptions<LightningCssOptions>> | Function`
128+
- **Default**:
129+
```ts
130+
{
131+
minify: CssMinimizerWebpackPlugin.lightningCssMinify,
132+
minimizerOptions: {
133+
targets: 'defaults',
134+
},
135+
}
136+
```
137+
- **Description**: Configuration for `Lightning CSS`, applied when `minifier` is `'lightningcss'`. Can be an object merged with defaults or a function to modify options. See [Lightning CSS documentation](https://lightningcss.dev/options.html) for all available options.
138+
- **Sub-options**:
139+
- `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 }`).
140+
- `drafts` (object, optional): Enable draft CSS features, such as `{ nesting: true }`.
141+
- **Example (Object)**:
142+
```ts
143+
pluginCssMinimizer({
144+
minifier: "lightningcss",
145+
lightningCssOptions: {
146+
minimizerOptions: {
147+
targets: ["chrome >= 80", "firefox >= 78"],
148+
drafts: { nesting: true },
149+
},
150+
},
151+
});
152+
```
153+
- **Example (Function)**:
154+
```ts
155+
pluginCssMinimizer({
156+
minifier: "lightningcss",
157+
lightningCssOptions: (options) => {
158+
options.minimizerOptions.targets = ["> 0.5%"];
159+
return options;
160+
},
161+
});
162+
```
163+
164+
## Full Example
165+
166+
```ts
167+
// rsbuild.config.ts
168+
import { pluginCssMinimizer } from "rsbuild-plugin-css-optimizer";
169+
170+
export default {
171+
output: {
172+
minify: {
173+
css: true, // Enable CSS minification
174+
},
175+
},
176+
plugins: [
177+
pluginCssMinimizer({
178+
minifier: "lightningcss",
179+
lightningCssOptions: {
180+
minimizerOptions: {
181+
targets: ["> 0.25%", "not dead"],
182+
drafts: { nesting: true },
183+
},
184+
},
185+
}),
186+
// Alternatively, use cssnano
187+
pluginCssMinimizer({
188+
minifier: "cssnano",
189+
cssnanoOptions: {
190+
minimizerOptions: {
191+
preset: ["default", { discardComments: { removeAll: true } }],
192+
},
193+
},
194+
}),
195+
],
196+
};
46197
```
47198

199+
## Performance
200+
201+
- **Lightning CSS**:
202+
- **Speed**: 5-10x faster than `cssnano` due to Rust’s compiled performance and parallel processing.
203+
- **Use Case**: Ideal for large projects or frequent builds where build speed is critical.
204+
- **cssnano**:
205+
- **Speed**: Slower but provides extensive optimization plugins for fine-grained control.
206+
- **Use Case**: Best for projects prioritizing minimal CSS output size over build performance.
207+
208+
## Notes
209+
210+
- **Source Maps**: Enable source maps in Rsbuild with `devtool: 'source-map'` for both minifiers.
211+
- **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.
212+
- **cssnano Compatibility**: The `mergeLonghand: false` default prevents issues with properties like `safe-area-inset-top` (see [cssnano issue #803](https://github.com/cssnano/cssnano/issues/803)).
213+
- **Production Only**: Minification applies only in production builds when `isProd` is `true` and `minify.css` is enabled.
214+
215+
## Troubleshooting
216+
217+
- **Minification Not Applied**:
218+
- Verify `output.minify.css` is `true` or `minify` is `true` in your Rsbuild config.
219+
- Ensure the build is in production mode (`isProd: true`).
220+
- **Invalid Options**:
221+
- Check TypeScript errors for incorrect `cssnanoOptions` or `lightningCssOptions`.
222+
- Refer to [cssnano](https://cssnano.co/docs) or [Lightning CSS](https://lightningcss.dev/options.html) documentation for valid options.
223+
224+
## Contributing
225+
226+
Contributions are welcome! Please submit issues or pull requests to the [plugin repository](https://github.com/aliezzahn/rsbuild-plugin-css-optimizer).
227+
48228
## License
49229

50-
[MIT](./LICENSE).
230+
[MIT](./LICENSE)

package.json

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
2-
"name": "rsbuild-plugin-example",
3-
"version": "0.0.0",
4-
"repository": "https://github.com/rspack-contrib/rsbuild-plugin-template",
2+
"name": "rsbuild-plugin-css-optimizer",
3+
"version": "0.0.1",
4+
"repository": "https://github.com/aliezzahn/rsbuild-plugin-css-optimizer",
55
"license": "MIT",
66
"type": "module",
77
"exports": {
@@ -14,7 +14,9 @@
1414
"main": "./dist/index.js",
1515
"module": "./dist/index.mjs",
1616
"types": "./dist/index.d.ts",
17-
"files": ["dist"],
17+
"files": [
18+
"dist"
19+
],
1820
"scripts": {
1921
"build": "rslib build",
2022
"dev": "rslib build --watch",
@@ -27,6 +29,10 @@
2729
"simple-git-hooks": {
2830
"pre-commit": "npm run lint:write"
2931
},
32+
"dependencies": {
33+
"css-minimizer-webpack-plugin": "5.0.1",
34+
"reduce-configs": "^1.1.0"
35+
},
3036
"devDependencies": {
3137
"@biomejs/biome": "^1.9.4",
3238
"@playwright/test": "^1.52.0",

playground/rsbuild.config.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
1-
import { defineConfig } from '@rsbuild/core';
2-
import { pluginExample } from '../src';
1+
import { defineConfig } from "@rsbuild/core";
2+
import { pluginCssMinimizer } from "../src";
33

44
export default defineConfig({
5-
plugins: [pluginExample()],
5+
plugins: [
6+
pluginCssMinimizer({
7+
minifier: "lightningcss",
8+
lightningCssOptions: {
9+
minimizerOptions: {
10+
targets: ["> 0.25%", "not dead"],
11+
drafts: { nesting: true },
12+
},
13+
},
14+
}),
15+
],
616
});

0 commit comments

Comments
 (0)