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. [C++]vector内存的增长机制

    例子 #include <iostream> #include<vector> #include<algorithm> #include "CPPDemo ...

  2. 《Effective C++》设计与声明章节

    Item18:让接口容易被正确使用,不易被误用 总结: 1.好的接口很容易被正确使用,不容易被误用.你应该在你的所有接口中努力达到这些性质. 2."促进正确使用"的办法包括接口的一 ...

  3. .NET 7新特性

    2022年11月份微软推出了带有STS(标准期限支持)的.NET版本7,仅提供18个月的支持. 微软今年推出了STS版本,因为它已经在2019年提到,它将在每年11月左右发布一个新版本的.NET. 但 ...

  4. Angular基础之ngFor遍历对象数组获取key和value渲染页面的几种方法

    Angular的ngFor遍历对象数组的几种方法 方法一 ts文件: export class MyDemo {   objectKeys = Object.keys;   myObj = { a: ...

  5. 读Java8函数式编程笔记02_流

    1. 外部迭代 1.1. for循环是一个封装了迭代的语法糖 1.1.1. 本质上来讲是一种串行化操作 1.2. 很难抽象出不同操作 2. 内部迭代 2.1. 内部迭代中的相应接口:Stream 2. ...

  6. 安装Windows Server 2022 - 初学者系列 - 学习者系列文章

    这天要写一个关于系统部署的系列文章,涉及到Windows Server 2022操作系统的安装,所以就写了此文.Windows系列的操作系统安装,以前的博文中都有介绍,这里再次做一个安装描述吧.需要的 ...

  7. CAS 悲观锁 乐观锁

    前面的偏向锁,轻量级锁,重量级锁都是悲观锁, 都会认为必须要对操作对象进行互斥访问,不然就会产生异常, 所以线程只供一个线程使用,阻塞其他线程,是悲观的 在某些情况下,同步的耗时远大于线程切换的时间, ...

  8. ChatGPT留给知乎、小红书的时间不多了

    大家好啊,今天我打算给大家整点好活!挑战一下用ChatGPT打入各平台内部. 知乎挑战! 首先了解一下"知乎体" 知乎体是以专业知识为基础,以清晰的条理对问题进行阐述,并解决该问题 ...

  9. 安装和配置Maven项目管理工具

    1.下载Maven工具包:https://maven.apache.org/download.cgi 2.解压apache-maven-3.8.4-bin.zip 3.修改apache-maven-3 ...

  10. 什么是MES(Manufacturing Execution System)

    "本文仅代表个人观点" 本文档将提供一个高层次的概述,以帮助阐明什么是MES,并触及通常被归为MES的周边领域. 整体情况 制造执行系统或MES软件是旨在帮助公司管理其制造过程的工 ...