手写一个webpack插件(plugin)

熟悉 vue 和 react 的小伙伴们都知道,在执行过程中会有各种生命周期钩子,其实webpack也不例外,在使用webpack的时候,我们有时候需要在 webpack 构建流程中引入自定义的行为,这个时候就可以在 hooks 钩子中添加自己的方法。

创建插件

webpack 加载 webpack.config.js 中所有配置,此时 webpack 创建 compiler 对象,遍历所有 plugins 中插件,调用插件的 apply 方法,执行剩下编译流程(触发各个 hooks 事件),具体使用什么钩子和钩子是同步还是异步,请移步compiler 钩子

  1. 创建一个 JavaScript 命名函数或 JavaScript 类
  2. 在插件函数的 prototype 上定义一个 apply 方法
  3. 绑定到 webpack 自身的事件钩子上
  4. 导出这个JavaScript 命名函数或 JavaScript 类
  5. 在 webpack.config.js 文件中引入并调用方法

自定义 banner-webpack-plugin

自定义 banner-webpack-plugin 插件,该插件会在每一个打包后的 js 、css 文件第一行添加注释,先看效果图。
Snipaste_2023-05-22_21-09-41.png

  • emit 钩子是输出 asset 到 output 目录之前执行
  • 获取即将输出的资源文件:compilation.assets
  • 遍历 assets,只处理js和css资源,其他文件不处理
  • 通过 content = entcompilation.assets[filename].source() 获取原来内容
  • 拼接上注释 content = prefix + content
  • 修改资源的 source 和 size
// plugins/banner-webpack-plugin.jsclass BannerWebpackPlugin {constructor(options = {}) {this.options = options;}apply(compiler) {// 在资源输出之前触发compiler.hooks.emit.tap("BannerWebpackPlugin", (compilation) => {const extensions = ["css", "js"];const prefix = `/** Author: ${this.options.author}* Build Time: ${new Date()}*/`;// 获取即将输出的资源文件:compilation.assetsfor (const filename in compilation.assets) {if (compilation.assets.hasOwnProperty(filename)) {// 将文件名进行切割const splitted = filename.split(".");// 获取文件扩展名const extension = splitted[splitted.length - 1];// 只处理js和css资源,其他文件不处理if (extensions.includes(extension)) {const asset = compilation.assets[filename];// 获取原来内容let content = asset.source();// 拼接上注释content = prefix + content;// 修改资源compilation.assets[filename] = {// 最终资源输出时,调用source方法,source方法的返回值就是资源的具体内容source: () => content,// 资源大小size: () => content.length,};}}}});}
}
module.exports = BannerWebpackPlugin;

调用 BannerWebpackPlugin

// config/webpack.config.js// 引入插件
const BannerWebpackPlugin = require('../plugins/banner-webpack-plugin');
module.exports = {plugins: [// 调用插件new BannerWebpackPlugin({author: "小小愿望",}),],
};

自定义 take-time-webpack-plugin

自定义 take-time-webpack-plugin 插件,该插件输出 “webpack 构建正在启动!”,打包完成后输出 webpack 构建已完成!总耗时 { time } ms,先看效果图。
Snipaste_2023-05-01_15-46-05.png

// plugins/take-time-webpack-plugin.js// 一个命名的 Javascript 方法 或 JavaScript 类
class TakeTimeWebpackPlugin {time = 0;// 原型上需要定义 apply 的方法apply(compiler) {// 生命周期钩子函数,是由 compiler 暴露// 通过 compiler 获取 webpack 内部的钩子,获取 Webpack 打包过程中的各个阶段compiler.hooks.environment.tap("TakeTimeWebpackPlugin", (compilation) => {console.log("\x1B[36m", "webpack 构建正在启动!");this.time = new Date().getTime();});// 通过 compiler 获取 webpack 内部的钩子,获取 Webpack 打包过程中的各个阶段compiler.hooks.afterEmit.tapAsync("TakeTimeWebpackPlugin", (compilation, callback) => {const nowTime = new Date().getTime();this.time = nowTime - this.time;const str = `webpack 构建已完成!总耗时 ${this.time} ms`console.log("\x1B[32m", str);// 分为同步和异步的钩子,异步钩子在功能完成后,必须执行对应的回调callback();});}
}
module.exports = TakeTimeWebpackPlugin;

调用 TakeTimeWebpackPlugin

在 config/webpack.config.js 文件中引入并执行 TakeTimeWebpackPlugin

// config/webpack.config.js// 引入插件
const TakeTimeWebpackPlugin = require('../plugins/take-time-webpack-plugin');
module.exports = {plugins: [// 调用插件new TakeTimeWebpackPlugin(),],
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/253491.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系统下imx6ull QT编程—— C++基础(一)

Linux QT编程 文章目录 Linux QT编程前言一、 C的输入输出方式1.cout语法形式2.cin语法形式3.C之命名空间 namespace 前言 学习 C的面向对象编程,对学习 Qt 有很大的帮助 一、 C的输入输出方式 效率上,肯定是 C 语言的 scanf 和 printf 的效率高&#…

Windows本地提权 · 上篇

目录 at 命令提权 sc 命令提权 ps 命令提权 利用的是windows的特性,权限继承,命令或者服务创建调用的时候会以system权限调用,那么这个命令或者服务的权限也是system。 进程迁移注入提权 pinjector进程注入 MSF进程注入 令牌窃取提权…

【Unity3D】调整屏幕亮度、饱和度、对比度

1 屏幕后处理流程 调整屏幕亮度、饱和度、对比度,需要使用到屏幕后处理技术。因此,本文将先介绍屏幕后处理流程,再介绍调整屏幕亮度、饱和度、对比度的实现。 屏幕后处理即:渲染完所有对象后,得到一张屏幕图像&#xf…

android装备选择,巫师三前期必拿装备武器_巫师三前期必拿最强装备推荐选择_攻略...

巫师三狂猎是巫师系列游戏的第三部,游戏是根据小说改编而来,既有小说的剧情又有精美逼真的游戏画面,曾获奖无数!第三部的游戏剧情是讲主人公杰洛特(猎魔人)的最终冒险。游戏以战斗为主,并结合主线任务和支线任务&#…

哈利波特AR游戏-巫师联盟 深度解析

今年AR技术的进展,及相关应用值得我们关注。给大家推荐一个AR游戏,应该会超越Pokemon Go。 [ 哈利波特:巫师联盟 ] 这一天可能是魔法世界最重要的一天 AR游戏《哈利波特:巫师联盟》 于2019年6月20日正式上线。 全世界的哈利波特迷&#xff…

大地图开发管理:《巫师3》Umbra遮挡剔除技术

本演讲介绍巫师3使用Umbra实现的遮挡剔除技术。笔记略过了一些过于平凡的实现细节,包括流的加载,如何向Umbra提交数据;也略过了一半以上关于“游戏应当如何选择中间件”的讨论。Umbra 3Umbra是一个芬兰中间件公司,做出核心技术之后…

《巫师3:狂猎》4.01版更新 PC端已上线

去年12月,《巫师3》免费升级次世代版,加入DLSS 3支持,RTX 40系显卡的用户能直接提升体验感,RTX 30系用户能通过DLSS 2获得更稳定的帧数。 目前。《巫师3:狂猎》4.01版已更新上线,在PC、PlayStation 和 Xbo…

哈利波特3 阿兹卡班的囚徒

《哈利波特3阿兹卡班的囚徒》DVD国语配音高清收藏版《哈利波特3:阿兹卡班的囚徒》 片名:Harry Potter and the Prisoner of Azkaban 译名:哈利波特3:阿兹卡班的囚徒 导演:阿方索卡隆Alfonso Cuaron 主演:丹…

昆特牌显示无法连接至服务器,巫师之昆特牌总是显示无法连接网络

巫师之昆特牌这款游戏相信大家都不陌生吧,最近小编经常收到巫师之昆特牌总是显示无法连接网络问题的反馈,接下来小编就为大家提供几种常见的处理方案。 巫师之昆特牌游戏简介 《巫师之昆特牌》是由CD PROJEKT RED开发的一款卡牌类游戏。 游戏的主角是北方…

c语言谭浩强百草园有卖吗,巫师3白果园有什么神器

巫师3这款游戏中,装备对玩家是有一定的影响的,在白果园中隐藏着两个前期神器,是两件毒蛇学派的装备,在哪里呢,下面游戏吧小编为大家带来介绍。 巫师3白果园有什么神器 白果园神器指的是白果园中毒蛇学派的毒蛇钢剑和毒…

讯飞星火认知大模型与ChatGPT的对比分析

引言: 人工智能是当今科技领域的热门话题,自然语言处理是人工智能的重要分支。自然语言处理的目标是让计算机能够理解和生成自然语言,实现人机交互和智能服务。近年来,随着深度学习的发展,自然语言处理领域出现了许多创…

【数据结构6】二叉树的基本操作

文章目录 ⭐️写在前面的话⭐️二叉树的一些基本操作1、结构定义2、先序创建这棵树3、按满二叉树方式创建4、三种递归遍历5、层次遍历6、求二叉树的深度7、求叶子结点数8、三种非递归遍历9、先序线索化二叉树10、先序线索化后遍历11、中序线索化二叉树12、中序线索化后遍历主函…

C语言——每日一题

1.倒置字符串 倒置字符串 要将每一个单词逆序输出,首先可以将整个字符串内容都逆序输出,然后再将字符串中的每一个单词再进行逆序。 例如:逆序 i like beijing. 先逆序成:.gnijieb ekil i 再将每个单词逆序: beij…

Matlab实现曲线拟合的最小二乘法

实验条件 实验用例 x0102030405060708090y6867.166.465.664.661.861.060.860.460 实验要求 利用曲线拟合的线性最小二乘法求被逼近函数f(x)在点x55处的近似值,并画出实验数据和直线。 代码实现 X[0,10,20,30,40,50,60,70,80,90]; Y[68,67.1,66.4,65.6,64.6,61.…

达梦数据库8安装教程

第一步:双击驱动 注意:如果双击显示没有驱动,则安装WinCDEmu软件。 第二步:双击setup.exe安装包 第三步:选择时区 第四步:验证key文件 因为我们是免费试用,所以没有key文件,直接下一…

线性回归——最小二乘法

线性回归:自变量和因变量之间是线性关系,例如:h a0a1x1a2x2…anxn。线性回归预测的一般步骤:假设特征变量Xi满足线性关系,然后根据给定的训练数据训练出一个模型,最后通过此模型进行预测。线性回归的根本就…

最小二乘法多项式曲线拟合原理与实现(数学公式详细推导,代码方面详细注释)

最小二乘法概念: 最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘…

对「曲线拟合」和「最小二乘法」的个人理解

在工程实践中,经常遇到类似的问题: 我们做了n次实验,获得了一组数据 然后,我们希望知道x和y之间的函数关系。所以我们将其描绘在XOY直角坐标系下,得到下面这么一张点云图: 然后,我们发现,x和y…

最小二乘法实现曲线拟合

说明,本文章的源代码来着于网络,本人已在实际项目中反复使用过,证明没问题。 1.简介 已知曲线上的n个点,可以使用某条曲线去拟合,使得整体上所有的点都逼近曲线,可以使用不同的角度去判断整体逼近&#x…

最小二乘法直线拟合汇总

原文链接:https://www.jianshu.com/p/1c4f3edbaa47 首先最小二乘法是面对不连续的离散点。 它的本质是求某些参数,估计值在整体下可以使误差ε最小。 对于离散点的直线拟合、曲线拟合是在满足误差最小的基础上,得出可以用数学函数式表达的可…