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的原理的更多相关文章

  1. Mybatis九( mybatis插件的原理及使用)

    1.插件执行原理 一.demo 1.测试类 @Test public void test1() { String resource = "mybatis-config.xml"; ...

  2. 揭秘webpack plugin

    前言 Plugin(插件) 是 webpack 生态的的一个关键部分.它为社区提供了一种强大的方法来扩展 webpack 和开发 webpack 的编译过程.这篇文章将尝试探索 webpack plu ...

  3. Jerry的Fiori原创文章合集

    我曾经于2014年10月到2016年5月工作于SAP CRM Fiori应用的开发团队, 我所在的团队负责下列这8个Fiori应用的维护和持续开发: My Opportunities My Tasks ...

  4. mybatis中的分页插件

    1.Mybatis的分页plugin实现原理 2.具体步骤 第一步.导入到pom.xml文件中依赖包 第二步.配置插件(必需) 在mybatisConfig.xml文件中配置以下代码 代码位置:在en ...

  5. 手写一个webpack,看看AST怎么用

    本文开始我会围绕webpack和babel写一系列的工程化文章,这两个工具我虽然天天用,但是对他们的原理理解的其实不是很深入,写这些文章的过程其实也是我深入学习的过程.由于webpack和babel的 ...

  6. webpack核心模块tapable用法解析

    前不久写了一篇webpack基本原理和AST用法的文章,本来想接着写webpack plugin的原理的,但是发现webpack plugin高度依赖tapable这个库,不清楚tapable而直接去 ...

  7. 80行代码教你写一个Webpack插件并发布到npm

    1. 前言 最近在学习 Webpack 相关的原理,以前只知道 Webpack 的配置方法,但并不知道其内部流程,经过一轮的学习,感觉获益良多,为了巩固学习的内容,我决定尝试自己动手写一个插件. 这个 ...

  8. SpringPlugin-Core在业务中的应用

    前言 一直负责部门的订单模块,从php转到Java也是如此,换了一种语言来实现订单相关功能.那么Spring里有很多已经搭建好基础模块的设计模式来帮助我们解耦实际业务中的逻辑,用起来非常的方便!就比如 ...

  9. 关于webpack,你想知道的都在这;

    咱也标题党一回 哈哈哈 要使用webpack优化项目打包构建速度,首先得知道问题出在哪, 要知道问题出在哪,首先得知道webpack 打包的基本原理才能针对性的去做优化,下面首先了解webpack基本 ...

  10. MyBatis源码分析(2)—— Plugin原理

    @(MyBatis)[Plugin] MyBatis源码分析--Plugin原理 Plugin原理 Plugin的实现采用了Java的动态代理,应用了责任链设计模式 InterceptorChain ...

随机推荐

  1. elasticsearch实现简单的脚本排序(script sort)

    目录 1.背景 2.分析 3.构建数据 3.1 mapping 3.2 插入数据 4.实现 4.1 根据省升序排序 4.1.1 dsl 4.1.2 运行结果 4.2 湖北省排第一 4.2.1 dsl ...

  2. CTFshow刷题记录

    整理的一些ctf题目 WEB题 ctfshow 年CTF 除夕 题目要求通过get传入year参数然后进行判断是否成立,成立就返回flag 这里可以用科学计数法表示通过get传入year=2.022e ...

  3. djiango框架推导过程,jinja2模板语法,jiango简介,基本操作命令

    djiango框架推导过程,jinja2模板语法,jiango简介,基本操作命令 一.web框架前戏 web 框架可以理解为是基于会联网的web服务端>>>socket服务端 1.w ...

  4. 【学习笔记】一种特别有意思的 RTOS 任务切换方法

    一.介绍说明 目前常见流行的 RTOS 实现方式,如 FreeRTOS.uCosII.RT-Thread 等等,它们的内部的任务切换实现原理都差不多,都是通过借助汇编,根据不同的情况读写 CPU 寄存 ...

  5. 【学习日志】MySQL分表与索引的关系

    什么情况下需要分表呢?分表又能解决什么问题呢? 一般情况下分表的直接原因是数据量太大了,比如一张表一共只有1w条数据,确实没必要分表.为什么数据量大了就需要分表呢?首先得看看数量量过大后会带来什么问题 ...

  6. opencv::parallel_for_使用说明

    直接上代码 #include <opencv2/opencv.hpp> #include <iostream> #include <functional> usin ...

  7. ubuntu 备份系统

    1.安装Systemback: sudo add-apt-repository ppa:nemh/systemback sudo apt-get update sudo apt-get install ...

  8. 快速上手vue前端存储库、全局状态管理工具pinia

    pinia是什么,为什么我们要使用pinia? pinia是vue全局状态管理工具,类似vueX,用于全局的数据状态存储.修改变更等等 相较于vueX,pinia的使用较为简单,轻量级,上手容易,干掉 ...

  9. 0x04_My-OS实现自定义颜色

    前言: 0x03我们提到: 把12(红色)用循环写入显存,每个像素点怎么显示都要看对应的显存地址,比如0xa0000到0xaffff就是每一个像素点的显存 你问为什么12就是红色,这些东西在主板出厂的 ...

  10. 【Gerald and Giant Chess】

    一道计数类DP例题~~~ ps:P党似乎不多了-- 我这只蒟蒻第一次写题解,而且计数类DP还是早上刚学的,现学现用,或者说是所谓的"浅谈"一番吧!况且这题写题解的人似乎并不多(大佬 ...