Webpack插件开发简要
背景
如今‘大前端’这个概念在前端界大热,说‘大前端’,我们就要提到‘前后端分离’,‘前后端分离’又离不开‘本地开发构建’,‘本地开发构建’自然离不开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插件开发简要的更多相关文章
- 【前端】Vue2全家桶案例《看漫画》之七、webpack插件开发——自动替换服务器API-URL
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_7.html 项目github地址:https://github.com/shamoyuu/ ...
- [转] webpack之plugin内部运行机制
简介 webpack作为当前最为流行的模块打包工具,几乎所有的主流前端开发框架(React.Vue等)都会将其作为默认的模块加载和打包工具.通过简单的配置项,使用各种相关的loader和plugin, ...
- webpack + vue 项目 自定义 插件 解决 前端 JS 版本 更新 问题
Webpack 是一个前端资源加载/打包工具.它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源. 它的异步加载原理是,事先将编译好后的静态文件,通过js对象映射,硬编 ...
- Getting Start chrome-extension demo
写一个小小的chrome扩展demo~ 准备工作 了解一下插件chrome-extension: 在应用商店里的插件基本上都是以.crx为文件后缀,该文件其实就是一个压缩包,包括插件所需要的html. ...
- 简要分析webpack打包后代码
开门见山 1.打包单一模块 webpack.config.js module.exports = { entry:"./chunk1.js", output: { path: __ ...
- Vue插件开发入门
相对组件来说,Vue 的插件开发受到的关注要少一点.但是插件的功能是十分强大的,能够完成许多 Vue 框架本身不具备的功能. 大家一般习惯直接调用现成的插件,比如官方推荐的 vue-router.vu ...
- webpack 使用优化指南
前言 本文不是webpack入门文章,如果对webpack还不了解,请前往题叶的Webpack入门,或者阮老师的Webpack-Demos. 为什么要使用Webpack 与react一类模块化开发的框 ...
- [译]Angular2 和TypeScript -- 一次简要的预览
原文链接:https://www.infoq.com/articles/Angular2-TypeScript-High-Level-Overview 作者: Yakov Fain Posted o ...
- webpack使用优化(基本篇)
转自:https://github.com/lcxfs1991/blog/issues/2 前言 本文不是webpack入门文章,如果对webpack还不了解,请前往题叶的Webpack入门,或者阮老 ...
随机推荐
- 凭证(Credential)
在SQL Server中,凭证(Credential)用于把Windows用户的身份验证信息(在Windows环境下,是Windows 用户名和密码)存储在SQL Server实例中,并把该身份验证信 ...
- 用Web抓包分析工具Livepool 实现本地替换开发
这是官方的介绍: LivePool 是一个基于 NodeJS,类似 Fiddler 支持抓包和本地替换的 Web 开发调试工具,是 Tencent AlloyTeam 在开发实践过程总结出的一套的便捷 ...
- Web.简单配置
XML 元素不仅是大小写敏感的,而且它们还对出现在其他元素中的次序敏感.所有这些元素都是可选的.因此,可以省略掉某一元素,但不能把它放于不正确的位置. icon icon元素指出IDE和GUI工具用来 ...
- 用户登录(Material Design + Data-Binding + MVP架构模式)实现
转载请注明出处: http://www.cnblogs.com/cnwutianhao/p/6772759.html MVP架构模式 大家都不陌生,Google 也给出过相应的参考 Sample, 但 ...
- Linux Shell——流程控制
1. 创建交互式脚本 使用 echo命令的选项 关于各种命令的使用,可以使用man 命令来查看命令的详细用法介绍.例如,我想看下 echo 的用法和各种选项.可以执行 man echo.执行结果如下: ...
- Vue 项目实战系列 (一)
最近一直在学习Vue,基本的文档看完后就需要进行具体的项目进行练手了,本系列文章主要是将我学习过程记录下来,和大家一起学习交流. 我在git上找到了一个淘票票的Vue项目,项目地址: https:// ...
- 构建你人生里的第一个 Laravel 项目
安装 Laravel 安装器 composer global require "laravel/installer" 创建项目 laravel new links 检查是否安装成功 ...
- 【NLP】3000篇搜狐新闻语料数据预处理器的python实现
3000篇搜狐新闻语料数据预处理器的python实现 白宁超 2017年5月5日17:20:04 摘要: 关于自然语言处理模型训练亦或是数据挖掘.文本处理等等,均离不开数据清洗,数据预处理的工作.这里 ...
- A*算法的理解与简单实现
基本定义 一种寻路算法,特点是:启发式的,效率高,基本思路比较简单. 用途 寻路.在指定的地图上,考虑到地图上的移动代价,找到最优的路径. 核心概念 开表,闭表,估值函数. 开表 开表,记录了当前需要 ...
- JAVA printWriter中write()和println()区别
PrintWriter 的Write()方法和println()方法有何细微的区别? 最近学习JAVA网络编程,在服务器端和客户端产生一个Socket 后, 两边各自用getIputStream()和 ...