Skip to content

Commit f879925

Browse files
TheAlexLichterpi0
authored andcommitted
feat(webpack/client): minify extracted css assets (nuxt#3857)
1 parent b74d537 commit f879925

File tree

4 files changed

+45
-15
lines changed

4 files changed

+45
-15
lines changed

lib/builder/webpack/client.js

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import webpack from 'webpack'
44
import HTMLPlugin from 'html-webpack-plugin'
55
import BundleAnalyzer from 'webpack-bundle-analyzer'
66
import UglifyJsWebpackPlugin from 'uglifyjs-webpack-plugin'
7+
import OptimizeCSSAssetsPlugin from 'optimize-css-assets-webpack-plugin'
78
import FriendlyErrorsWebpackPlugin from '@nuxtjs/friendly-errors-webpack-plugin'
89

910
import VueSSRClientPlugin from './plugins/vue/client'
@@ -97,25 +98,35 @@ export default class WebpackClientConfig extends WebpackBaseConfig {
9798

9899
customize() {
99100
const config = super.customize(...arguments)
100-
// Make uglifyjs faster
101+
101102
if (!this.options.dev && !config.optimization.minimizer) {
103+
config.optimization.minimizer = []
104+
102105
// https://github.com/webpack-contrib/uglifyjs-webpack-plugin
103-
config.optimization.minimizer = [
104-
new UglifyJsWebpackPlugin({
105-
parallel: true,
106-
cache: this.options.build.cache,
107-
sourceMap: config.devtool && /source-?map/.test(config.devtool),
108-
extractComments: {
109-
filename: 'LICENSES'
110-
},
111-
uglifyOptions: {
112-
output: {
113-
comments: /^\**!|@preserve|@license|@cc_on/
114-
}
106+
const uglifyJsPlugin = new UglifyJsWebpackPlugin({
107+
parallel: true,
108+
cache: this.options.build.cache,
109+
sourceMap: config.devtool && /source-?map/.test(config.devtool),
110+
extractComments: {
111+
filename: 'LICENSES'
112+
},
113+
uglifyOptions: {
114+
output: {
115+
comments: /^\**!|@preserve|@license|@cc_on/
115116
}
116-
})
117-
]
117+
}
118+
})
119+
config.optimization.minimizer.push(uglifyJsPlugin)
120+
121+
// https://github.com/NMFR/optimize-css-assets-webpack-plugin
122+
// https://github.com/webpack-contrib/mini-css-extract-plugin#minimizing-for-production
123+
// TODO: Remove OptimizeCSSAssetsPlugin when upgrading to webpack 5
124+
if (this.options.build.extractCSS) {
125+
const optimizeCSSPlugin = new OptimizeCSSAssetsPlugin({})
126+
config.optimization.minimizer.push(optimizeCSSPlugin)
127+
}
118128
}
129+
119130
return config
120131
}
121132

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
"memory-fs": "^0.4.1",
9898
"mini-css-extract-plugin": "^0.4.2",
9999
"minimist": "^1.2.0",
100+
"optimize-css-assets-webpack-plugin": "^5.0.1",
100101
"pify": "^4.0.0",
101102
"postcss": "^6.0.22",
102103
"postcss-import": "^11.1.0",

test/fixtures/extract-css/assets/global.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@
33
body {
44
background-color: rgb(28, 28, 28);
55
display: flex;
6+
67
justify-content: center;
8+
79
align-items: center;
10+
11+
812
height: 100vh;
913
}
1014

test/unit/extract-css.test.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { resolve } from 'path'
2+
import fs from 'fs'
3+
import { promisify } from 'util'
4+
5+
const readFile = promisify(fs.readFile)
6+
7+
describe('extract css', () => {
8+
test('Verify global.css has been extracted and minified', async () => {
9+
const pathToMinifiedGlobalCss = resolve(__dirname, '..', 'fixtures/extract-css/.nuxt/dist/client/90516105347f397aade6.css')
10+
const content = await readFile(pathToMinifiedGlobalCss, 'utf-8')
11+
const expectedContent = 'h1[data-v-180e2718]{color:red}.container[data-v-180e2718]{-ms-grid-columns:60px 60px 60px 60px 60px;-ms-grid-rows:30px 30px;display:-ms-grid;display:grid;grid-auto-flow:row;grid-template-columns:60px 60px 60px 60px 60px;grid-template-rows:30px 30px}'
12+
expect(content).toBe(expectedContent)
13+
})
14+
})

0 commit comments

Comments
 (0)