Skip to content

Commit

Permalink
feat(css): add build.cssMinify (#12207)
Browse files Browse the repository at this point in the history
  • Loading branch information
bluwy committed Mar 8, 2023
1 parent dd7a2f1 commit 90431f2
Show file tree
Hide file tree
Showing 7 changed files with 52 additions and 3 deletions.
7 changes: 7 additions & 0 deletions docs/config/build-options.md
Expand Up @@ -117,6 +117,13 @@ It should only be used when you are targeting a non-mainstream browser.
One example is Android WeChat WebView, which supports most modern JavaScript features but not the [`#RGBA` hexadecimal color notation in CSS](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#rgb_colors).
In this case, you need to set `build.cssTarget` to `chrome61` to prevent vite from transform `rgba()` colors into `#RGBA` hexadecimal notations.
## build.cssMinify
- **Type:** `boolean`
- **Default:** the same as [`build.minify`](#build-minify)
This option allows users to override CSS minification specifically instead of defaulting to `build.minify`, so you can configure minification for JS and CSS separately. Vite uses `esbuild` to minify CSS.
## build.sourcemap
- **Type:** `boolean | 'inline' | 'hidden'`
Expand Down
10 changes: 10 additions & 0 deletions packages/vite/src/node/build.ts
Expand Up @@ -127,6 +127,12 @@ export interface BuildOptions {
* @default target
*/
cssTarget?: TransformOptions['target'] | false
/**
* Override CSS minification specifically instead of defaulting to `build.minify`,
* so you can configure minification for JS and CSS separately.
* @default minify
*/
cssMinify?: boolean
/**
* If `true`, a separate sourcemap file will be created. If 'inline', the
* sourcemap will be appended to the resulting output file as data URI.
Expand Down Expand Up @@ -409,6 +415,10 @@ export function resolveBuildOptions(
resolved.minify = 'esbuild'
}

if (resolved.cssMinify == null) {
resolved.cssMinify = !!resolved.minify
}

return resolved
}

Expand Down
4 changes: 2 additions & 2 deletions packages/vite/src/node/plugins/css.ts
Expand Up @@ -437,7 +437,7 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
code = modulesCode
} else {
let content = css
if (config.build.minify) {
if (config.build.cssMinify) {
content = await minifyCSS(content, config)
}
code = `export default ${JSON.stringify(content)}`
Expand Down Expand Up @@ -1124,7 +1124,7 @@ async function finalizeCss(
if (css.includes('@import') || css.includes('@charset')) {
css = await hoistAtRules(css)
}
if (minify && config.build.minify) {
if (minify && config.build.cssMinify) {
css = await minifyCSS(css, config)
}
return css
Expand Down
14 changes: 14 additions & 0 deletions playground/css/__tests__/no-css-minify/no-css-minify.spec.ts
@@ -0,0 +1,14 @@
import { describe, expect, test } from 'vitest'
import { findAssetFile, isBuild } from '~utils'

describe.runIf(isBuild)('no css minify', () => {
test('js minified but css not minified', () => {
expect(findAssetFile(/index-\w+\.js$/, 'no-css-minify')).not.toMatch(
'(function polyfill() {',
)
expect(findAssetFile(/index-\w+\.css$/, 'no-css-minify')).toMatch(`\
.test-minify {
color: rgba(255, 255, 0, 0.7);
}`)
})
})
1 change: 1 addition & 0 deletions playground/css/__tests__/no-css-minify/vite.config.js
@@ -0,0 +1 @@
module.exports = require('../../vite.config-no-css-minify')
5 changes: 4 additions & 1 deletion playground/css/package.json
Expand Up @@ -9,7 +9,10 @@
"preview": "vite preview",
"dev:relative-base": "vite --config ./vite.config-relative-base.js dev",
"build:relative-base": "vite --config ./vite.config-relative-base.js build",
"preview:relative-base": "vite --config ./vite.config-relative-base.js preview"
"preview:relative-base": "vite --config ./vite.config-relative-base.js preview",
"dev:no-css-minify": "vite --config ./vite.config-no-css-minify.js dev",
"build:no-css-minify": "vite --config ./vite.config-no-css-minify.js build",
"preview:no-css-minify": "vite --config ./vite.config-no-css-minify.js preview"
},
"devDependencies": {
"@vitejs/test-css-dep": "link:./css-dep",
Expand Down
14 changes: 14 additions & 0 deletions playground/css/vite.config-no-css-minify.js
@@ -0,0 +1,14 @@
const baseConfig = require('./vite.config.js')

/**
* @type {import('vite').UserConfig}
*/
module.exports = {
...baseConfig,
build: {
...baseConfig.build,
outDir: 'dist/no-css-minify',
minify: true,
cssMinify: false,
},
}

0 comments on commit 90431f2

Please sign in to comment.