plugin的原理
plugin插件的原理
扩展webpack, 加入自定义的构建行为
webpack内部的钩子 hooks
- tap: 可以注册同步钩子和异步钩子
- tapAsync: 回调方式注册异步钩子
- tapPromise: promise方式注册异步钩子
Compiler构建对象, 保存着完整的webpack环境配置
- compiler.options: 可以访问所有配置文件, 如entry, output, plugin,loader等
- compiler.inputFileSystem和compiler.outputFileSystem可以进行文件操作, 相当于nodejs中的fs
- compiler.hooks 可以注册不同种类的hook
Compilation对象代表一次资源的构建, 可以访问所有模块和它们的依赖
- compilation.modules: 所有的模块
- compilation.chunks: 多个modules组成的代码块
- compilation.assets: 本次打包生成的文件结果
- compilation.hooks: 注册不同类型的hook
创建一个plugin
/**
* 1. webpack加载webpack.config.js的所有配置, 此时会new 插件, 执行插件的constructor方法
* 2. webpack创建compiler对象
* 3. 遍历所有plugins里面的插件, 调用插件的apply方法
* 4. 执行剩下的编译流程, 触发各个hook事件
*/
class BannerWebpackPlugin {
constructor() {
}
apply(compiler) {
// emit 文件输出前, tapAsync 异步
compiler.hooks.emit.tapAsync("BannerWebpackPlugin", compilation => {
// 获取输出资源: compilation.assets
// 只处理 js , css, 图片不能处理
const extensions = ['css', 'js']
// 获取需要处理的文件类型
const assets = Object.keys(compilation.assets).filter(asset => {
const arr = asset.split('.')
const fileExt = arr[arr.length - 1]
return extensions.includes(fileExt)
})
const prefix = `/*
* Author: 法外狂徒
*/
`
assets.forEach(asset => {
// 获取原来的内容 source()
const source = compilation.assets[asset].source()
const content = prefix + source
compilation.assets[asset] = {
// 最终输出资源时,调用source方法, source方法的返回值是资源的具体内容
source() {
return content
},
// 资源大小
size() {
return content.length
}
}
})
})
}
}
module.exports = BannerWebpackPlugin
使用
const BannerWebpackPlugin = require('../plugins/banner-webpack-plugin')
new BannerWebpackPlugin()
plugin的原理的更多相关文章
- Mybatis九( mybatis插件的原理及使用)
1.插件执行原理 一.demo 1.测试类 @Test public void test1() { String resource = "mybatis-config.xml"; ...
- 揭秘webpack plugin
前言 Plugin(插件) 是 webpack 生态的的一个关键部分.它为社区提供了一种强大的方法来扩展 webpack 和开发 webpack 的编译过程.这篇文章将尝试探索 webpack plu ...
- Jerry的Fiori原创文章合集
我曾经于2014年10月到2016年5月工作于SAP CRM Fiori应用的开发团队, 我所在的团队负责下列这8个Fiori应用的维护和持续开发: My Opportunities My Tasks ...
- mybatis中的分页插件
1.Mybatis的分页plugin实现原理 2.具体步骤 第一步.导入到pom.xml文件中依赖包 第二步.配置插件(必需) 在mybatisConfig.xml文件中配置以下代码 代码位置:在en ...
- 手写一个webpack,看看AST怎么用
本文开始我会围绕webpack和babel写一系列的工程化文章,这两个工具我虽然天天用,但是对他们的原理理解的其实不是很深入,写这些文章的过程其实也是我深入学习的过程.由于webpack和babel的 ...
- webpack核心模块tapable用法解析
前不久写了一篇webpack基本原理和AST用法的文章,本来想接着写webpack plugin的原理的,但是发现webpack plugin高度依赖tapable这个库,不清楚tapable而直接去 ...
- 80行代码教你写一个Webpack插件并发布到npm
1. 前言 最近在学习 Webpack 相关的原理,以前只知道 Webpack 的配置方法,但并不知道其内部流程,经过一轮的学习,感觉获益良多,为了巩固学习的内容,我决定尝试自己动手写一个插件. 这个 ...
- SpringPlugin-Core在业务中的应用
前言 一直负责部门的订单模块,从php转到Java也是如此,换了一种语言来实现订单相关功能.那么Spring里有很多已经搭建好基础模块的设计模式来帮助我们解耦实际业务中的逻辑,用起来非常的方便!就比如 ...
- 关于webpack,你想知道的都在这;
咱也标题党一回 哈哈哈 要使用webpack优化项目打包构建速度,首先得知道问题出在哪, 要知道问题出在哪,首先得知道webpack 打包的基本原理才能针对性的去做优化,下面首先了解webpack基本 ...
- MyBatis源码分析(2)—— Plugin原理
@(MyBatis)[Plugin] MyBatis源码分析--Plugin原理 Plugin原理 Plugin的实现采用了Java的动态代理,应用了责任链设计模式 InterceptorChain ...
随机推荐
- Docker 基础 - 1
镜像 获取镜像 docker pull 查看镜像信息 docker images docker inspect <images id> # 获取镜像的详细信息 搜寻镜像 docker se ...
- 流程概述与顺序结构-选择结构_单if语句
流程概述与顺序结构 概述 在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的.也就是说,程序的流程对运行结果 有直接的影响.所以,我们必须清楚每条语句的执行流程.而且,很多时候我们要 ...
- VMware虚拟软件使用方法、网络配置与远程连接排错方法
一.虚拟软件使用方法 1. 软件启动方法 系统当中有些软件是可以多次启动,多实例 vmware不具有多实例功能 2. 软件关闭注意事项 尽量选择挂起虚拟主机关闭软件 3. 虚拟主机拍快照(后悔药 月光 ...
- 【随笔记】MFC 解决按下 ESC、Enter 键会自动退出的问题
网上大部分人的做法是通过拦截按键消息来屏蔽,实际正确的做法是: 1. 在对话框头文件重载 OnOK()(回车会触发) 和 OnCancel()(ESC会触发) 函数. // XXXXXXXDlg.h ...
- 用GPU来运行Python代码
简介 前几天捣鼓了一下Ubuntu,正是想用一下我旧电脑上的N卡,可以用GPU来跑代码,体验一下多核的快乐. 还好我这破电脑也是支持Cuda的: $ sudo lshw -C display *-di ...
- RA-Depth: Resolution Adaptive Self-Supervised Monocular Depth Estimation
注:刚入门depth estimation,这也是以后的主要研究方向,欢迎同一个方向的加入QQ群(602708168)交流. 1. 论文简介 论文题目:RA-Depth: Resolution Ada ...
- 11月30日内容总结——前端简介、http协议概念、html协议概念及基础知识和部分标签的讲解
目录 一.前端与后端的概念 什么是前端开发? 什么是后端? 学习前端的目的 前端三剑客 二.前端前戏 三.HTTP协议 1.四大特性 2.报文格式 3.响应状态码 四.HTML概览 1.HTML简介 ...
- Flex布局专题
Flex布局专题 参照 https://www.runoob.com/w3cnote/flex-grammar.html 下面是自己看代码的一下 小结,和认识,加笔记,加原文 认识容器 flex布局需 ...
- centos7.6安装teamviewer-原来还可以用yum 安装rpm包,自动解决依赖,太爽了
1.在官网下载teamviewer安装包 2.安装.一直用rpm -ivh 的方式安装rpm包,但是不会自动解决依赖,今天才知道,原来还可以用yum -y install rpm包,自动解决依赖. [ ...
- JZOJ 2020.02.25【NOIP提高组】模拟A 组
闲话 难度似乎比之前的简单了一些 但是难的题还是很难(我太菜了) 总结 针对三个题,先罗列正解所涉及的算法:字符哈希,组合数学,点分治 最后一个不会 组合数学?还好吧 字符哈希? 放在 \(T1\) ...