前端工程化之:webpack1-9(plugin)

news2024/11/15 7:18:03

一、plugin

 loader 的功能定位是转换代码,而一些其他的操作难以使用 loader 完成,比如:

  • webpack 生成文件时,顺便多生成一个说明描述文件;
  • webpack 编译启动时,控制台输出一句话表示 webpack 启动了;
  • 当 xxxx 时, xxxx 。

这种类似的功能需要把功能嵌入到 webpack 的编译流程中,而这种事情的实现是依托于 plugin 的。

 plugin 本质是一个带有 apply 方法的对象。

var plugin = {
    apply: function(compiler){
        
    }
}

通常,习惯上,我们会将该对象写成构造函数的模式。

class MyPlugin{
    apply(compiler){

    }
}
var plugin = new MyPlugin();

要将插件应用到 webpack ,需要把插件对象配置到 webpack plugins 数组中,如下:

module.exports = {
    plugins:[
        new MyPlugin()
    ]
}

 webpack.config.js :

var MyPlugin = require("./plugins/MyPlugin");
module.exports = {
    mode: "development",
    watch: true,
    plugins: [
        new MyPlugin()
    ]
}

 apply 函数会在 webpack 编译的初始化阶段,创建好 Compiler 对象后运行。

 compiler 对象是在初始化阶段构建的,也就是编译器。整个 webpack 打包期间只有一个 compiler 对象,后续完成打包工作的是 compiler 对象内部创建的 compilation

 apply 方法会在创建好 compiler 对象后调用,并向方法传入一个 compiler 对象。

 compiler 对象提供了大量的钩子函数( hooks ,可以理解为事件), plugin 的开发者可以注册这些钩子函数,参与 webpack 编译和生成。

你可以在 apply 方法中使用下面的代码注册钩子函数:

class MyPlugin{
    apply(compiler){
        compiler.hooks.事件名称.事件类型(name, function(compilation){
            //事件处理函数
        })
    }
}

 ./plugins/MyPlugin 

module.exports = class MyPlugin {
    apply(compiler) {
        //在这里注册事件,类似于window.onload  $(function(){})
        compiler.hooks.done.tap("MyPlugin-done", function(compilation){
            //事件处理函数
            console.log("编译完成");
        })
    }
}

如果使用 watch 实时监测需打包的文件内容是否改变,每次改变后打包时都会触发该注册事件。

1.事件名称

即要监听的事件名,即钩子名,所有的钩子:https://www.webpackjs.com/api/compiler-hooks

2.事件类型

这一部分使用的是 Tapable API ,这个小型的库是一个专门用于钩子函数监听的库。

它提供了一些事件类型:

  • tap:注册一个同步的钩子函数,函数运行完毕则表示事件处理结束
  • tapAsync:注册一个基于回调的异步的钩子函数,函数通过调用一个回调表示事件处理结束
  • tapPromise:注册一个基于 Promise 的异步的钩子函数,函数通过返回的 Promise 进入已决状态表示事件处理结束。

3.处理函数

处理函数有一个事件参数 compilation

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

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

相关文章

Gas Hero Common Heroes NFT 概览与数据分析

作者:stellafootprint.network 编译:mingfootprint.network 数据源:Gas Hero Common Heroes NFT Collection Dashboard Gas Hero “盖世英雄” 是一个交互式的 Web3 策略游戏,强调社交互动,并与 FSL 生态系统集成…

THREE.JS动态场景开发实战【赛博朋克】

在本教程中,我们将探索如何创建类似 Three.js 的赛博朋克场景,灵感来自 Pipe 网站上的背景动画。 我们将指导你完成使用 Three.js 编码动态场景的过程,包括后处理效果和动态光照,所有这些都不需要任何着色器专业知识。 我用这个场…

自动保存知乎上点赞的内容至本地

背景:知乎上常有非常精彩的回答/文章,必须要点赞收藏,日后回想起该回答/文章时翻看自己的动态和收藏夹却怎么也找不到,即使之前保存了链接网络不好也打不开了(。所以我一般碰到好的回答/文章都会想办法保存它的离线版本…

文件上传的另类应用

1.Imagemagick CVE-2016-3714 CVE-2022-44268 CVE-2020-29599可在vulhub靶场进行复现1.1.Imagemagick简介 ImageMagic是一款图片处理工具,当传入一个恶意图片时,就有可能存在命令注入漏洞。 ImageMagick默认支持一种图片格式mvg,而mvg与svg…

USTC ICS(2023Fall) Lab2 The PingPong Sequence

LC-3汇编语言 .ORIG x3000LDI R0,n ;f(n)NOT R0,R0ADD R0,R0,#1 ;取R0补码用于减法AND R1,R1,#0 ;R1记录循环次数,先初始化为0ADD R2,R1,#0 ;R2记录符号,加号为0,减号为-1,f(1)对应加号ADD R3,R1,#3 ;记录f(n),f(1)3AND R5,R5,#0 ;R5存0000 1111 1111 1111…

ubuntu20配置mysql8

首先更新软件包索引运行 sudo apt update命令。然后运行 sudo apt install mysql-server安装MySQL服务器。 安装完成后,MySQL服务将作为systemd服务自动启动。你可以运行 sudo systemctl status mysql命令验证MySQL服务器是否正在运行。 连接MySQL 当MySQL安装…

华为mate60 pro与小米14 pro 的巅峰对决

今天我们换下思路,不讲技术了!我们一起讲讲手机!小编暂时充当一下业余的数码咖。 今天我们就讲讲华为mate60 pro和小米14pro 这两款手机。这两款手机都是近期新出的发行版本,热度那是一直未减啊。 华为mate60 Pro 我们先说说这个…

gitlab-runner注册到gitlab时报错:ERROR: Registering runner... failed xxxxxxxx

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

CRG设计之时钟

1. 前言 CRG(Clock and Reset Generation,时钟复位生成模块) 模块扮演着关键角色。这个模块负责为整个系统提供稳定可靠的时钟信号,同时在系统上电或出现故障时生成复位信号,确保各个模块按预期运行。简而言之,CRG模块就像是SoC系…

Advanced CNN

文章目录 回顾Google NetInception1*1卷积Inception模块的实现网络构建完整代码 ResNet残差模块 Resedual Block残差网络的简单应用残差实现的代码 练习 回顾 这是一个简单的线性的卷积神经网络 然而有很多更为复杂的卷积神经网络。 Google Net Google Net 也叫Inception V…

第一集《修道宗范》

当家师父慈悲,诸位法师、诸位新戒、诸位在家菩萨,阿弥陀佛 今天学人跟大家研究的主题是《修道宗范》。很多人都会认为:所有的宗教都是劝人为善,所以佛教的修学跟一般的宗教,完全是一样的。其实,这个观念只…

Centos慢慢长大(一)

1、写在前面 这将是一个系列性的文章。可能更多的是记录我在学习的过程中的一些感悟吧。我想强调的是在这一系列文章里我会从最小化的安装开始,然后逐渐的增加需要安装的软件。就象一个婴儿的诞生,慢慢的学走路、学说话、学使用筷子。。。。。。 这将是一…

离谱题 3236:练39.1 书香阁座位

3236正常写法 #include<bits/stdc.h> using namespace std; int main() {int sum,a,b;a1;b10;sumb;cout<<a<<" "<<b;cout<<" "<<sum<<endl;do{a;b2;sumx;cout<<a<<" "<<b<<&…

升级企业战略,思腾合力布局智能生产基地

一直专注于人工智能领域&#xff0c;提供云计算、AI服务器、AI工作站、系统集成、产品定制、软件开发、边缘计算等产品和整体解决方案&#xff0c;致力于成为行业领先的人工智能基础架构解决方案商。 升级企业战略 布局智能生产基地 “十四五”时期&#xff0c;是乘势而上打造…

力扣hot100 不同路径 多维DP 滚动数组 数论

Problem: 62. 不同路径 文章目录 思路解题方法复杂度朴素DP 思路 讲述看到这一题的思路 解题方法 &#x1f468;‍&#x1f3eb; 卡尔一题三解 复杂度 时间复杂度: &#xff1a; O ( n m ) O(nm) O(nm) 空间复杂度: O ( n m ) O(nm) O(nm) 朴素DP class Solution {p…

【Qt学习笔记】(一)初识Qt

Qt学习笔记 1 使用Qt Creator 新建项目2 项目代码解释3 创建第一个 Hello World 程序4 关于内存泄漏问题5 Qt 中的对象树6 关于 qDebug&#xff08;&#xff09;的使用7 使用其他方式创建一个 Hello World 程序&#xff08;编辑框和按钮方式&#xff09;8 关于 Qt 中的命名规范…

操作系统基础:死锁

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 &#x1f426;1 死锁的概念&#x1f9a2;1.1 总览&#x1f9a2;1.2 什么是死锁&#x1f9a2;1.3 死锁、饥饿、死循环的区别&#x1f427;1.3.1 概念&#x1f427;1.3.2 区别…

#RAG|NLP|Jieba|PDF2WORD# pdf转word-换行问题

文档在生成PDF时,文宁都发生了什么。本文讲解了配置对象、resources对象和content对象的作用,以及字体、宇号、坐标、文本摆放等过程。同时,还解释了为什么PDF转word或转文字都是一行一行的以及为什么页眉页脚的问题会加大识别难度。最后提到了文本的编码和PDF中缺少文档结构标…

7zip压缩包乱码问题

打开压缩包查看或解压时&#xff0c;发现其中的文件名显示乱码。 经网络搜索&#xff0c;判断是编码的问题。因为我OS是UTF-8&#xff0c;而压缩包编码是CP936。 解决方法只能用命令行&#xff0c;-mcp指定了code page&#xff1a; "c:\Program Files\7-Zip\7z.exe&quo…

阿里云智能集团副总裁安筱鹏:企业数字化的终局是什么?

以下文章来源于数字化企业 &#xff0c;作者安筱鹏博士 回答数字化终局追问的起点是&#xff0c;企业需要重新定义我是谁。成为有竞争力的行业领导厂商&#xff0c;你应当成为一个客户运营商&#xff0c;即能够实时洞察、实时满足客户需求&#xff0c;追求极致的客户体验。而要…