当前位置: 首页 > article >正文

VITE 忽略指定路径的资源

前言

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

而在编写配置时发现,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.kler.cn/a/406443.html

相关文章:

  • 为啥需要MD5加密的时候用str(i)而不是“i”
  • Stm32f103X HAL库 串口DMA空闲中断学习 踩坑记
  • 【2024亚太杯亚太赛APMCM C题】数学建模竞赛|宠物行业及相关产业的发展分析与策略|建模过程+完整代码论文全解全析
  • 如何删除Kafka中的数据以及删除topic
  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice 动态生成word文件
  • 构建无障碍的数字世界:深入探讨Web可访问性指南
  • 医学图像语义分割:前列腺肿瘤、颅脑肿瘤、腹部多脏器 MRI、肝脏 CT、3D肝脏、心室
  • 一线大厂面试集锦
  • 【Linux】环境搭建Qwen2-VL-7B模型(图文详解-成果案例)
  • linux搭建Gray
  • 【初阶数据结构篇】单链表OJ题(上篇)
  • linux下使用vscode编译及引用动态链接库
  • 基于迅为RK3568开发板全国产平台,快速实现APP开机自启动技术分享
  • 什么是ARM
  • Django如何配置多个环境的MySQL数据库
  • (微信小程序)基于Spring Boot的校园失物招领平台的设计与实现(vue3+uniapp+mysql)
  • MongoDB 更新集合名
  • 【鸿蒙】实现新闻上下轮播滚动效果-harmonyos
  • 自动驾驶车载SoC设计功能安全
  • 微软发布Win11 24H2系统11月可选更新KB5046740!
  • centos 服务器 docker 使用代理
  • 论文阅读:SIMBA: single-cell embedding along with features
  • el-table表头前几列固定,后面几列根据接口返回的值不同展示不同
  • 从复合字符串中分割并解析多个JSON字符串
  • VR虚拟现实技术的应用领域有哪些?
  • 长文解读:OSAID 1.0,全球首个开源AI标准,审视探讨其对AI行业实践开源的影响