11const fastGlob = require ( 'fast-glob' ) ;
22const wrapAnsi = require ( 'wrap-ansi' ) ;
3+ const { constants} = require ( 'zlib' ) ;
4+ const CompressionPlugin = require ( 'compression-webpack-plugin' ) ;
35const CssNanoPlugin = require ( 'cssnano-webpack-plugin' ) ;
46const FixStyleOnlyEntriesPlugin = require ( 'webpack-fix-style-only-entries' ) ;
57const MiniCssExtractPlugin = require ( 'mini-css-extract-plugin' ) ;
@@ -37,6 +39,75 @@ const filterCssImport = (url, ...args) => {
3739 return true ;
3840} ;
3941
42+ const plugins = [
43+ new VueLoaderPlugin ( ) ,
44+ // avoid generating useless js output files for css--only chunks
45+ new FixStyleOnlyEntriesPlugin ( {
46+ extensions : [ 'less' , 'scss' , 'css' ] ,
47+ silent : true ,
48+ } ) ,
49+ new MiniCssExtractPlugin ( {
50+ filename : 'css/[name].css' ,
51+ chunkFilename : 'css/[name].css' ,
52+ } ) ,
53+ new SourceMapDevToolPlugin ( {
54+ filename : '[file].map' ,
55+ include : [
56+ 'js/index.js' ,
57+ 'css/index.css' ,
58+ ] ,
59+ } ) ,
60+ new MonacoWebpackPlugin ( {
61+ filename : 'js/monaco-[name].worker.js' ,
62+ } ) ,
63+ new LicenseWebpackPlugin ( {
64+ outputFilename : 'js/licenses.txt' ,
65+ perChunkOutput : false ,
66+ addBanner : false ,
67+ skipChildCompilers : true ,
68+ modulesDirectories : [
69+ resolve ( __dirname , 'node_modules' ) ,
70+ ] ,
71+ renderLicenses : ( modules ) => {
72+ const line = '-' . repeat ( 80 ) ;
73+ return modules . map ( ( module ) => {
74+ const { name, version} = module . packageJson ;
75+ const { licenseId, licenseText} = module ;
76+ const body = wrapAnsi ( licenseText || '' , 80 ) ;
77+ return `${ line } \n${ name } @${ version } - ${ licenseId } \n${ line } \n${ body } ` ;
78+ } ) . join ( '\n' ) ;
79+ } ,
80+ stats : {
81+ warnings : false ,
82+ errors : true ,
83+ } ,
84+ } ) ,
85+ ] ;
86+
87+ if ( isProduction ) {
88+ plugins . push (
89+ new CompressionPlugin ( {
90+ filename : '[path].gz' ,
91+ algorithm : 'gzip' ,
92+ test : / \. ( j s | c s s ) $ / ,
93+ compressionOptions : {
94+ level : constants . Z_BEST_COMPRESSION ,
95+ } ,
96+ threshold : 10240 ,
97+ } ) ,
98+ new CompressionPlugin ( {
99+ filename : '[path].br' ,
100+ algorithm : 'brotliCompress' ,
101+ test : / \. ( j s | c s s ) $ / ,
102+ compressionOptions : {
103+ [ constants . BROTLI_PARAM_QUALITY ] : constants . BROTLI_MAX_QUALITY ,
104+ } ,
105+ threshold : 10240 ,
106+ } ) ,
107+ ) ;
108+ }
109+
110+
40111module . exports = {
41112 mode : isProduction ? 'production' : 'development' ,
42113 entry : {
@@ -255,50 +326,7 @@ module.exports = {
255326 } ,
256327 ] ,
257328 } ,
258- plugins : [
259- new VueLoaderPlugin ( ) ,
260- // avoid generating useless js output files for css--only chunks
261- new FixStyleOnlyEntriesPlugin ( {
262- extensions : [ 'less' , 'scss' , 'css' ] ,
263- silent : true ,
264- } ) ,
265- new MiniCssExtractPlugin ( {
266- filename : 'css/[name].css' ,
267- chunkFilename : 'css/[name].css' ,
268- } ) ,
269- new SourceMapDevToolPlugin ( {
270- filename : '[file].map' ,
271- include : [
272- 'js/index.js' ,
273- 'css/index.css' ,
274- ] ,
275- } ) ,
276- new MonacoWebpackPlugin ( {
277- filename : 'js/monaco-[name].worker.js' ,
278- } ) ,
279- new LicenseWebpackPlugin ( {
280- outputFilename : 'js/licenses.txt' ,
281- perChunkOutput : false ,
282- addBanner : false ,
283- skipChildCompilers : true ,
284- modulesDirectories : [
285- resolve ( __dirname , 'node_modules' ) ,
286- ] ,
287- renderLicenses : ( modules ) => {
288- const line = '-' . repeat ( 80 ) ;
289- return modules . map ( ( module ) => {
290- const { name, version} = module . packageJson ;
291- const { licenseId, licenseText} = module ;
292- const body = wrapAnsi ( licenseText || '' , 80 ) ;
293- return `${ line } \n${ name } @${ version } - ${ licenseId } \n${ line } \n${ body } ` ;
294- } ) . join ( '\n' ) ;
295- } ,
296- stats : {
297- warnings : false ,
298- errors : true ,
299- } ,
300- } ) ,
301- ] ,
329+ plugins,
302330 performance : {
303331 hints : false ,
304332 maxEntrypointSize : Infinity ,
@@ -321,6 +349,7 @@ module.exports = {
321349 // exclude monaco's language chunks in stats output for brevity
322350 // https://github.com/microsoft/monaco-editor-webpack-plugin/issues/113
323351 / ^ j s \/ [ 0 - 9 ] + \. j s $ / ,
352+ / \. ( g z | b r ) $ / ,
324353 ] ,
325354 } ,
326355} ;
0 commit comments