插件(plugin)

插件是 webpack 的 支柱 功能。webpack 自身也是构建于,你在 webpack 配置中用到的相同的插件系统之上!

插件目的在于解决 loader 无法实现的其他事

剖析

webpack 插件是一个具有 apply 方法的 JavaScript 对象。apply 方法会被 webpack compiler 调用,并且 compiler 对象可在整个编译生命周期访问。

ConsoleLogOnBuildWebpackPlugin.js

  1. const pluginName = 'ConsoleLogOnBuildWebpackPlugin';
  2. class ConsoleLogOnBuildWebpackPlugin {
  3. apply(compiler) {
  4. compiler.hooks.run.tap(pluginName, compilation => {
  5. console.log('webpack 构建过程开始!');
  6. });
  7. }
  8. }

compiler hook 的 tap 方法的第一个参数,应该是驼峰式命名的插件名称。建议为此使用一个常量,以便它可以在所有 hook 中复用。

用法

由于插件可以携带参数/选项,你必须在 webpack 配置中,向 plugins 属性传入 new 实例。

根据你使用 webpack 的需要,这里有多种方式使用插件。

配置

webpack.config.js

  1. const HtmlWebpackPlugin = require('html-webpack-plugin'); //通过 npm 安装
  2. const webpack = require('webpack'); //访问内置的插件
  3. const path = require('path');
  4. module.exports = {
  5. entry: './path/to/my/entry/file.js',
  6. output: {
  7. filename: 'my-first-webpack.bundle.js',
  8. path: path.resolve(__dirname, 'dist')
  9. },
  10. module: {
  11. rules: [
  12. {
  13. test: /\.(js|jsx)$/,
  14. use: 'babel-loader'
  15. }
  16. ]
  17. },
  18. plugins: [
  19. new webpack.ProgressPlugin(),
  20. new HtmlWebpackPlugin({template: './src/index.html'})
  21. ]
  22. };

Node API

在使用 Node API 时,还可以通过配置中的 plugins 属性传入插件。

some-node-script.js

  1. const webpack = require('webpack'); //访问 webpack 运行时(runtime)
  2. const configuration = require('./webpack.config.js');
  3. let compiler = webpack(configuration);
  4. new webpack.ProgressPlugin().apply(compiler);
  5. compiler.run(function(err, stats) {
  6. // ...
  7. });

你知道吗:以上看到的示例和 webpack 自身运行时(runtime) 极其类似。wepback 源码中隐藏有大量使用示例,你可以用在自己的配置和脚本中。


贡献人员

MisterDev MisterDev TheLarkInn TheLarkInn byzyk byzyk jhnns jhnns johnstew johnstew rouzbeh84 rouzbeh84