首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深入了解rollup(三)插件机制

深入了解rollup(三)插件机制

原创
作者头像
can4hou6joeng4
发布于 2023-11-16 07:26:30
发布于 2023-11-16 07:26:30
6720
举报

引言

--

Rollup是一个JavaScript模块打包器,它可以将多个模块打包成一个单独的文件,以便在浏览器中使用。与其他打包工具相比,Rollup的主要优势在于它可以生成更小、更快的代码。在本文中,我们将深入了解Rollup的插件机制。

rollup插件机制概述


Rollup 插件是一个对象,具有属性]构建钩子 和 输出生成钩子 中的一个或多个,并遵循我们的约定。插件应作为一个导出一个函数的包进行发布,该函数可以使用插件特定的选项进行调用并返回此类对象。

插件允许你通过例如在打包之前进行转译代码或在node_modules文件夹中查找第三方模块来自定义 Rollup 的行为。

属性

  • name: 插件的名称,用于在警告和错误消息中标识插件。
  • version: 插件的版本,用于插件间通信场景。

约定

  • 插件应该有一个明确的名称,并以rollup-plugin-作为前缀。
  • package.json中包含rollup-plugin关键字。
  • 如果插件使用“虚拟模块”(例如用于辅助函数),请使用\0前缀模块 ID。这可以防止其他插件尝试处理它。

构建钩子执行方式

钩子是在构建的各个阶段调用的函数。钩子可以影响构建的运行方式,提供关于构建的信息,或在构建完成后修改构建。有不同种类的钩子:

  • async:该钩子也可以返回一个解析为相同类型的值的 Promise;否则,该钩子被标记为 sync
  • first:如果有多个插件实现此钩子,则钩子按顺序运行,直到钩子返回一个不是 null 或 undefined 的值。
  • sequential:如果有多个插件实现此钩子,则所有这些钩子将按指定的插件顺序运行。如果钩子是 async,则此类后续钩子将等待当前钩子解决后再运行。
  • parallel:如果有多个插件实现此钩子,则所有这些钩子将按指定的插件顺序运行。如果钩子是 async,则此类后续钩子将并行运行,而不是等待当前钩子。

除了函数之外,钩子也可以是对象。在这种情况下,实际的钩子函数必须指定为 handler。这允许你提供更多的可选属性,以改变钩子的执行:

  • order: "pre" | "post" | null

如果有多个插件实现此钩子,则可以先运行此插件("pre"),最后运行此插件("post"),或在用户指定的位置运行(没有值或 null)。

代码语言:javascript
AI代码解释
复制
export default function resolveFirst() {
  return {
    name: 'resolve-first',
    resolveId: {
      order: 'pre',
      handler(source) {
        console.log(source);
        return null;
      }
    }
  };
}

输出生成钩子

输出生成钩子可以提供有关生成的产物的信息并在构建完成后修改构建。它们的工作方式和类型与 构建钩子 相同,但是对于每个调用 bundle.generate(outputOptions) 或 bundle.write(outputOptions),它们都会单独调用。仅使用输出生成钩子的插件也可以通过输出选项传递,并且因此仅针对某些输出运行。

钩子执行顺序


  1. 通过 options 钩子读取配置,并进行配置的转换,得到处理后的配置对象。
  2. 调用 buildStart 钩子,考虑了所有 options钩子配置的转换,包含未设置选项的正确默认值,正式开始构建流程。
  3. 调用 resolveId 钩子解析模块文件路径。rollup中模块文件的id就是文件地址,所以,类似resolveId这种就是解析文件地址的意思。从inputOptioninput配置指定的入口文件开始,每当匹配到引入外部模块的语句(如:import moudleA from './moduleA')便依次执行注册插件中的每一个 resolveId 钩子,直到某一个插件中的 resolveId 执行完后返回非 null 或非 undefined 的值,将停止执行后续插件的 resolveId 逻辑并进入下一个钩子。
  4. 调用load钩子加载模块内容,resolveId中的路径一般为相对路径,load中的路径为处理之后的绝对路径。
  5. 接着判断当前解析的模块是否存在缓存,若不存在则执行所有的 transform 钩子来对模块内容进行进行自定义的转换;若存在则判断shouldTransformCachedModule属性,true则执行所有的 transform 钩子,false则进入moduleParsed钩子逻辑。。
  6. 拿到最后的模块内容,进行 AST 分析,调用 moduleParsed 钩子。如果内部没有imports内容,进入buildEnd环节。如果还有imports内容则继续,如果是普通的 import,则执行resolveId 钩子,继续回到步骤3-调用resolveId;如果是动态 import,则执行resolveDynamicImport 钩子解析路径,如果解析成功,则回到步骤4-load加载模块,否则回到步骤3通过 resolveId 解析路径。
  7. 直到所有的 import 都解析完毕,Rollup 执行buildEnd钩子,Build阶段结束。

插件示例


代码语言:javascript
AI代码解释
复制
// rollup-plugin-example.js

export default function myExample () {
  return {
    name: 'my-example',
    options (options) {
      console.log({ options })
    },
    buildStart (options) {
      console.log("buildStart:", options)
    },
    resolveId (source,importer) {
      console.log("resolveId(source):", source)
      console.log("resolveId(importer):", importer)
      return null; 
    },
    load (id) {
      console.log({ id })
      return null; 
    },
    transform(code,id) {
      console.log("transform");
      console.log("---",code)
      console.log("---",id)
    },
    moduleParsed (info) {
      console.log("moduleParsed:", info)
    },
    buildEnd() { 
      console.log("buildEnd");
    }
  };
}

调用虚拟模块插件示例


代码语言:javascript
AI代码解释
复制
const virtualModuleId = 'virtual-module';
// rollup约定插件使用“虚拟模块”,使用\0前缀模块 ID。这可以防止其他插件尝试处理它。
const resolvedVirtualModuleId = '\0' + virtualModuleId;
export default function virtualModule() {
  return {
    name: 'virtual-module', 
    resolveId (source) {
      if (source === 'virtual-module') { 
        return resolvedVirtualModuleId; // 告诉Rollup,这个ID是外部模块,不要在此处查找它
      }
      return null; // 其他ID应按通常方式处理
    },
    load (id) {
      console.log({ id })
      if (id === resolvedVirtualModuleId) { 
        // return 'export default "This is virtual!"'; // 告诉Rollup,如何加载此模块
        return 'export default function fib(n) { return n <= 1 ? n : fib(n - 1) + fib(n - 2); }'
      }
      return null; // 其他ID应按通常方式处理
    },
  };
}

界面调用

代码语言:javascript
AI代码解释
复制
// index.js
import fib from "virtual-module";
console.log(fib(10))

build之后

代码语言:javascript
AI代码解释
复制
// index.js
function fib(n) {return n <= 1 ? n : fib(n - 1) + fib(n - 2)}
console.log(fib(10));

总结

--

Rollup的插件机制通过定义钩子函数来扩展其功能,钩子函数在不同的阶段执行不同的操作。开发者可以根据自己的需求编写自定义插件,并将其添加到Rollup配置中。通过使用插件机制,可以实现各种功能扩展,例如修改配置选项、解析模块路径、加载模块内容、转换模块代码等。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
思科、华为、锐捷、华三四大厂商的交换机基础配置命令全收录(附下载)
03 交换机命名hostname aptech2950以aptech2950为例
网络工程师笔记
2022/02/17
5.2K1
思科、华为、锐捷、华三四大厂商的交换机基础配置命令全收录(附下载)
不一定必须精通,但你的懂,学总没有坏处!华为、H3C、锐捷三家交换机配置命令详解
一直以来,对于华为、H3C、锐捷交换机的命令配置,三家交换机的配置命令容易弄混,经常在实际项目配置中出错,因此,本期我们将来介绍这三家交换机的基础配置命令,大家可以分别来看下他们的命令有什么不同。为了让大家更加清楚,每行代码都有解释。
网络工程师笔记
2021/05/17
2.1K0
不一定必须精通,但你的懂,学总没有坏处!华为、H3C、锐捷三家交换机配置命令详解
小型企业局域网搭建(一)
仅作为计算机网络期末课设的记录,有不对的地方欢迎指正!也希望我的记录对于查看博客的你有些许帮助。
全栈程序员站长
2022/09/14
1.3K0
小型企业局域网搭建(一)
干货 | 一篇文章将思科路由器、交换机的常见配置讲完了,果断收藏!
VLAN技术:把物理上直接相连的网络从逻辑上划分为多个子网。每一个VLAN对应着一个广播域,处于不同VLAN上的主机不能直接进行通信,不同VLAN之间的通信要引入第三层交换技术才可以解决。
网络技术联盟站
2019/09/24
2.8K0
干货 | 一篇文章将思科路由器、交换机的常见配置讲完了,果断收藏!
锐捷设备命令最全大合集(2022新版)
Ruijie#delete config.text //删除配置文件“config.text"
网络工程师笔记
2022/10/31
11.5K0
Cisco交换机与路由器命令总结
show version    查看版本及引导信息  show running-config    查看运行设置  show startup-config    查看开机设置  show interface g0/1    显示端口信息  show ip router      显示路由信息  show clock      查看系统时钟  show log        查看日志  show interface counters    查看接口流量  show interface description  查看端口的连接状态与描述  show interface status  查看端口的链接状态、所属vlan以及速率双工 show cdp neighbors  查看CDP邻居  show processes cpu  查看设备CPU使用率    show vlan br    查看vlan数据库    show ip int brief //查看所有端口状况 show int des    //查看所有端口的描述 show int f0/1  //查看f0/1接口状态 show run int f0/1    //查看f0/1配置状况 show run int valn 180    //查看Vlan 的配置状态 show vtp stauts  //查看vtp 的状态 show clock      //查看交换机当前的时间 show ntp stauts    //查看ntp 是否同步 show ip ssh  //查看SSH配置
星哥玩云
2022/07/26
1.2K0
(三层交换机+两层交换机)路由配置
今天来看一个三层交换机的实验。在现实生活中,某公司有两个主要的部门,技术部和销售部,分处于不同的办公室。为了安全和方便管理,对两个部门的主机进行了VLAN划分,技术部和销售处处于不同的VLAN。现在由于业务的需要,销售部和技术部的主机能够互相访问,获得相应的资源,两个部门的交换机通过一台三层交换机进行连接。
MIKE笔记
2023/03/22
8430
(三层交换机+两层交换机)路由配置
锐捷网络交换机配置命令大全,网络工程师收藏!
配置安全违例的处理方式为shutdown,可选为protect (当安全地址数满后,将未知名地址丢弃)、restrict(当违例时,发送一个Trap通知)、shutdown(当违例时将端口关闭,并发送Trap通知,可在全局模式下用errdisable recovery来恢复)
网络技术联盟站
2022/10/31
2.8K0
锐捷网络交换机配置命令大全,网络工程师收藏!
cisco交换机常用命令[通俗易懂]
VLAN的端口聚合叫TRUNK,用来在不同的交换机之间进行连接,以保证在跨越多个交换机上建立的同一个VLAN的成员能够相互通讯。
全栈程序员站长
2022/07/23
1K0
cisco交换机常用命令[通俗易懂]
【Cisco Packet Tracer| 一.交换机配置模式与基本参数配置】
一.交换机的多种模式以及切换 1.如何进入到交换机配置的命令行用户界面(Command Line Interface) enter进入到普通用户模式 2.普通模式模式 普通用户模式下的 命令提示符
MicroFrank
2023/04/24
2.7K0
【Cisco Packet Tracer| 一.交换机配置模式与基本参数配置】
锐捷交换机常用命令速查[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。准备工作 >Enable 进入特权模式   #Exit 返回上一级操作模式   #End 返回到特权模式   #write memory 或copy running-config startup-config 保存配置文件   #del flash:config.text 删除配置文件(交换机及1700系列路由器)   #erase startup-config 删除配置文件(2500系列路由器)   #del flash:vlan.dat 删除Vlan配置信息(交换机)   #Configure terminal 进入全局配置模式   (config)# hostname switchA 配置设备名称为switchA   (config)#banner motd & 配置每日提示信息 &为终止符   (config)#enable secret level 1 0 star 配置远程登陆密码为star   (config)#enable secret level 15 0 star 配置特权密码为star   Level 1为普通用户级别,可选为1~15,15为最高权限级别;0表示密码不加密   (config)#enable services web-server 开启交换机WEB管理功能   Services 可选以下:web-server(WEB管理)、telnet-server(远程登陆)等
全栈程序员站长
2022/09/10
4.6K0
神州数码命令:交换机配置
4、为交换机设置Telnet授权用户和口令: 登录到Telnet的配置界面,需要输入正确的用户名和口令,否则交换机将拒绝该Telnet用户的访问。该项措施是为了保护交换机免受非授权用户的非法操作。若交换机没有设置授权Telnet用户,则任何用户都无法进入交换机的Telnet配置界面。因此在允许Telnet方式配置管理交换机时,必须在Console的全局配置模式下使用命令username privilege [password (0 | 7) ] 为交换机设置Telnet授权用户和口令并使用命令authentication line vty login local打开本地验证方式,其中privilege选项必须存在且为15。 例:
YueXuan
2025/08/19
3490
锐捷交换机配置保存到计算机,锐捷交换机常用配置命令汇总「建议收藏」
前面我们给大家汇总了华为、华三交换机的配置命令,都是非常适合小项目的,当然碰到大型的网络工程,还是需要厂家的专业人才来做。今天再给大家分享一下锐捷交换机的配置命令,这样国内三大家就全部都有了,学习一些基础网络知识还是不错的,尤其在视频监控系统中应用一下,还是可以的。
全栈程序员站长
2022/09/14
3.7K0
锐捷交换机配置保存到计算机,锐捷交换机常用配置命令汇总「建议收藏」
思科交换机配置笔记
交换机(Switch)是一种用于电信号转发的网络设备,它可以为接入交换机的任意两个网络节点提供独享的电信号通路,最常见的交换机是以太网交换机,其他常见的还有电话语音交换机、光纤交换机等,交换机是集线器的升级替代产品,理论上讲交换机就是按照通信两端传输信息的需求,将需要的信息发送到目标设备上的网络组件.
王瑞MVP
2022/12/28
1.2K0
思科交换机配置笔记
思科模拟器常用命令
计算机命令: PCA login: root                                  :使用root用户 password: linux                                  :口令是linux shutdown -h now                               :同init 0 关机 logout login ifconfig                                        :显示IP地址
阿七日记
2021/12/28
2.9K0
干货!思科交换机配置命令大全,附配置案例
3:交换机命名 hostname aptech2950 以 aptech2950 为例
网络工程师笔记
2021/05/17
4K0
干货!思科交换机配置命令大全,附配置案例
计算机网络交换机命令汇总,锐捷交换机常用配置命令汇总,收藏备用![通俗易懂]
把Console线一端连接在计算机的串口上,另一端连接在网络设备的Console口上。
全栈程序员站长
2022/07/02
1.9K0
计算机网络交换机命令汇总,锐捷交换机常用配置命令汇总,收藏备用![通俗易懂]
路由器交换机的命令行模式以及相关命令
路由器交换机的命令行模式 用户模式 启动后,输入en(enable)就可以进入交换机特权模式 特权模式 进入特权模式的命令提示符是:switch# 在特权模式输入conf t(configure terminal)就可以进入交换机的全局配置模式 全局配置模式 进入全局配置模式的提示符是:Switch(config)# 在全局配置模式输入int f0/1(interface F0/1)就可以进入交换机的接口模式。 根据接口不同,可能是Fa0/1或E0/0等不同接口 接口模式 进入接口模式的命令提示符是Swi
mumumu
2022/12/26
1.6K0
网络工程——CISCO设备基本语法
所有交换机的优先级都是默认的32768,要实现变更根桥,只要将交换机的优先级更改为小于32768,同时优先级的修改以4096为增量
十二惊惶
2024/02/28
4550
思科 配置VLAN与3层交换
enable   //特权模式  ^Z可回特权 config t  //配置模式 no ip domain-lookup //关闭域名解析 (config-line)#exec-timeout 0 0                // 设置超时时间为永不超时 (config-line)#exit                           // 退出 (config)#line vty 0 15                       // 进入VTY口 (config-line)#passw
py3study
2020/01/14
6300
推荐阅读
相关推荐
思科、华为、锐捷、华三四大厂商的交换机基础配置命令全收录(附下载)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档