当前位置: 首页 > 编程日记 > 正文

webpack源码之tapable

引言

去年3月的时候当时写了一篇webpack2-update之路,到今天webpack已经到了4.2,更新挺快的,功能也在不断的完善,webpack4特性之一就是零配置, webpack生命力真的很顽强,积极跟上环境的变化,响应社区的需求,不断的迭代,因为parcel在其之前就有这个特性了。直接运行webpack命令,默认production模式,但是会有WARNING。

如下所示在package.json中启动脚本配置

"scripts": {"build": "webpack --mode production",  //代码做了压缩/作用域提升(就是将依赖模块内容直接放到当前模块内)/去掉了开发模式下存在的代码/更容易使用输出的资源文件(assets做了优化处理)"dev": "webpack-dev-server --open --mode development", //支持注释/提示/source maps},

这种约定大于配置的开发方式,在很多框架中都存在, 默认的配置覆盖了大部分用户使用的场景,提高了大部分人的生产力。当然除了默认配置外还有其它一些特性,例如支持导入更多的模块类型,可以解析.json.wasm类型的文件等等。

虽然使用形式上变化的这么快, 但是其核心思想没多大变化。 其中webpack内部有一个事件流机制,基于tapable,也是本文研究的对象,它的作用是将各个插件串联起来,还有webpack中负责编译的Compile也是tapable的实例,所以这个蛮重要的,下面详细说一下。

tapable概念

tapable类似于node中的EventEmitter,专注于自定义事件的触发和处理,自身可以被继承或混入到其它模块中。例如compile的实现就用到了tapable,如下所示。

var Tapable = require("tapable");function Compiler() {Tapable.call(this);
}Compiler.prototype = Object.create(Tapable.prototype);

Hook分析

class Car {constructor() {this.hooks = {accelerate: new SyncHook(["newSpeed"]),break: new SyncHook(),calculateRoutes: new AsyncParallelHook(["source", "target", "routesList"])};}}
const myCar = new Car();
//使用tap方法添加了一个消费者,其中tap的第一个参数,一般是用来确认插件的名称
myCar.hooks.accelerate.tap("LoggerPlugin", newSpeed => console.log(`Accelerating to ${newSpeed}`));
myCar.hooks.accelerate.call('100')
//输出   Accelerating to 100

说明 其中SyncHook继承了Hook方法,主要作用是重写了compile方法。而Hook内部维护了 this.taps = [],每次执行tap时,都会进行insert,call的时候通过

this[name](...args)

进行执行,在call执行的时候其内部涉及到工厂模式,因为call的调用,需要先执行当前SyncHook的compile方法,用工厂模式的目的就是根据传入的不同option返回不同的通过new Function拼接出的
处理逻辑函数,因为Hook有好几种实现,在实现类的实例中添加的消费者可以是sync,promise,async等等,都需要对应不同compile来进行处理。

tapable使用分析

const {Tapable,SyncHook} = require("tapable");
const myCar = new Tapable();
myCar.hooks = {myHook: new SyncHook()
};
let speed = 0;
myCar.plugin("my-hook", () => speed+=2);
myCar.hooks.myHook.call();
myCar.plugin("my-hook", () => speed += 10);
myCar.hooks.myHook.call();
console.log(speed);
//输出14

说明
plugin(name:string, handler:function):允许将一个自定义插件注册到 Tapable 实例 的事件中。它的行为和 EventEmitter 的 on() 方法相似,用来注册一个处理函数/监听器,来在信号/事件发生时做一些事情,他最终还是调用hook.tap(tapOpt, options.fn)进行存储。而call就全部取出来执行。

总结

上面这些知识是理解插件和webpack运行原理的前置条件,更多内容待下次分解

参考源码版本说明
tapable: "1.0.0",
webpack: "^4.2.0",

参考链接
https://medium.com/webpack/we...
https://medium.com/webpack/we...
https://github.com/dwqs/blog/...
https://doc.webpack-china.org...
https://github.com/webpack/ta...

相关文章:

常用的 linux命令

为什么80%的码农都做不了架构师?>>> 将目录dir1复制成目录dir2 cp -R file1 file2 同时将文件file1、file2、file3与目录dir1复制到dir2 cp -R file1 file2 file3 dir1 dir2 mv dir1 dir2 移动或修改目录名称 rm -rf 删除文件&目录 vi :q! :wq mk…

68款大规模机器学习数据集,涵盖CV、语音、NLP | 十年资源集

参加 2019 Python开发者日,请扫码咨询 ↑↑↑作者 | 琥珀出品 | AI科技大本营(ID:rgznai100)此前营长为大家分享过不少机器学习相关数据集的资源,例如 Mozilla 的 1400 小时开源语音数据集;ApolloScape 的大规模自动驾…

【Qt】Q_PROPERTY():属性系统

一、简介 Qt属性系统基于元对象Meta-Object系统,因此在使用时,需要继承QObject类并添加宏Q_OBJECT,属性除了具有类成员的功能外,还可以通过元对象系统访问,比如可以使用信号和槽机制。 二、使用方法 在继承QObject的类中,使用宏Q_PROPERTY()来注册属性。 Q_PROPERTY(…

从零开始学 Python 之运算符

从零开始学 Python 之运算符 前言 大家好,这里是「痴海」从零开始学习 Python 系列教程。此文首发于「痴海」公众号,欢迎大家去关注。学习一门语言最好的办法,就是教懂别人。在这公众号,我会从 Python 最基础的教程写起&#xff0…

今天照了大肚照

今天陪老婆去照了大肚照,本来累了一周了好不容易盼到周六想睡个懒觉,结果比平时起床还早!要去照相!然而一想到俺家小小,我就很激动,为了俺家小小,我一定加倍努力,做一个好爸爸。 …

【Qt】QT_BEGIN_NAMESPACE 和 QT_END_NAMESPACE

在看QtCreator源码时,总遇到QT_BEGIN_NAMESPACE 和 QT_END_NAMESPACE两个宏,源码中对这两个宏的定义伪代码如下 #if !defined(QT_NAMESPACE) # define QT_BEGIN_NAMESPACE # define QT_END_NAMESPACE #else # define QT_BEGIN_NAMESPACE namespace QT_NAMESPACE {# define Q…

Java排序算法:冒泡排序

Java排序算法&#xff1a;冒泡排序//创建数组并赋值int[] data new int[] {11,10,55,78,100,111,45,56,79,90,345,1000};for(int i0;i < arr.length-1;i){for(int j 0; j < arr.length-i-1;j){if(arr[j] > arr[j1]){int temp arr[j];arr[j] arr[j1];arr[j1] temp;…

前腾讯AI Lab负责人张潼加入创新工场,任港科大创新工场联合实验室主任

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑整理 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;不过三个月&#xff0c;前腾讯 AI 主任张潼已对外公布了他离职后的新动态。3 月 20 日&#xff0c;创新工场宣布&#xff0c;张潼博士已加盟创新工场…

ESX上ORACLE 10.2RAC(4.在REHAT4.7中安装ORACLE RAC)

四、 安装CRS软件 上传cluster软件到rac1,rac2的/home/oracle目录下 [rootrac1 ~]# cd /home/oracle [rootrac1 oracle]# ls 10201_clusterware_linux32.zip Desktop ocfs2 oracleasm [rootrac1 oracle]# unzip 10201_clusterware_linux32.zip [rootrac2 oracle]# unzip 10201_…

【Qt中文手册】QObject

Qt几乎所有的类都是从QObject直接或间接继承的,但是你真的了解QObject吗?下面先看看QObject在官方手册中的介绍。 一、QObject简介 1、信号和槽 QObject是所有Qt类的基类,是Qt对象模型的核心。该模型的核心功能是信号和槽的通信机制(有吐槽Qt信号和槽的,个人建议不要用…

整理下.net分布式系统架构的思路

最近看到有部分招聘信息&#xff0c;要求应聘者说一下分布式系统架构的思路。今天早晨正好有些时间&#xff0c;我也把我们实际在.net方面网站架构的演化路线整理一下&#xff0c;只是我自己的一些想法&#xff0c;欢迎大家批评指正。 首先说明的是.net下开源内容较少&#xff…

柔性生态布局未来,小鱼易连 2019“深耕视界逐梦小鱼”北京火爆招募

3 月 21 日&#xff0c;小鱼易连 “深耕视界逐梦小鱼”——2019 春季伙伴招募大会北京站在北京东方美爵酒店成功召开。 小鱼易连联合创始人兼 CEO 袁文辉以“深耕视界逐梦小鱼” 为主题&#xff0c;为到场的四百家合作伙伴和媒体完整展示了小鱼易连全面布局产业互联网&#xf…

perl XML创建XML文件

首先安装XML::Writer,XML::Parser等模块 1.执行/usr/bin/perl -MCPAN -e install "YAML" 安装YAML模块 2.进入CPAN模式&#xff0c;进行下载模块操作 $ sudo perl -MCPAN -e shell 3.在CPAN模式下进行安装&#xff0c;nolock_cpan> install XML::Writer XML::Pars…

开发自己的山寨Android注解框架

目录 开发自己的山寨Android注解框架开发自己的山寨Android注解框架 参考 Github黄油刀 Overview 在上一章我们学习了Java的注解(Annotation)&#xff0c;但是我想大家可能感觉&#xff0c;虽然理解了也会学会&#xff0c;但是不知道干什么用&#xff0c;那么请继续忍受我这枯燥…

特斯拉起诉小鹏汽车员工窃取商业机密,何小鹏回应

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑整理 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;3 月 21 日&#xff0c;外媒 TheVerge 报道称&#xff0c;特斯拉正针对多名前雇员和自动驾驶汽车公司 Zoox 提起诉讼&#xff0c;涉嫌盗用公司商业机…

【Qt】一个使用QEventLoop时,遇到的教训

1、问题描述 伪代码如下&#xff1a; QEventLoop eventLoop; QObject::connect(this, &Class::signal, [](){doSomething();eventLoop.exit(0); }); emit signal(); eventLoop.exec();在执行eventLoop.exec()时&#xff0c;造成永不退出。 2、原因分析 本打算在&#x…

基于kryo序列化方案的memcached-session-manager多memcached...

为什么80%的码农都做不了架构师&#xff1f;>>> 上次基于Java IO的序列化方案配置了memcached-session-manager&#xff0c;但是性能不好&#xff0c;现在先简单配置成基于kryo的 Xml代码 <Context path"/mobilemail" docBase"D:\webapp\WebR…

Python持续点火,跟进还是观望?

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑Python 这把火&#xff0c;到底烧了多久了&#xff1f;近日&#xff0c;李笑来带着他的 Python 编程书&#xff0c;一路狂收 Star、Fork&#xff0c;火速登顶 GitHub Trending 榜&#xff0c;直接 C 位出道。币圈大佬也玩…

win2d 图片水印

win2d 图片水印 本文告诉大家如何使用 win2d 给图片加上水印。 安装 首先需要使用 Nuget 安装 win2d &#xff0c;安装参见win10 uwp win2d 如果没有更新 dot net core 那么在运行可能会出现下面异常System.TypeLoadException: Requested Windows Runtime type Microsoft.Graph…

【Qt】QtCreator中的单例编程(以ActionManager为例)

1、ActionManager简介 ActionManager类负责注册菜单和菜单项以及键盘快捷键。 ActionManager的公共函数都是静态的,只有使用信号时,才用到单例。 2、ActionManager单例伪代码 头文件中将构造函数和析构函数设置成私有(private),使用instance()函数获取单例 class Acti…

37、C++ Primer 4th笔记,特殊工具与技术,类成员指针

1、成员指针&#xff08;pointer to member&#xff09;包含类的类型以及成员的类型。成员指针只应用于类的非static成员。static类成员不是任何对象的组成部分&#xff0c;所以不需要特殊语法来指向static成员&#xff0c;static成员指针是普通指针。通过指定函数的返回类型&a…

聊一聊javascript执行上下文

跟大家聊聊js的执行上下文 一&#xff0c;相关概念 EC : 执行上下文 ECS : 执行环境栈 VO &#xff1a; 变量对象 AO &#xff1a; 活动对象 scope chain &#xff1a;作用域链 二&#xff0c;执行上下文 javascript运行的代码环境有三种&#xff1a; 全局代码&#xff1a;代码…

【Qt】QtCreator中使用ActionManager类管理标题栏(MunuBar)、菜单(Menu)和菜单中的项目(Action)

1、简介 QtCreator中使用ActionManager类管理标题栏(MunuBar)、菜单(Menu)和菜单中的项目(Action),下面以创建“New”动作为例,介绍ActionManager的使用方法,后续会详细分析ActionManager。 2、创建标题栏(MunuBar) const char MENU_BAR[] = "QtCreator.MenuBar&quo…

和达摩院深度绑定,阿里云下一个十年,成为“云上的阿里巴巴”

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑整理 | 非主流出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;2009 &#xff5e; 2019&#xff0c;阿里云已经走过了 10 年时光。在此次的阿里云峰会北京站上&#xff0c;为阿里云的站台的是张建锋。去年 11 月…

如何用TF Object Detection API训练交通信号灯检测神经网络?

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑作者简介&#xff1a;申泽邦&#xff08;Adam Shan&#xff09;&#xff0c;谷歌认证机器学习专家&#xff08;Google Developer Expert&#xff09;&#xff0c;兰州大学智能驾驶团队技术负责人&#xff0c;硕士在读。文…

iOS progressive Web App (PWA) 技术

随着 iOS 11.3 的发布&#xff0c;iOS PWA 的时代终于来了&#xff01;本文对 iOS 中 PWA 的能力进行了分析&#xff0c;并将其与 iOS 上的 Native App、Android 上的 PWA 进行了深度对比&#xff0c;是值得收藏的一篇好文。 随着 iOS 11.3 的发布&#xff0c;苹果悄悄的支持了…

VS新建类自动添加版本注释

我们开发的时候习惯在代码顶部加上自己的版权说明。 每次拷贝挺麻烦的&#xff0c;上网查了一下&#xff0c;2003的介绍但不少。但08的模板生成方式好像改变了 后来2005的一篇介绍给了我一点提示。原来模板文件放在common7目录下。 主要分为ProjectTemplates和ItemTemplates&am…

【linux】shell中整数运算的加、减、乘、除

1、使用双括号“(( ))” shell中变量实现加法的方法 d $(($d 2)) 例子如下 #!/bin/bash d0 echo "d$d"for((i1;i<10;i)); do d$(($d 2)) echo "d$d" done unset d((i$j$k)) 等价于 iexpr $j $k ((i$j-$k)) 等价于 iexpr $j -$k ((i$…

简单使用PDO

2019独角兽企业重金招聘Python工程师标准>>> 首先基本配置&#xff1a; 连接MYSQL <?php $dsn mysql:hostlocalhost;dbnameworld;; $user user; $password secret; try { $dbh new PDO($dsn, $user, $password); } catch (PDOException $e) { echo Connecti…

一文看懂模糊搜索1.0到3.0的算法迭代历程

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑作者 | 宋广泽责编 | 郭芮来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;前一段时间在Linux上用C语言做了一个信息管理系统&#xff0c;初始版本的搜索就是直接使用了C语言库文件<string.h>里的库函数…