VITE 忽略指定路径的资源

devtools/2024/11/23 19:26:53/

前言

问题起因是因为项目需要引入服务器端的网络图片

而在编写配置时发现,Vite并不支持排除指定前缀的资源

唯一可以排外的只有 Rollup 的 external 选项可以排除外部依赖,但他只能排除外部依赖,不支持指定路径资源或指定前缀的资源,这就。。。。。

解决方法

后续通过阅读 Vite 官方配置选项发现这么一段话,官方说:可以通过插件自定义实现资源解析,于是就。。。

Vite 配置项
在这里插入图片描述

插件开发

Vite 使用 Rollup 插件 编译和解析模块,所以本文也是用Rollup插件,下面是插件源代码:

/*** 忽略指定路径插件* @param options* @returns*/
const ignorePathPlugin = (options: { paths: string[] }) => {const PLUGIN_ID = "\0ignore-path",PLUGIN_NAME = "ignore-path";return {name: PLUGIN_NAME,resolveId(source: string) {if (options.paths.find((ignorePath) =>picomatch(ignorePath)(source),)) {return {id: `${PLUGIN_ID}_${source}`,meta: {url: source,},};}return null;},load(id: string): string | null {if (id.startsWith(PLUGIN_ID)) {const info = this.getModuleInfo(id);return `export default "${info.meta.url}";`;}return null;},};
};

插件使用方法如下:通过配置插件 的paths属性设置需要忽略的路径,由于插件使用了picomatch依赖,所以支持正则、glob语法

export default defineConfig(({ mode }) => {return {plugins: [ignorePathPlugin({paths: ['/ignore-path/**/*'],}),],};
});

实现原理

插件通过配置Rollup插件的resolveIdload 构建钩子,忽略匹配资源

resolveId

该钩子函数,通过返回PartialResolvedId 对象或者重构后的资源导入路径,实现对模块的解析和重定义

本文通过返回PartialResolvedId 对象,实现忽略匹配资源,例如:

resolveId(source: string) {//判断导入资源路径是否是需要忽略的地址if (options.paths.find((ignorePath) =>picomatch(ignorePath)(source),)) {//重构模块的id和meta信息,对资源进行标记return {id: `${PLUGIN_ID}_${source}`,meta: {url: source,},};}//如果不是需要忽略的资源,返回null,交给其他插件处理return null;
},

具体原理可以查看官网文档和通过inspect插件

load

该钩子函数,通过传入导入资源的id,解析对应资源

本文插件在钩子函数内通过this.getModuleInfo(id)方法获取resolveld方法的返回值,然后获取meta属性中的url,实现对资源的解析,如:

load(id: string): string | null {//判断模块的id是否是插件标记的idif (id.startsWith(PLUGIN_ID)) {//通过this.getModuleInfo(id)内置函数,获取模块信息const info = this.getModuleInfo(id);//返回解析后的模块源码,rollup通过返回的源码信息,解析和转换模块return `export default "${info.meta.url}";`;}//如果不是,返回null,交给其他插件处理return null;
},

注意

  1. PLUGIN_ID值前必须加上\0,这样是为了防止其他插件转化和修改插件处理的结果,避免插件不生效问题
  2. 因为插件功能单一,所以建议开发者使用虚拟模块的方式编写插件,避免资源浪费 官方文档

http://www.ppmy.cn/devtools/136360.html

相关文章

FreeRTOS信号量(一)

目录 什么是信号量? 1.信号量简介 2.二值信号量 2.1二值信号量简介 1. 首先,创建时,二值信号量默认无效 2. 之后中断释放信号量 3.信号量获取成功 4、任务再次进入阻塞态 2.2 创建二值信号量 1、函数vSemaphoreCreateBinary () 2、…

Python3.11.9+selenium,获取图片验证码以及输入验证码数字

Python3.11.9+selenium,获取图片验证码以及输入验证码数字 1、遇到问题:登录或修改密码需要验证码 2、解决办法: 2.1、安装ddddocr pip install ddddocr 2.2、解析验证码函数 import ddddocr def get_capcha_text():#获取验证码图片ele_pic = driver.find_element(By.XPAT…

FreeRTOS:事件标志组与任务通知

目录 一、事件标志组(Event Groups) 1、事件标志组的特点 2、事件标志组与队列、信号量的区别 3、关键API函数 4、示例代码 5、优缺点 6、总结 二、任务通知(Task Notifications) 1、任务通知的特点 2、关键API函数 3、…

MYSQL——数据更新

一、插入数据 1.插入完整的数据记录 在MYSQL中,使用SQL语句INSERT插入一条完整的记录,语法如下: INSERT INTO 表名 [(字段名1[,...字段名n])] VALUES (值1[...,值n]); 表名——用于指定要插入的数据的表名 字段名——用于指定需要插入数据…

python语言基础-5 进阶语法-5.4 正则表达式

声明:本内容非盈利性质,也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站,会尽量附上原文链接,并鼓励大家看原文。侵删。 5.4 正则表达式 5.4.1 正则表达式 正则表达式的概念: 正则表达式是用来…

Docker 容器自动启动设置

在 Docker 中,可以通过设置容器的重启策略来实现容器的自动启动。这意味着,当 Docker 守护进程启动时,它可以自动启动特定的容器,无论是因为系统重启还是 Docker 服务本身的重启。 设置容器自动启动 要设置容器自动启动&#xf…

Python操作neo4j库py2neo使用之py2neo 删除及事务相关操作(三)

Python操作neo4j库py2neo使用之py2neo 删除及事务相关操作(三) py2neo 删除 1、连接数据库 from py2neo import Graph graph Graph("bolt://xx.xx.xx.xx:7687", auth(user, pwd), nameneo4j)2、删除节点 # 删除单个节点 node graph.node…

Lua如何连接MySQL数据库?

大家好,我是袁庭新。使用Lua语言如何来连接数据库呢?新哥这篇文章给你安排上。 1 LuaSQL概述 LuaSQL是一个轻量级的Lua到数据库管理系统(DBMS)的接口库,由Kepler Project维护,且是开源的。它提供了一个简…