9种plugin
1. html-webpack-plugin
-
作用
- 在项目中的原 html 文件基础上,添加 script 标签引入 webpack 打包好的资源路径(就不用自己每次手动去改了),生成新的 html 文件,输出到目标目录
- 还有更多选项可以优化原 html 文件
-
安装
npm i html-webpack-plugin -D -
在 json 中配置
import HtmlWebpackPlugin from "html-webpack-plugin"; module.exports = { plugins: [ new HtmlWebpackPlugin({ template: path.resolve(__dirname, "./src/index.html"), minify: { collapseWhitespace: true, minifyJS: true, minifyCSS: true, removeComments: true, useShortDoctype: true, }, }), ], };- template 指定原文件路径,一旦指定后就不能用 title,favicon 等配置项
-
在 chain 中配置
import HtmlWebpackPlugin from "html-webpack-plugin"; config.plugin("HtmlWebpackPlugin").use(HtmlWebpackPlugin, [ { template: path.resolve(__dirname, "./src/index.html"), minify: { collapseWhitespace: true, minifyJS: true, minifyCSS: true, removeComments: true, useShortDoctype: true, }, }, ]);
2. mini-css-extract-plugin
-
作用
- 提取 css 到单独的文件中
- 每个包含 css 的 JS 文件都创建 一个 css 文件,因此支持 css 的按需加载
- 这里的 JS 文件不是指组件对应的 JS 文件,是指打包后生成的 JS 文件
- 不可以和 style-loader 一起使用
-
安装
npm i mini-css-extract-plugin -D -
注意
- 新版本要 webpack 5 才能使用,旧版也支持 4,webpack 4 之前用的是 extract-text-webpack-plugin
-
在 json 中配置
import MiniCssExtractPlugin from "mini-css-extract-plugin"; module.exports = { module: { rules: [ { test: /.css$/, use: [MiniCssExtractPlugin.loader, "css-loader"] } ] } plugin: [ new MiniCssExtractPlugin({ filename: "[name].[chunkhash].css", chunkFilename: "chunks/[name].[chunkhash].css" }) ] }- filename 代表打包后的 入口 js 文件 对应的 css 文件名字
- chunkFilename 代表打包后的 非入口 js 文件 对应的 css 文件名字,可加 chunks 作为文件夹名
-
在 chain 中配置
import MiniCssExtractPlugin from "mini-css-extract-plugin"; config.plugin("MiniCssExtractPlugin").use(MiniCssExtractPlugin, [ { filename: "[name].[chunkhash].css", chunkFilename: "chunks/[name].[chunkhash].css", }, ]); config.module .rule("css") .test(/\.css$/) .use("mini-css-loader") .loader(MiniCssExtractPlugin.loader) .end() .use("css-loader") .loader("css-loader") .end();
3. optimize-css-assets-webpack-plugin
-
作用
- 对 mini-css-extract-plugin 提取出来的样式进行压缩,同时还需要配合 cssnano 压缩器使用
-
安装
npm i optimize-css-assets-webpack-plugin -D -
在 json 中配置
import OptimizeCSSAssetsPlugin from "optimize-css-assets-webpack-plugin"; module.exports = { optimization: { minimizer: [ new OptimizeCSSAssetsPlugin({ assetNameRegExp: /\.optimize\.css$/g, cssProcessor: require("cssnano"), cssProcessorOptions: { discardComments: { removeAll: true, }, }, canPrint: true, }), ], }, }; -
在 chain 中配置
import OptimizeCSSAssetsPlugin from "optimize-css-assets-webpack-plugin"; config.optimization.minimizer("css").use(OptimizeCSSAssetsPlugin, [ { assetNameRegExp: /\.optimize\.css$/g, cssProcessor: require("cssnano"), cssProcessorOptions: { discardComments: { removeAll: true, }, }, canPrint: true, }, ]);
4. terser-webpack-plugin
-
原理
- 在打包时对代码进行压缩,减少体积
- 比如移除空格换行、缩短变量名,同时还能起到混淆的作用
- 作用类似于以前用的 uglifyjs-webpack-plugin,但 terser-webpack-plugin 更先进,支持 ES6+代码的压缩
-
安装
npm i terser-webpack-plugin -D -
在 json 中配置
import TerserPlugin from "terser-webpack-plugin"; module.exports = { optimization: { minimize: true, minimizer: [ new TerserPlugin({ terserOptions: { compress: { drop_console: true, }, }, }), ], }, };- minimize 为 true 代表人为设置开启
- 但如果已经在顶层写了
mode:production,就不需要人为设置
- 但如果已经在顶层写了
- 这里加入 minimizer,可以额外增加配置
- 比如配置了 compress 选项下的 drop_console,自动移除掉控制台打印的代码
- minimize 为 true 代表人为设置开启
-
在 chain 中配置
import TerserPlugin from "terser-webpack-plugin"; config.optimization.minimize(true); config.optimization.minimizer("terser").use(TerserPlugin, [ { terserOptions: { compress: { drop_console: true, }, }, }, ]);
5.compression-webpack-plugin
-
作用
- 在打包时,提前压缩出 gzip 文件,后端可以直接返回,不用临时压缩
- 需要配合后端 nginx 配置的
gzip_static on使用
-
安装
npm i compression-webpack-plugin -D -
在 json 中配置
import CompressionWebpackPlugin from "compression-webpack-plugin"; module.exports = { plugins: [ new CompressionWebpackPlugin({ algorithm: "gzip", test: /\.(js|css)(\?.*)?$/i, threshold: 10240, minRatio: 0.7, deleteOriginalAssets: false, }), ], }; -
在 chain 中配置
import CompressionWebpackPlugin from "compression-webpack-plugin"; config.plugin("CompressionWebpackPlugin").use(CompressionWebpackPlugin, [ { algorithm: "gzip", test: /\.(js|css)(\?.*)?$/i, threshold: 10240, minRatio: 0.7, deleteOriginalAssets: false, }, ]);
6.brotli-webpack-plugin
-
作用
- 在打包时,提前压缩出 br 文件,后端可以直接返回,不用临时压缩
- 需要配合后端 nginx 配置的
brotil_static on使用,同时还要 nginx 添加动态 brotil 模块
-
安装
npm i brotli-webpack-plugin -D -
在 json 中配置
import BrotilWebpackPlugin from "brotli-webpack-plugin"; module.exports = { plugins: [ new BrotilWebpackPlugin({ test: /\.(js|css)(\?.*)?$/i, threshold: 10240, minRatio: 0.7, }), ], }; -
在 chain 中配置
import BrotilWebpackPlugin from "brotli-webpack-plugin"; config.plugin("BrotilWebpackPlugin").use(BrotilWebpackPlugin, [ { test: /\.(js|css)(\?.*)?$/i, threshold: 10240, minRatio: 0.7, }, ]);
7. webpack-bundle-analyzer
-
作用
- 分析包的体积,生成图表
-
安装
npm i webpack-bundle-analyzer -D -
在 json 中配置
import BundleAnalyzerPlugin from "webpack-bundle-analyzer"; module.exports = { plugins: [ new BundleAnalyzerPlugin({ analyzerMode: process.env.STATS || "disabled", }), ], }; -
在 chain 中配置
import BundleAnalyzerPlugin from "webpack-bundle-analyzer"; config.plugin("BundleAnalyzerPlugin").use(BundleAnalyzerPlugin, [ { analyzerMode: process.env.STATS || "disabled", }, ]); -
使用
-
平时禁用,只有配置环境变量 STATS 才启用,然后在浏览器中打开一个窗口
-
改动
package.json"scripts": { "analyze": "cross-env STATS=server npm run start" } -
执行命令
npm run analyze
-
-
如果不想打开窗口,而是想生成文件类型的分析报告,可以添加配置项
analyzerMode: 'disabled' generateStatsFile: false, statsFilename: 'stats.json',- 使用这个 json
"analyze-json": "webpack-bundle-analyzer --port 8888 ./dist/stats.json"
- 使用这个 json
8. webpack-obfuscator
-
作用
- 对代码进行高强度的混淆,避免被人逆向
-
安装
npm i webpack-obfuscator -D -
在 json 中配置
import WebpackObfuscator from "webpack-obfuscator"; module.exports = { plugins: [ new WebpackObfuscator({ rotateStringArray: true, }), ], }; -
在 chain 中配置
import WebpackObfuscator from "webpack-obfuscator"; config.plugin("WebpackObfuscator").use(WebpackObfuscator, [ { rotateStringArray: true, }, ]);
9.HashedModuleIdsPlugin
-
作用
- 解决数字 id 问题,防止因其他模块的增加导致原有模块的 id 变化,使得缓存失效
- 原理: 不是生成数字,而是生成字符串 hash
-
无需安装
- 是在 webpack 3 中被引入的
-
在 json 中配置
module.exports = { plugins: [ new webpack.ids.HashedModuleIdsPlugin() ] } -
在 chain 中配置
config.plugin("HashedModuleIdsPlugin").use(webpack.ids.HashedModuleIdsPlugin);