这一节跑下一批plugin。

compiler.apply(
new EnsureChunkConditionsPlugin(),
new RemoveParentModulesPlugin(),
new RemoveEmptyChunksPlugin(),
new MergeDuplicateChunksPlugin(),
new FlagIncludedChunksPlugin(),
new OccurrenceOrderPlugin(true),
new FlagDependencyExportsPlugin(),
new FlagDependencyUsagePlugin()
);

  希望不要跟上一节一样,全是plugin。

  流程如图(看看流程图就行了,后面也没有什么内容):

EnsureChunkConditionsPlugin

class EnsureChunkConditionsPlugin {
apply(compiler) {
compiler.plugin("compilation", (compilation) => {
const triesMap = new Map();
compilation.plugin(["optimize-chunks-basic", "optimize-extracted-chunks-basic"], (chunks) => { /**/ });
});
}
}

  这个看看就懂,不解释了。

RemoveParentModulesPlugin

class RemoveParentModulesPlugin {
apply(compiler) {
compiler.plugin("compilation", (compilation) => {
compilation.plugin(["optimize-chunks-basic", "optimize-extracted-chunks-basic"], (chunks) => { /**/ });
});
}
}

  难道又是另一批plugin么……

RemoveEmptyChunksPlugin

class RemoveEmptyChunksPlugin {
apply(compiler) {
compiler.plugin("compilation", (compilation) => {
compilation.plugin(["optimize-chunks-basic", "optimize-extracted-chunks-basic"], (chunks) => { /**/ });
});
}
}

  是的。

MergeDuplicateChunksPlugin

class MergeDuplicateChunksPlugin {
apply(compiler) {
compiler.plugin("compilation", (compilation) => {
compilation.plugin("optimize-chunks-basic", (chunks) => { /**/ });
});
}
}

FlagIncludedChunksPlugin

class FlagIncludedChunksPlugin {
apply(compiler) {
compiler.plugin("compilation", (compilation) => {
compilation.plugin("optimize-chunk-ids", (chunks) => { /**/ });
});
}
}

OccurrenceOrderPlugin

class OccurrenceOrderPlugin {
// true
constructor(preferEntry) {
if (preferEntry !== undefined && typeof preferEntry !== "boolean") {
throw new Error("Argument should be a boolean.\nFor more info on this plugin, see https://webpack.js.org/plugins/");
}
this.preferEntry = preferEntry;
}
apply(compiler) {
const preferEntry = this.preferEntry;
compiler.plugin("compilation", (compilation) => {
compilation.plugin("optimize-module-order", (modules) => { /**/ });
compilation.plugin("optimize-chunk-order", (chunks) => { /**/ });
});
}
}

  看到那个错误提示就想笑,这个插件除了你自己谁会去调用啊。

FlagDependencyExportsPlugin

class FlagDependencyExportsPlugin {
apply(compiler) {
compiler.plugin("compilation", (compilation) => {
compilation.plugin("finish-modules", (modules) => { /**/ }); function addToSet(a, b) { /**/ }
});
}
}

FlagDependencyUsagePlugin

class FlagDependencyUsagePlugin {
apply(compiler) {
compiler.plugin("compilation", compilation => {
compilation.plugin("optimize-modules-advanced", modules => { /**/ }); function addToSet(a, b) { /**/ } function isSubset(biggerSet, subset) { /**/ }
});
}
}

  总的来说,这一批plugin是针对模块的,不过仍然没有任何实际行为。

  还剩下3个也一并过了吧。

TemplatedPathPlugin

class TemplatedPathPlugin {
apply(compiler) {
compiler.plugin("compilation", compilation => {
const mainTemplate = compilation.mainTemplate;
mainTemplate.plugin("asset-path", replacePathVariables);
mainTemplate.plugin("global-hash", function(chunk, paths) { /**/ });
mainTemplate.plugin("hash-for-chunk", function(hash, chunk) { /**/ });
});
}
}

RecordIdsPlugin

class RecordIdsPlugin {
apply(compiler) {
compiler.plugin("compilation", compilation => {
compilation.plugin("record-modules", (modules, records) => { /**/ });
compilation.plugin("revive-modules", (modules, records) => { /**/ }); function getDepBlockIdent(chunk, block) { /**/ }
compilation.plugin("record-chunks", (chunks, records) => { /**/ });
compilation.plugin("revive-chunks", (chunks, records) => { /**/ });
});
}
}

WarnCaseSensitiveModulesPlugin

class WarnCaseSensitiveModulesPlugin {
apply(compiler) {
compiler.plugin("compilation", compilation => {
compilation.plugin("seal", () => { /**/ });
});
}
}

  这里把所有compilation事件流触发完后,也只是针对不同的阶段再次进行plugin,所以详细过程还需要继续跑流程。

.25-浅析webpack源码之事件流compilation(3)的更多相关文章

  1. .23-浅析webpack源码之事件流compilation(1)

    正式开始跑编译,依次解析,首先是: compiler.apply( new JsonpTemplatePlugin(options.output), // start new FunctionModu ...

  2. .24-浅析webpack源码之事件流compilation(2)

    下一个compilation来源于以下代码: compiler.apply(new EntryOptionPlugin()); compiler.applyPluginsBailResult(&quo ...

  3. .22-浅析webpack源码之事件流compilation总览

    呃,终于到了这地方-- newCompilation(params) { // ... this.applyPlugins("this-compilation", compilat ...

  4. .21-浅析webpack源码之事件流this-compilation

    上一节生成Compilation实例后,添加了一些属性,随后触发this-compilation事件流,如下: Compiler.prototype.newCompilation = (params) ...

  5. .34-浅析webpack源码之事件流make(3)

    新年好呀~过个年光打游戏,function都写不顺溜了. 上一节的代码到这里了: // NormalModuleFactory的resolver事件流 this.plugin("resolv ...

  6. .27-浅析webpack源码之事件流make(2)

    上一节跑到了NormalModuleFactory模块,调用了原型方法create后,依次触发了before-rsolve.factory.resolver事件流,这节从resolver事件流开始讲. ...

  7. .26-浅析webpack源码之事件流make(1)

    compilation事件流中,依然只是针对细节步骤做事件流注入,代码流程如图: // apply => this-compilation // apply => compilation ...

  8. .37-浅析webpack源码之事件流make(4)

    赶紧完结这个系列咯,webpack4都已经出正式版了. 之前的代码搜索到js文件的对应loader,并添加到了对象中返回,流程如下: this.plugin("factory", ...

  9. 浅析libuv源码-node事件轮询解析(3)

    好像博客有观众,那每一篇都画个图吧! 本节简图如下. 上一篇其实啥也没讲,不过node本身就是这么复杂,走流程就要走全套.就像曾经看webpack源码,读了300行代码最后就为了取package.js ...

随机推荐

  1. su和sudo命令的区别

    一. 使用 su 命令临时切换用户身份 参考 1.su 的适用条件和威力 su命令就是切换用户的工具,怎么理解呢?比如我们以普通用户beinan登录的,但要添加用户任务,执行useradd ,bein ...

  2. 修改placeholder的样式

    input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { color: #666; } input:-moz-pl ...

  3. 4.1 State Snapshot Transfer

    摘要: 出处:黑洞中的奇点 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎转载,但请保留该 ...

  4. Django学习日记01_环境搭建

    1. 使用Vagrant 创建ubuntu虚拟机: 首先安装vagrant,网上有比较多的方法,如:http://www.th7.cn/system/mac/201405/55421.shtml 我使 ...

  5. switchery按钮使用

    1.先引入switchery.css 和 switchery.js 2.绘制 checkbox按钮 : a.静态页面写法  未选中时 <input type="checkbox&quo ...

  6. SpringCloud学习笔记(4)——Zuul

    参考Spring Cloud官方文档第19章 19. Router and Filter: Zuul 路由是微服务架构的一部分.例如,"/"可能映射到你的web应用,"/ ...

  7. 使用sysbench对mysql压力测试

    sysbench是一个模块化的.跨平台.多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况.关于这个项目的详细介绍请看:https://github.com/akopytov/sy ...

  8. Android简易记事本

    此次做的Android简易记事本的存储方式使用了SQLite数据库,然后界面的实现比较简单,但是,具有增删改查的基本功能,这里可以看一下效果图,如下: 具体操作就是长按可以删除操作,点击可以进行修改, ...

  9. windows第七层负载均衡--基于IIS的ARR负载均衡

    载均衡有很多种方法,有硬件负载均衡,软件负载均衡,还可以从域名解析下手. 不过,今天只讲软件负载均衡 软件负载均衡一般分两种,从网络协议来讲(tcp/ip),主要集中在第四层和第七层进行负载均衡. 第 ...

  10. 一次完整的http的请求过程

    一个完整的http的完成请求过程: 输入网址-> 域名解析-> tcp的三次握手-> 建立tcp连接后发起http 请求-> 服务器响应http ,发送数据给浏览器->  ...