【解决方案】VITE 忽略指定路径的资源

news2024/11/25 20:43:24

前言

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

而在编写配置时发现,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是否是插件标记的id
 	if (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.coloradmin.cn/o/2247482.html

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

相关文章

自然语言处理: RAG优化之Embedding模型选型重要依据:mteb/leaderboard榜

本人项目地址大全:Victor94-king/NLP__ManVictor: CSDN of ManVictor git地址:https://github.com/opendatalab/MinerU 写在前面: 笔者更新不易,希望走过路过点个关注和赞,笔芯!!! 写在前面: 笔者更新不易,希望走过路…

疑难Tips:NextCloud域名访问登录时卡住,显示违反内容安全策略

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 1使用域名访问Nextcloud用户登录时卡住,显示违反内容安全策略 我使用官方Docker镜像来部署NextCloud 28.0.5,并通过Openresty反向代理Nextcloud,但是在安装后无法稳定工作,每次登录后,页面会卡死在登录界面,无法…

SpringBoot 集成 html2Pdf

一、概述&#xff1a; 1. springboot如何生成pdf&#xff0c;接口可以预览可以下载 2. vue下载通过bold如何下载 3. 一些细节&#xff1a;页脚、页眉、水印、每一页得样式添加 二、直接上代码【主要是一个记录下次开发更快】 模板位置 1. 导入pom包 <dependency><g…

java实现小程序接口返回Base64图片

文章目录 引言I java 接口返回Base64图片接口设计获取验证码图片-base64字符串获取验证码图片-二进制流arraybufferII 小程序端代码过期代码: 显示文件流图片(arraybuffer)知识扩展:微信小程序下载后端返回的文件流引言 场景: 图形验证码 背景: 接口返回arraybuffer的格式…

Pytorch自定义算子反向传播

文章目录 自定义一个线性函数算子如何实现反向传播 有关 自定义算子的实现前面已经提到&#xff0c;可以参考。本文讲述自定义算子如何前向推理反向传播进行模型训练。 自定义一个线性函数算子 线性函数 Y X W T B Y XW^T B YXWTB 定义输入M 个X变量&#xff0c;输出N个…

ajax (一)

什么是 AJAX [ˈeɪdʒks] &#xff1f; 概念&#xff1a;AJAX是浏览器与服务器进行 数据通信 的技术&#xff0c;动态数据交互 怎么用AJAX? 1. 先使用 axios [k‘sio ʊ s] 库&#xff0c; 与服务器进行 数据通信 ⚫ 基于 XMLHttpRequest 封装、代码简单、月下载量在 1…

URL在线编码解码- 加菲工具

URL在线编码解码 打开网站 加菲工具 选择“URL编码解码” 输入需要编码/解码的内容&#xff0c;点击“编码”/“解码”按钮 编码&#xff1a; 解码&#xff1a; 复制已经编码/解码后的内容。

魔众题库系统 v10.0.0 客服条、题目导入、考试导航、日志一大批更新

魔众题库系统基于PHP开发&#xff0c;可以用于题库管理和试卷生成软件&#xff0c;拥有极简界面和强大的功能&#xff0c;用户遍及全国各行各业。 魔众题库系统发布v10.0.0版本&#xff0c;新功能和Bug修复累计30项&#xff0c;客服条、题目导入、考试导航、日志一大批更新。 …

深入解析 EasyExcel 组件原理与应用

✨深入解析 EasyExcel 组件原理与应用✨ 官方&#xff1a;EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网 在日常的 Java 开发工作中&#xff0c;处理 Excel 文件的导入导出是极为常见的需求。 今天&#xff0c;咱们就一起来深入了解一款非常实用的操作 Exce…

本地部署 MaskGCT

本地部署 MaskGCT 0. 更新系统和安装依赖项1. 克隆代码2. 创建虚拟环境3. 安装依赖模块4. 运行 MaskGCT5. 访问 MaskGCT 0. 更新系统和安装依赖项 sudo apt update sudo apt install espeak-ng1. 克隆代码 git clone https://github.com/engchina/learn-maskgct.git; cd lear…

线程控制方法之wait和sleep的区别

线程控制方法之wait和sleep的区别 wait()和sleep()都是Java线程控制方法&#xff0c;但存在明显区别&#xff1a; 所属与调用&#xff1a;wait()属Object类&#xff0c;需synchronized调用&#xff1b;sleep()属Thread类&#xff0c;可随意调用。锁处理&#xff1a;wait()释放…

Fakelocation Server服务器/专业版 Centos7

前言:需要Centos7系统 Fakelocation开源文件系统需求 Centos7 | Fakelocation | 任务一 更新Centos7 &#xff08;安装下载不再赘述&#xff09; sudo yum makecache fastsudo yum update -ysudo yum install -y kernelsudo reboot//如果遇到错误提示为 Another app is curre…

探索 RocketMQ:企业级消息中间件的选择与应用

一、关于RocketMQ RocketMQ 是一个高性能、高可靠、可扩展的分布式消息中间件&#xff0c;它是由阿里巴巴开发并贡献给 Apache 软件基金会的一个开源项目。RocketMQ 主要用于处理大规模、高吞吐量、低延迟的消息传递&#xff0c;它是一个轻量级的、功能强大的消息队列系统&…

基于信创环境的信息化系统运行监控及运维需求及策略

随着信息技术的快速发展和国家对信息安全的日益重视&#xff0c;信创环境&#xff08;信息技术应用创新环境&#xff09;的建设已成为行业发展的重要趋势。本指南旨在为运维团队在基于信创环境的系统建设及运维过程中提供参考&#xff0c;确保项目顺利实施并满足各项技术指标和…

初学 flutter 问题记录

windows搭建flutter运行环境 一、运行 flutter doctor遇到的问题 Xcmdline-tools component is missingRun path/to/sdkmanager --install "cmdline-tools;latest"See https://developer.android.com/studio/command-line for more details.1&#xff09;cmdline-to…

【虚拟机】VMWare的CentOS虚拟机断电或强制关机出现问题

VMware 虚拟机因为笔记本突然断电故障了&#xff0c;开机提示“Entering emergency mode. Exit the shell to continue.”&#xff0c;如下图所示&#xff1a; 解决方法&#xff1a;输入命令&#xff1a; xfs_repair -v -L /dev/dm-0 注&#xff1a;报 no such file or direct…

设计模式:6、装饰模式(包装器)

目录 0、定义 1、装饰模式包含的四种角色 2、装饰模式的UML类图 3、示例代码 0、定义 动态地给对象添加一些额外的职责。就功能来说装饰模式相比生成子类更为灵活。 1、装饰模式包含的四种角色 抽象组件&#xff08;Component&#xff09;&#xff1a;抽象组件是一个抽象…

Java开发经验——Spring Test 常见错误

摘要 本文详细介绍了Java开发中Spring Test的常见错误和解决方案。文章首先概述了Spring中进行单元测试的多种方法&#xff0c;包括使用JUnit和Spring Boot Test进行集成测试&#xff0c;以及Mockito进行单元测试。接着&#xff0c;文章分析了Spring资源文件扫描不到的问题&am…

Java基于Spring Boot框架的房屋租赁系统,附源码

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

单片机_简单AI模型训练与部署__从0到0.9

IDE&#xff1a; CLion MCU&#xff1a; STM32F407VET6 一、导向 以求知为导向&#xff0c;从问题到寻求问题解决的方法&#xff0c;以兴趣驱动学习。 虽从0&#xff0c;但不到1&#xff0c;剩下的那一小步将由你迈出。本篇主要目的是体验完整的一次简单AI模型部署流程&#x…