当前位置: 首页 > news >正文

webpack实现常用plugin

在 webpack 中, plugin 主要做的事情围绕着整一个构建的过程。基于 tapable 的钩子机制,开发者可以在众多构建环节中注册相关的事件,依托于 webpack 提供的构建上下文,来对打包结果进行一些处理

plugin简要介绍

每一个 plugin 都是一个类,主要关注这个类的两个方法,一个是构造函数 constructor ,还有一个是 apply 方法。在 constructor 中可以获得配置 plugin 时传入的参数,而 apply 方法则是 webpack 会调用的方法。每个插件都有两个重要的钩子,一个是compiler钩子,还有一个是compilation钩子。

complier 是 webpack 构建启动时产生的,只有一个,它可以访问构建的各种配置等等。 compilation 是对资源的一次构建,可以有多个,它可以访问构建过程中的资源。下面以 complier 为例,介绍钩子事件时如何注册的。
从时序的角度来看, complier 钩子有三种类型,分别是同步钩子、异步钩子、异步 promise 钩子

代码示例:

// 同步插件
class aosPlugin {apply(compiler) {compiler.hooks.xxx.tap('aosPlugin',()=>{console.log('aosPlugin')})}
}
//异步插件
class aosPlugin2 {apply(compiler) {compiler.hooks.xxx.tap('aosPlugin2', (complication, callback) => {console.log('aosPlugin2')callback()})}
}

实现一个插件

这个插件主要做下面几件事情:
• 注册 emit 钩子
• 获取即将输出的资源,筛选出 html 文件
• 把注释内容添加到文件中
• 输出资源

开发一个 plugin ,首先要想清楚的问题是,这个插件是在什么时候执行的。在我学习以及开发的过程中, emit (资源输出前)和 afterEmit (资源输出后)这两个钩子是最经常用到的。当然我的意思不是这两个钩子就是开发 plugin 最常用到的两个钩子,而是想说我们想开发一个 plugin ,必须先想好执行的时机,选择好注册事件的钩子
这个钩子要做的是,对于我们输出的资源,希望打上一些注释。我们上次在 loader 也做过同样的事情,但是 loader 处理过后的资源可能会被合并、压缩。对于注释可能会被删掉

代码示例:

const path = require("path");
const os = require("os");function getLocalIP() {const interfaces = os.networkInterfaces();for (const interfaceName in interfaces) {let interfacess = interfaces[interfaceName];for (let i = 0; i < interfacess.length; i++) {const { address, family, internal } = interfacess[i];// 过滤出IPv4地址,并排除内部地址if (family === "IPv4" && !internal) {return address;}}}return null; // 无法获取IP时返回null
}class MyPlugin {apply(compiler) {compiler.hooks.emit.tap("MyPlugin", (compilation) => {const { assets } = compilation;const files = Object.keys(assets).filter((filename) => {const exts = ["html"];const arr = filename.split(".");const fileExt = arr[arr.length - 1];return exts.includes(fileExt);});const prefix = `<!--date:  ${new Date().toLocaleString()}IP:  ${getLocalIP() || "unknown"}程序出Bug了?∩∩(´・ω・)_| ⊃/(___/ └-(___/ ̄ ̄ ̄ ̄ ̄ ̄ ̄算了反正不是我写的⊂⌒/ヽ-、_/⊂_/____ / ̄ ̄ ̄ ̄ ̄ ̄ ̄-->`;files.forEach((file) => {const source = assets[file].source();const newContent = prefix + source;assets[file] = {source() {return newContent;},size() {return newContent.length;},};});});}
}module.exports = MyPlugin;

使用plugin

vue.config.js文件中添加plugin

const MyPlugin = require("./plugin");module.exports = {...configureWebpack: {plugins: [new MyPlugin(),],},
};

webpack 输出阶段会发生的事件钩子

should-emit 所有需要输出的文件已经生成,询问插件有哪些文件需要输出,有哪些不需要输出
emit 确定好要输出哪些文件后,执行文件输出,可以在这里获取和修改输出的内容
after-emit 文件输出完毕
done 成功完成一次完整的编译和输出流程
failed 如果在编译和输出的流程遇到异常,导致 webpack 退出,就会直接跳转到本步骤,插件可以在本事件中获取具体错误原因

http://www.dtcms.com/a/486584.html

相关文章:

  • abap 操作 excel
  • Excel VLOOKUP函数完全教程:从基础到高级实战
  • 网站建设定制设计网站后台怎么添加代码
  • 网站推广软件预期效果专业团队原版视频
  • 个人网站首页导航栏ps制作教程培训课程ui设计
  • 2025WPF 面试高频问题及标准答案
  • 直线电机(S7-1511PN Linmot C1251)调试文档
  • Leetcode 28
  • 【完整源码+数据集+部署教程】 【零售和消费品&存货】【无人零售】自动售卖机饮料检测系统源码&数据集全套:改进yolo11-KernelWarehouse
  • iOS框架内存中占用很高的ttc文件是否正常
  • 建设部网人事考试网站企业宣传片怎么拍
  • 料神wordpress建站教程优购物官方网站直播
  • Spring Boot 3零基础教程,yml语法细节,笔记16
  • 31-基于ZigBee的车位引导系统设计与实现
  • 济宁专业建网站seo关键词优化软件合作
  • 有赞商城建站优化收费
  • 石碣镇做网站晋城商城网站开发设计
  • AxonHub 开源程序是一个现代 AI 网关系统,提供统一的 OpenAI、Anthropic 和 AI SDK 兼容 API
  • 【运维心得】playbook远程清理windows亲测步骤
  • 【学习AI-相关路程-mnist手写数字分类-一段学习的结束:自我学习AI-复盘-代码-了解原理-综述(5) 】
  • 免费的cms视频网站模板3000款免费软件app下载
  • 网站模板没有html文件下载网站建设中忽略的字体侵权行为
  • QT学习和代码练习
  • 把 Python 应用打包成 Windows 可执行程序 — 完整指南
  • 阿里云代理商:什么是阿里云CDN配额?
  • 做推广任务的网站制作图片的软件加字体
  • 做公司网站优劣势成都建设网站那个好
  • vLLM 推理 AWQ 量化后的模型
  • **发散创新:游戏物理引擎的深入探究**一、引言随着游戏产业的飞速发展,游戏物理引擎作为游戏开发中不可或缺的一部分,
  • 上海网站制作网站wordpress 显示文章作者