# Plugins

插件用于 bundle 文件的优化,资源管理和环境变量注入,作用于整个构建过程。

# 常用 plugins

  • HtmlWebpackPlugin: 创建 html 文件去承载输出的 bundle
  • CommonsChunkPlugin: 将 chunks 相同的模块代码提取成公共 js
  • CleanWebpackPlugin: 清理构建目录
  • ExtractTextWebpackPlugin: 将 css 从 bundle 文件里提取成一个独立的 css 文件
  • CopyWebpackPlugin: 将文件或者文件拷贝到构建的输出目录
  • UglifyjsWebpackPlugin: 压缩 js
  • ZipWebpackPlugin: 将打包出的资源生成一个 zip 包
  • SplitChunksPlugin: 提取公共资源
  • HardSourceWebpackPlugin: 缓存加速二次构建速度

# html-webpack-plugin (opens new window)

默认根据配置将 css,js 文件注入到 html 里

# 安装

yarn add --dev html-webpack-plugin@next

# 使用

  • webpack.config.js
const HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {
    entry: "index.js",
    output: {
        path: __dirname + "/dist",
        filename: "index_bundle.js",
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: "./src/index.html",
        }),
    ],
};

# mini-css-extract-plugin (opens new window)

取代 style-loader,提取 js 中的 css 成单独文件

  • 安装
yarn add css-loader -D
yarn add mini-css-extract-plugin -D
  • 使用
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

module.exports = {
    module: {
        rules: [
            {
                test: /\.css$/i,
                use: [MiniCssExtractPlugin.loader, "css-loader"],
            },
        ],
    },
    plugins: [new MiniCssExtractPlugin()],
};

# css-minimizer-webpack-plugin (opens new window)

压缩 css

  • 安装
yarn add css-minimizer-webpack-plugin -D
  • 使用
module.exports = {
    optimization: {
        minimize: true,
        minimizer: [
            new CssMinimizerPlugin({
                parallel: true,
                cache: true,
            }),
        ],
    },
};

# clean-webpack-plugin (opens new window)

默认会删除 output 指定的输出目录

  • 安装
yarn add clean-webpack-plugin -D
  • 使用
const { CleanWebpackPlugin } = require("clean-webpack-plugin");

module.exports = {
    plugins: [new CleanWebpackPlugin()],
};

# terser-webpack-plugin (opens new window)

多进程压缩,terser-webpack-plugin (opens new window) 开启 parallel

  • 安装
yarn add terser-webpack-plugin -D
  • 代码示例
module.exports = {
    optimization: {
        minimizer: [
            new TerserPlugin({
                // parallel: true // 默认值:2*cpu -1
                parallel: 4,
            }),
        ],
    },
};

# split-chunks-plugin (opens new window)

SplitChunksPlugin 在 webpack4 以后是内置的,替代 CommonsChunkPlugin 插件

  • chunks 参数说明:

    • async 异步引入的库进行分离
    • initial 同步引入的库进行分离
    • all 所有引入的库进行分离
  • 代码示例

module.exports = {
    optimization: {
        splitChunks: {
            cacheGroups: {
                commons: {
                    test: /(react|react-dom)/,
                    name: "vendors",
                    chunks: "all",
                },
            },
        },
    },
};

# hard-source-webpack-plugin (opens new window)

HardSourceWebpackPlugin 是 webpack 的插件,为模块提供中间缓存步骤。为了查看结果,您需要使用此插件运行 webpack 两次:第一次构建将花费正常的时间, 第二次构建将显着加快(大概提升 90%的构建速度)

  • 代码示例
const HardSourceWebpackPlugin = require("hard-source-webpack-plugin");

module.exports = {
    plugins: [new HardSourceWebpackPlugin()],
};

# friendly-errors-webpack-plugin (opens new window)

Friendly-errors-webpack-plugin 可以识别某些类的 webpack 错误,并清除,汇总并确定优先级,以提供更好的开发人员体验。

  • 安装
npm install friendly-errors-webpack-plugin --save-dev
  • 代码示例
const FriendlyErrorsWebpackPlugin = require("friendly-errors-webpack-plugin");

module.exports = {
    // ...
    plugins: [new FriendlyErrorsWebpackPlugin()],
    // ...
};