webpack插件机制

webpack插件机制是整个webpack工具的核心,那么webpack插件有什么特点呢?

1、独立的JS模块,暴露相应的函数

2、函数原型上的apply方法会注入compiler对象(之所以要定义apply方法,是因为源码中是通过plugin.apply()调用插件的)

3、compiler对象上挂载了相应的webpack事件钩子

4、事件钩子的回调函数里能拿到编译后的compilation对象,如果是异步钩子还能拿到相应的callback

下面看个例子:

function MyPlugin(options) {} //根据options配置插件
MyPlugin.prototype.someFunc = function(){}
// 2.函数原型上的 apply 方法会注入 compiler 对象,pply方法是必须要有的,因为当我们使用一个插件时(new somePlugins({})),webpack会去寻找插件的apply方法并执行
MyPlugin.prototype.apply = function(compiler) { // 3.compiler 对象上挂载了相应的 webpack 事件钩子 4.事件钩子的回调函数里能拿到编译后的 compilation 对象 
   // compiler.plugin(‘***‘)和compilation.plugin(‘***‘)代表什么?
   // document.addEventListener熟悉吧?其实是类似的
   // compiler.plugin(‘***‘)就相当于给compiler设置了事件监听
   // 所以compiler.plugin(‘compile‘)就代表:当编译器监听到compile事件时,我们应该做些什么
 
  // compile(‘编译器‘对‘开始编译‘这个事件的监听)
  compiler.plugin("compile", function(params) {
    console.log("The compiler is starting to compile...");
  });
  // compilation(‘编译器‘对‘编译ing‘这个事件的监听)
   compiler.plugin("compilation", function(compilation) {
     console.log("The compiler is starting a new compilation...");
     // 在compilation事件监听中,我们可以访问compilation引用,它是一个代表编译过程的对象引用
     // 我们一定要区分compiler和compilation,一个代表编译器实体,另一个代表编译过程
     // optimize(‘编译过程‘对‘优化文件‘这个事件的监听)
     compilation.plugin("optimize", function() {
       console.log("The compilation is starting to optimize files...");
     });
   });
  // emit(‘编译器‘对‘生成最终资源‘这个事件的监听)
  compiler.plugin(‘emit‘, (compilation, callback) => { ... })

} // 1.独立的 JS 模块,暴露相应的函数 module.exports = MyPlugin

var MyPlugun = require(‘my-plugin‘)var webpackConfig = {
  plugins:[  new MyPlugin({options:true})]}

compiler对象

compiler 即 webpack 的编辑器对象,代表了完整的配置的webpack环境。一旦开启webpack之后,这个对象就被构建了,并且这个对象会使用所有操作设置,包括options, loaders, 以及plugins来进行配置。compiler 对象中包含了所有 webpack 可配置的内容,开发插件时,我们可以从 compiler 对象中拿到所有和 webpack 主环境相关的内容。

compilation 对象

compilation 对象代表了一次单一的版本构建和生成资源。当运行webpack开发中间件的时候,每次检测到文件变化的时候都会产生一个新的compilation,因此会生成一系列编译后的资源。Compilation表示有关模块资源,已编译资源,已更改文件和监视依赖关系的当前状态的信息。该compilation还提供了许多回调点,插件可以选择执行自定义操作。一个编译对象表现了当前的模块资源、编译生成资源、变化的文件、以及被跟踪依赖的状态信息。

tapable 库

这个库暴露了所有和事件相关的 pub/sub 的方法。而且函数 Compiler 以及函数 Compilation 都继承自 Tapable。

事件钩子其实就是类似 MVVM 框架的生命周期函数,在特定阶段能做特殊的逻辑处理。

参考:https://www.cnblogs.com/MuYunyun/p/8875908.html

推荐:http://www.360doc.com/content/18/0305/08/35331283_734368495.shtml

原文地址:https://www.cnblogs.com/wuhuaguo/p/10095692.html

时间: 2024-10-13 07:02:59

webpack插件机制的相关文章

基于接口的插件机制

一.前言 插件,意味着可扩展,且宿主程序不依赖于插件,即插即用.这种软件设计方式可以使我们的应用程序最大化地获得可扩展性.适应性和稳定性,而且便于软件的维护和升级.在什么场景下使用插件呢?例如在本篇文章中,我个人有一个小需求就是希望记事本带行号,于是我自己写了一个极简易的编辑器(CodeEditor),以这个编辑器为例,主体程序功能包括常见的新建.复制.查找.保存等已经完成,但是在使用的过程中发现需要用到 格式化 这个功能,但是我还不想再去改主程序,这种情形下就可以通过插件来实现,这样以后在使用

php中的钩子(hook插件机制)

对"钩子"这个概念其实不熟悉,最近看到一个php框架中用到这种机制来扩展项目,所以大概来了解下. hook插件机制的基本思想: 在项目代码中,你认为要扩展(暂时不扩展)的地方放置一个钩子函数,等需要扩展的时候,把需要实现的类和函数挂载到这个钩子上,就可以实现扩展了. 思想就是这样听起来比较笼统,看一个网上的实现的例子. 整个插件机制包含三个部分: 1.hook插件经理类:这个是核心文件,是一个应用程序全局Global对象.它主要有三个职责 1>监听已经注册了的所有插件,并实例化这

xadmin的插件机制

xadmin的视图方法中如果加了@filter_hook 标记的都可以作为插件的钩子函数. 例如在ListAdminView类中有许多加了上述标记的方法, @filter_hook def get_context(self): """ Prepare the context for templates. """ self.title = _('%s List') % force_unicode(self.opts.verbose_name) mo

webpack模块机制浅析【一】

webpack模块机制浅析[一] 今天看了看webpack打包后的代码,所以就去分析了下代码的运行机制. 下面这段代码是webpack打包后的最基本的形式,可以说是[骨架] (function(root,fn){ if(typeof exports ==='object'&&typeof module === 'object'){ module.exports = fn();//exports和module同时存在,说明时在node的CommonJs规范下,这个时候使用module.exp

[转]仿World Wind构造自己的C#版插件框架——WW插件机制精简改造

很久没自己写东西啦,早该好好总结一下啦!一个大师说过“一个问题不应该被解决两次!”,除了一个好脑筋,再就是要坚持总结. 最近需要搞个系统的插件式框架,我参照World Wind的插件方式构建了个插件框架,可以参照<WorldWind学习系列五:插件加载过程全解析>,下面与大家分享一下. 初始化时,加载前面两个插件,可以动态加载KeyBoarderLoader,如下图: 该插件框架是WW插件框架的精简改造版,非常适用于插件式系统开发,也希望帮助大家学习一下WW的插件加载机制. 缺陷在于:未实现事

ImitateLogin新增插件机制以及又一个社交网站的支持

我的文章里已经多次介绍 imitate-login ,这是我最近一直在维护的一个使用c#模拟社交网站登录的开源项目,现在新增了对插件的支持以及一个新的网站(由于某种原因,会在文章结束部分介绍:而且仅会出现在博客中).希望喜欢的读者可以通过 Star & fork 来支持我,我也会据此来决定时间的分配. imitate-login 现在已经提供了对插件的支持:目前有两个部分使用到了插件机制,登录自身实现以及登录过程中的验证码识别过程:其中登录过程仅支持 MEF(Managed Extensibil

行为扩展以及插件机制

在thinkPHP中的行为扩展和插件机制. 首先行为扩展这个概念是TP框架的核心组成之一,关于行为的解释我就粗略的概括一下吧: TP在从接受到HTTP请求到最终将试图输出,期间经历的很多步骤,这些步骤大家可以在http://document.thinkphp.cn/manual_3_2.html#system_process这里面看到. 那么行为扩展实际上就是在这些流程里面买下了一个钩子,你可以往钩子里添加你自己的业务逻辑 当程序执行到某些钩子位置时将自动触发你的业务逻辑,http://docu

winform插件机制学习

这两天在看自定义控件,原来有太多知识没有掌握.今天看到插件机制,心里突然一亮,这个东西听了不少次,就是不知道是啥回事.这次有幸书里包含一个案例,我就跟着它一步步来.终于知道是什么回事了.这个应该在软件开发中非常多见.只是当时不理解罢了. 开始 新建一个winform项目CustomControls在窗体上放一个button按钮 窗体代码 using System;using System.Collections.Generic;using System.ComponentModel;using

Atitit&#160;插件机制原理与设计微内核&#160;c#&#160;java&#160;的实现attilax总结

Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结 1. 微内核与插件的优点1 2. 插件的注册与使用2 2.1. Ioc容器中注册插件2 2.2. 启动器微内核启动3 3. 插件的俩种执行策略3 3.1. 必须手动接续,否则自动终止(推荐)3 3.2. 必须手动throw  stop ex终止,负责自动接续..4 4. 插件链的生成原理4 5. -------code4 6. 参考7 1. 微内核与插件的优点 但凡有生命力的产品,都是在扩展性方面设计的比较好的,因