重构Webpack系列之五 ---- Plugins

重构Webpack系列之五 ---- Plugins

webpack重构系列之插件

很高兴你能读到我这篇文章,对于前端工程师来讲,webpack是一块硬骨头,个人认为,一个合格的前端工程师不应该不懂webpack。我写这系列的文章也是为了能把这块硬骨头啃下来,希望大家一起加油进步吧!
这个系列只是为大家介绍了webpack比较浅显的一些概念,后续会继续持续输出原理系列的文章,请大家保持关注~

一、概念

插件(plugins)是webpack的支柱功能。插件的目的在于解决loader无法实现的其他操作,除此之外,webpack还提供了很多开箱即用的插件。

plugins选项用于各种方式自定义webpack的构建过程,webpack附带了各种内置的插件,我们可以通过webpack.[plugin-name]来访问这些插件。

二、原理剖析

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

备注:以下代码均在webpack.config.js进行。

ConsoleLogOnBuildWebpackPlugin.js

const pluginName = 'ConsoleLogOnBuildWebpackPlugin';

class ConsoleLogOnBuildWebpackPlugin {
  apply(compiler) {
	compiler.hooks.run.tap(pluginName, (compilation) => {
      console.log('webpack 构建正在启动!')
    })
  }
}

module.exports = ConsoleLogOnBuildWebpackPlugin;

compiler是webpack在执行程序过程中的一个对象,代表着webpack本身。hook是compiler的钩子。tap是webpack用来定义插件的一个框架,叫做Tapable,大家可以自行上网查阅,这里不做展开了。

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

三、使用方式

由于插件可以携带params或是一个Object选项,所以你必须在webpack配置中,向plugin属性传入一个new实例。

不过一般使用方式都取决于你对webpack的用法,用法不同对应的使用插件的方式也各不相同。

配置文件方式

const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack');

module.exports = {
  //...
  plugins: [
    new webpack.ProgressPlugin();
    new HtmlWebpackPlugin({template: './src/index.html'})
  ]
}

ProgressPlugin用于自定义编译过程中的进度报告,HtmlWebpackPlugin将生成一个HTML文件,并在其中使用script引入一个output选项打包出来的bundle.js。

Node API 方式

在使用Node API的时候,还可以通过配置plugins的属性传入需要使用到的插件:

const webpack = require('webpack');
const configuration = require('./webpack.config.js');

let compiler = webpack(configuration);

new webpack.ProgressPlugin().apply(compiler);

compiler.run(function (err,stats) {...});

四、插件实例

1.使用单个webpack插件

const webpack = require('webpack');

module.exports = {
  //...
  plugin: [
    new webpack.DefinePlugin({
     // Definitions...
    })
  ]
}

2.使用多个webpack插件

const webpack = require('webpack');
// 导入非webpack自带插件
const DashboardPlugin = require('webpack-dashboard/plugin');

module.exports = {
  //...
  plugins: [
    new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': 'production'
    }),
    new DashboardPlugin(),
    new webpack.HotModuleReplacementPlugin()
  ]
}

五、常用插件

下面为大家罗列出来了一些开发过程中常用的webpack插件,具体作用大家就自行翻阅官网~

  • CommonsChunkPlugin
  • DefinePlugin
  • DllPlugin
  • EslintWebpackPlugin
  • HotModuleReplacementPlugin
  • HtmlWebpackPlugin
  • MiniCssExtractPlugin
  • SourceMapDevToolPlugin

这篇文章到这里就结束啦,各位看官老爷不嫌弃的话就动动小手点点赞,支持一下前端菜鸟的创作吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值