111 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // @ts-check
 | |
| const TerserPlugin = require('terser-webpack-plugin')
 | |
| 
 | |
| const genTerserOptions = (defaultOptions, options) => {
 | |
|   const userOptions = options.terser && options.terser.terserOptions
 | |
|   // user's config is first
 | |
|   return {
 | |
|     ...defaultOptions,
 | |
|     ...userOptions
 | |
|   }
 | |
| }
 | |
| 
 | |
| const terserMinify = (options) => ({
 | |
|   terserOptions: genTerserOptions(
 | |
|     {
 | |
|       compress: {
 | |
|         // turn off flags with small gains to speed up minification
 | |
|         arrows: false,
 | |
|         collapse_vars: false, // 0.3kb
 | |
|         comparisons: false,
 | |
|         computed_props: false,
 | |
|         hoist_funs: false,
 | |
|         hoist_props: false,
 | |
|         hoist_vars: false,
 | |
|         inline: false,
 | |
|         loops: false,
 | |
|         negate_iife: false,
 | |
|         properties: false,
 | |
|         reduce_funcs: false,
 | |
|         reduce_vars: false,
 | |
|         switches: false,
 | |
|         toplevel: false,
 | |
|         typeofs: false,
 | |
| 
 | |
|         // a few flags with noticeable gains/speed ratio
 | |
|         // numbers based on out of the box vendor bundle
 | |
|         booleans: true, // 0.7kb
 | |
|         if_return: true, // 0.4kb
 | |
|         sequences: true, // 0.7kb
 | |
|         unused: true, // 2.3kb
 | |
| 
 | |
|         // required features to drop conditional branches
 | |
|         conditionals: true,
 | |
|         dead_code: true,
 | |
|         evaluate: true
 | |
|       },
 | |
|       mangle: {
 | |
|         safari10: true
 | |
|       }
 | |
|     },
 | |
|     options
 | |
|   ),
 | |
|   parallel: options.parallel,
 | |
|   extractComments: false
 | |
| })
 | |
| 
 | |
| // `terserOptions` options will be passed to `esbuild`
 | |
| // Link to options - https://esbuild.github.io/api/#minify
 | |
| const esbuildMinify = (options) => ({
 | |
|   minify: TerserPlugin.esbuildMinify,
 | |
|   terserOptions: genTerserOptions(
 | |
|     {
 | |
|       minify: false,
 | |
|       minifyWhitespace: true,
 | |
|       minifyIdentifiers: false,
 | |
|       minifySyntax: true
 | |
|     },
 | |
|     options
 | |
|   ),
 | |
|   parallel: options.parallel
 | |
| })
 | |
| 
 | |
| // `terserOptions` options will be passed to `swc` (`@swc/core`)
 | |
| // Link to options - https://swc.rs/docs/config-js-minify
 | |
| const swcMinify = (options) => ({
 | |
|   minify: TerserPlugin.swcMinify,
 | |
|   terserOptions: genTerserOptions(
 | |
|     {
 | |
|       compress: {
 | |
|         unused: true
 | |
|       },
 | |
|       mangle: true
 | |
|     },
 | |
|     options
 | |
|   ),
 | |
|   parallel: options.parallel
 | |
| })
 | |
| 
 | |
| // `terserOptions` options will be passed to `uglify-js`
 | |
| // Link to options - https://github.com/mishoo/UglifyJS#minify-options
 | |
| const uglifyJsMinify = (options) => ({
 | |
|   minify: TerserPlugin.uglifyJsMinify,
 | |
|   terserOptions: genTerserOptions({}, options),
 | |
|   parallel: options.parallel
 | |
| })
 | |
| 
 | |
| // Currently we do not allow custom minify function
 | |
| const getMinify = (options) => {
 | |
|   const { minify = 'terser' } = options.terser || {}
 | |
| 
 | |
|   const minifyMap = {
 | |
|     terser: terserMinify,
 | |
|     esbuild: esbuildMinify,
 | |
|     swc: swcMinify,
 | |
|     uglifyJs: uglifyJsMinify
 | |
|   }
 | |
|   return minifyMap[minify](options)
 | |
| }
 | |
| 
 | |
| module.exports = getMinify
 |