[TOC] >[success] # 压缩 ~~~ 1.在代码运行上线的时候我们需要对,js文件和html 以及css 要进行压缩处理 2.webpack4.x版本已经内置了uglifyjs-webpack-plugin实现'js'压缩 ~~~ >[info] ## css 和 html 压缩 ~~~ 1.css 的压缩使用'optimize-css-assets-webpack-plugin'和预处理器'cssnano' 'npm i optimize-css-assets-webpack-plugin cssnano -D' 2.html 压缩文件'html-webpack-plugin' -- 'npm i html-webpack-plugin -D ' ~~~ >[danger] ##### css 压缩 案例说明 ~~~ 1.css 压缩值得是对css文件内容压缩,因此是要和'MiniCssExtractPlugin' 这个生成css 文件的Plugin一起使用 才有实际用处 2.如果 CSS 超过 150KB 才需要考虑是否将它提取到单独文件中,否则将 CSS 代码嵌入代码减少一次请 求效果可能更好。 ~~~ ~~~ const path = require('path'); const MiniCssExtractPlugin = require('mini-css-extract-plugin') // 引入css 压缩文件plug const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin') module.exports = { entry: { index: './src/index.js', sreach: './src/hellowWebpack.js' }, output: { path: path.join(__dirname, 'dist'), filename: '[name][chunkhash:8].js' }, // 注意在这里配置的loader module: { rules: [{ test: /\.js$/, use: 'babel-loader' }, { test: /\.css$/, use: [MiniCssExtractPlugin.loader,'css-loader'] // css 解析配置 }] }, plugins: [ new MiniCssExtractPlugin({ filename: '[name][contenthash:8].css' }), // css 压缩文件 new OptimizeCssAssetsPlugin({ assetNameRegExp: /\.css$/g, cssProcessor: require('cssnano') }) ] } ~~~ >[danger] ##### html 压缩 [关于 html-webpack-plugin](https://www.cnblogs.com/wonyun/p/6030090.html) ~~~ 说明如果你是webpack4.x 版本并且运行时候提示'Cannot read property 'tap' of undefined', 将'HtmlWebpackPlugin' 降级到4.x版本就好了 ~~~ ~~~ 1.之前可以利用webpack打包生成css js 等文件,但是打包后的html页面文件是没有,每次一出都是需要手动去写 html 页面并且将打包好的文件引入 2.'html-webpack-plugin'这个插件会将你配置的模板页面,在打包的时候一并生成一个html页面,并且将对应的css和js 自动引入 3.'HtmlWebpackPlugin' 自带html模板,可以定义模板例如 <head> ... <title>Webpack</title> </head> <body> <div class="container"> <h1><%= htmlWebpackPlugin.options.title %></h1> </div> </body> </html> ~~~ ~~~ const HtmlWebpackPlugin = require('html-webpack-plugin') module.export = { plugins: [ new HtmlWebpackPlugin({ template: path.join(__dirname,'src/search.html'), // 使用模板 filename: 'search.html', // 打包后的文件名 chunks: ['search'], // 打包后需要使用的chunk(文件) inject: true, // 默认注入所有静态资源 title: 'Webpack Plugin Sample', // 设置html标题 meta: { // 设置对象中的元数据标签 viewport: 'width=device-width' }, minify: { html5:true, collapsableWhitespace: true, preserveLineBreaks: false, minifyCSS: true, minifyJS: true, removeComments: false } }), ] } ~~~ >[danger] ##### 问答 ~~~ 1.为什么已经默认有了JS压缩和使用了OptimizeCssAssetsPlugin 压缩 CSS。但在 HtmlWebpackPlugin 中的 minify 中还要加入 minifyCSS 和 minifyJS,会不会过于繁琐呢? '答':HtmlWebpackPlugin 里面的minify 的 minifyCSS 参数和minifyJS参数是用于去压缩一开始就内联在 html 里面的 css和js不是打包生成的 css 和 js 2.bundle,chunk和module '答':bundle:打包最终生成的文件 chunk:每个chunk是由多个module组成,可以通过代码分割成多个chunk。 module:webpack中的模块(js、css、图片等等) 3.chunk 对应的参数 '答':HtmlWebpackPlugin中参数chunks的值数组对应的是entry中的键 举个例子,下面例子中index.html最后注入的sreach对应的 js文件: entry: { index: './src/index.js', sreach: './src/hellowWebpack.js' }, new HtmlWebpackPlugin({ template: path.join(__dirname, 'src/index.html'), // 使用模板 filename: 'index.html', // 打包后的文件名 chunks: ['sreach'], // 打包后需要使用的chunk(文件) }) 4.HtmlWebpackPlugin 的 chunks 配置中引入 chunks 顺序会有影响吗? '答':会有影响的,chunks 决定了插入到 html 里面的 js 脚本的引用顺序 ~~~