背景

如今‘大前端’这个概念在前端界大热,说‘大前端’,我们就要提到‘前后端分离’,‘前后端分离’又离不开‘本地开发构建’,‘本地开发构建’自然离不开webpack,webpack想要工作,那它就需要各种插件的支持,O(∩_∩)O哈哈~,逗了一大圈,终于引出了主题。

相信有不少童鞋在平时的项目开发中使用过Webpack Plugins,然而大部分人真是‘使用’啊(包括之前的我),只有少数人会去深究插件的原理与开发实践;又逢今日读到Webpack中文文档《如何编写一个插件》一节,所以在此做下插件开发的简单介绍,反正我读完这节后是豁然开朗了,不知道对大家有没有帮助,文中如有错误,望踊跃指正!!

分析

 /**
* webpack插件开发采用'动态原型模式'
* 插件开发,最重要的两个对象:compiler、compilation
* @param options
* @constructor
*/
function MyPlugin(options) { // 根据 options 配置你的插件 }
// 我们可以在原型上添加一些方法
MyPlugin.prototype.someFunc = function() {/*something*/} // apply方法是必须要有的,因为当我们使用一个插件时(new somePlugins({})),webpack会去寻找插件的apply方法并执行
MyPlugin.prototype.apply = function(compiler) {
// compiler是什么?compiler是webpack的'编译器'引用 // 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", function(compilation, callback) {
console.log("The compilation is going to emit files..."); // compilation.chunks是块的集合(构建后将要输出的文件,即编译之后得到的结果)
compilation.chunks.forEach(function(chunk) {
// chunk.modules是模块的集合(构建时webpack梳理出的依赖,即import、require的module)
// 形象一点说:chunk.modules是原材料,下面的chunk.files才是最终的成品
chunk.modules.forEach(function(module) {
// module.fileDependencies就是具体的文件,最真实的资源【举例,在css中@import("reset.css"),这里的reset.css就是fileDependencie】
module.fileDependencies.forEach(function(filepath) {
// 到这一步,就可以操作源文件了
});
}); // 最终生成的文件的集合
chunk.files.forEach(function(filename) {
// source()可以得到每个文件的源码
var source = compilation.assets[filename].source();
});
}); // callback在最后必须调用
callback();
});
}; // 以上compiler和compilation的事件监听只是一小部分,详细API可见该链接http://www.css88.com/doc/webpack2/api/plugins/ module.exports = MyPlugin;

Webpack插件开发简要的更多相关文章

  1. 【前端】Vue2全家桶案例《看漫画》之七、webpack插件开发——自动替换服务器API-URL

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_7.html 项目github地址:https://github.com/shamoyuu/ ...

  2. [转] webpack之plugin内部运行机制

    简介 webpack作为当前最为流行的模块打包工具,几乎所有的主流前端开发框架(React.Vue等)都会将其作为默认的模块加载和打包工具.通过简单的配置项,使用各种相关的loader和plugin, ...

  3. webpack + vue 项目 自定义 插件 解决 前端 JS 版本 更新 问题

    Webpack 是一个前端资源加载/打包工具.它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源. 它的异步加载原理是,事先将编译好后的静态文件,通过js对象映射,硬编 ...

  4. Getting Start chrome-extension demo

    写一个小小的chrome扩展demo~ 准备工作 了解一下插件chrome-extension: 在应用商店里的插件基本上都是以.crx为文件后缀,该文件其实就是一个压缩包,包括插件所需要的html. ...

  5. 简要分析webpack打包后代码

    开门见山 1.打包单一模块 webpack.config.js module.exports = { entry:"./chunk1.js", output: { path: __ ...

  6. Vue插件开发入门

    相对组件来说,Vue 的插件开发受到的关注要少一点.但是插件的功能是十分强大的,能够完成许多 Vue 框架本身不具备的功能. 大家一般习惯直接调用现成的插件,比如官方推荐的 vue-router.vu ...

  7. webpack 使用优化指南

    前言 本文不是webpack入门文章,如果对webpack还不了解,请前往题叶的Webpack入门,或者阮老师的Webpack-Demos. 为什么要使用Webpack 与react一类模块化开发的框 ...

  8. [译]Angular2 和TypeScript -- 一次简要的预览

    原文链接:https://www.infoq.com/articles/Angular2-TypeScript-High-Level-Overview 作者:  Yakov Fain Posted o ...

  9. webpack使用优化(基本篇)

    转自:https://github.com/lcxfs1991/blog/issues/2 前言 本文不是webpack入门文章,如果对webpack还不了解,请前往题叶的Webpack入门,或者阮老 ...

随机推荐

  1. IIC模块TestBench的书写方法

    今天在看黑金AX309FPGA开发板自带教程中的EEPROM那一章,考虑如何写其中iic_com模块的TestBench,难点在于1. 该模块存在一个inout型的端口信号:2. 时序较为复杂,不可能 ...

  2. 在jquery中each循环中,要用return false代替break,return true代替continue。

    在jquery中each循环中,要用return false代替break,return true代替continue. $.each(data, function (n, value) { if(v ...

  3. JavaScript动画1-速度动画

    动画实际上就是在一定时间内,改变一个元素的某些属性. 这里简单实现一个JavaScript运动的框架.主要包括: 速度动画(改变left.right.width.height.opacity) 缓冲运 ...

  4. [Monkey King]

    题目描述 在一个森林里住着N(N<=10000)只猴子.在一开始,他们是互不认识的.但是随着时间的推移,猴子们少不了争斗,但那只会发生在互不认识(认识具有传递性)的两只猴子之间.争斗时,两只猴子 ...

  5. OD常用断点之CC断点

    在做Windows平台软件逆向时,Ollydbg是极其常用的逆向工具,动态调试功能非常强大.在调试过程中,断点的使用有助于确定关键的破解位置,今天讲解的内容是OD常用断点中的CC断点. CC断点有很多 ...

  6. 安卓OKhttp请求封装

    目前安卓开发中使用的网络工具为OKhttp,但是okhttp的使用还不是很方便,在okhttp的基础上再对请求进行封装会极大的方便网络调用. 下面直接上代码. 请求封装 public class Ht ...

  7. 《快学Scala》——基础

    声明值和变量 用val定义的值实际上是常量.用var定义的值是变量.在scala中鼓励使用val.不需要给出值或变量的类型,这个信息可以通过初始化的表达式推断出来.(声明值和变量但不做初始化会报错) ...

  8. Oracle树形结构查询之prior的理解

    --1 建表 create table 宇宙( 行星等级 number ,行星名称 varchar2(50) ,上级行星等级 number); --2 数据准备 insert into 宇宙 (行星等 ...

  9. JAVA内存模型与线程

    概述 由于计算机的运算速度和它的存储和通讯子系统的速度差距巨大,大部分时间都花在IO,网络和数据库上.为了压榨CPU的运算能力,需要并发.另外,优秀的并发程序对于提高服务器的TPS有重要的意义. 硬件 ...

  10. 头皮发麻的HTML课时一

    话说我都不知道有多少天没有更新我的随笔了,不过我忽的一下发现到灵魂深处的罪孽:好吧,不扯淡了,其实就是自己懒得外加上HTML这个东西又实在是很重要,所以良心发现把我自己所学的给记录下来,我会尽量的写的 ...