Vite 动态导入静态资源与自动依赖发现实战解析

一、Vite 动态导入静态资源的实现方案

在 Vite 中,动态加载图片、JSON 等静态资源是高频需求,但动态路径拼接可能导致构建失败或资源未识别。以下结合示例代码,分析三种实现方案:


1. 方案一:new URL 动态路径转换

通过 new URL 拼接路径,Vite 自动处理资源引用:

const pathKey = `../assets/${val}.jpg`;
const src = new URL(pathKey, import.meta.url);
imgSrc.value = src.href;

原理与限制

  • Vite 会将路径转换为构建后的哈希 URL(如 _assets/1-abc123.jpg)。
  • 限制:路径必须为静态字符串模板(如 `../assets/${val}.jpg`),不可使用完全动态变量(如 pathKey = '../assets/' + val + '.jpg'),否则构建时无法解析。

2. 方案二:import() 动态导入

使用 import() 语法按需加载资源:

import(`../assets/${val}.jpg`).then((res) => {imgSrc.value = res.default;
});

特性

  • 构建时,Vite 会分析 ../assets/ 下的所有 .jpg 文件,生成对应 chunk。
  • 问题:若 val 的取值在构建时无法确定(如用户输入),可能导致资源缺失。

3. 方案三:import.meta.glob 批量预加载

通过 Glob 模式预加载所有匹配资源,运行时按需获取:

// 预加载所有 jpg 文件(构建时生成映射表)
const srcs = import.meta.glob("../assets/*.jpg", { as: "url" });// 运行时动态获取
const pathKey = `../assets/${val}.jpg`;
const url = await srcs[pathKey]();
imgSrc.value = url;

优势

  • 构建时生成所有资源的 URL 映射表,避免运行时路径不确定性。
  • { as: 'url' } 表示直接返回资源 URL,无需手动处理 default 属性。

二、代码示例的问题与优化
1. 路径严格匹配问题

示例代码中,pathKey 必须与 Glob 生成的键完全一致(如 ../assets/2.jpg)。若文件名含动态前缀(如时间戳),需调整 Glob 模式:

// 松散匹配文件名中的数字
const srcs = import.meta.glob("../assets/[0-9].jpg", { as: "url" });
2. 资源未找到的兜底处理

通过 try/catch 或条件判断增强健壮性:

try {const url = await srcs[pathKey]();imgSrc.value = url;
} catch {imgSrc.value = fallbackImage; // 加载默认图
}

三、Vite 自动依赖发现的条件

Vite 的依赖预构建(Pre-Bundling)是性能优化的核心,其触发条件如下:


1. 依赖类型识别
  • CommonJS 模块:若 node_modules 中的依赖未提供 ESM 格式,Vite 自动预构建。
  • 嵌套依赖:若依赖内部引用了其他 CJS 模块(如 lodash 的子包),触发预构建。
  • 非优化入口:依赖的 package.json 未指定 moduleexports 字段。

2. 代码中的导入方式
  • 静态导入import axios from 'axios' 会被自动分析。
  • 动态导入import('lodash') 若路径为字符串字面量,触发预构建。
  • 完全动态路径import(someVar) 不会触发预构建,可能导致运行时加载问题。

3. 配置干预

vite.config.js 中手动控制依赖:

export default {optimizeDeps: {include: ['lodash/debounce'], // 强制预构建特定子模块exclude: ['jquery'],          // 排除无需预构建的库},
}

四、实战:动态资源与依赖预构建的联动问题
场景:动态加载第三方图标库

假设项目中按需加载 @ant-design/icons 的图标:

const loadIcon = async (name) => {const icon = await import(`@ant-design/icons/${name}.js`);return icon;
};

问题:Vite 默认不会预构建 @ant-design/icons 的子模块,导致运行时加载延迟。

解决方案
在配置中显式声明需要预构建的子模块:

// vite.config.js
export default {optimizeDeps: {include: ['@ant-design/icons/HomeOutlined'],},
}

五、总结与最佳实践
1. 动态资源加载
  • 优先使用 import.meta.glob:提前声明资源范围,避免路径不确定性。
  • 统一资源目录:如将所有动态图片放在 src/assets/dynamic/ 下,通过 Glob 简化匹配。
  • 处理未找到资源:添加日志与兜底逻辑,提升用户体验。
2. 依赖预构建优化
  • 监控控制台输出:运行 vite build 时,检查哪些依赖被自动预构建。
  • 按需手动包含:对大型库的子模块(如 lodashantd),通过 include 减少构建体积。
  • 慎用 exclude:除非明确知晓依赖的模块格式,否则避免盲目排除。
3. 调试工具推荐
  • 构建分析:使用 rollup-plugin-visualizer 查看产物结构。
  • 依赖检查:运行 npx vite deps 查看预构建的依赖列表。

通过上述实践,开发者可以高效管理 Vite 中的动态资源,同时精准控制依赖预构建策略,实现性能与可维护性的最佳平衡。

<template><div><el-switchv-model="value":active-value="2":inactive-value="1"active-color="#13ce66"inactive-color="#ff4949"@change="handleChange"></el-switch><img :src="imgSrc" alt="" /></div>
</template>
<script setup lang="ts">
import { ref } from "vue";
// import a   from "../assets/1.jpg";
// console.log("a", a);const value = ref(1);
const imgSrc = ref("");
const handleChange = async (val: any) => {console.log(val);// const src = new URL(`../assets/${val}.jpg`, import.meta.url);// console.log("src", src);// imgSrc.value = src.href;// import("../assets/" + val + ".jpg").then((res) => {//   console.log("res", res);//   imgSrc.value = res.default;// });const srcs = import.meta.glob("../assets/*.jpg", { as: "url" });console.log("srcs", srcs);// 构建对应的路径 key(注意文件名匹配要完全一致)const pathKey = `../assets/${val}.jpg`;try {const url = await srcs[pathKey]();imgSrc.value = url;} catch {imgSrc.value = ""; // 加载默认图}
};
</script>
<style lang="scss" scoped>
img {width: 1200px;height: 600px;
}
</style>

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

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

相关文章

在matlab中使用UAV123官方toolkits测试自己的数据集

一、前言 最近需要将自己的跟踪代码在自己拍摄的数据集上进行测试&#xff0c;这里我选择使用 UAV123 官方 toolkits 进行配置。首先需要搞清楚这部分代码是如何运行的&#xff0c;精度图和成功率图是如何绘制出来的&#xff0c;然后再将自己的数据集加进去进行测试。 二、UA…

9.idea中创建springboot项目_jdk1.8

9. idea中创建springboot项目_jdk1.8 步骤 1&#xff1a;打开 IntelliJ IDEA 并创建新项目 启动 IntelliJ IDEA。在欢迎界面&#xff0c;点击 New Project&#xff08;或通过菜单栏 File > New > Project&#xff09;。 步骤 2&#xff1a;选择 Maven 项目类型 在左侧…

SpringAI实现AI应用-搭建知识库

SpringAI实战链接 1.SpringAl实现AI应用-快速搭建-CSDN博客 2.SpringAI实现AI应用-搭建知识库-CSDN博客 概述 想要使用SpringAI搭建知识库&#xff0c;就要使用SpringAI中的TikaDocumentReader&#xff0c;它属于ETL&#xff08;提取、转换、加载&#xff09;框架中的提取&…

内网服务器映射到公网上怎么做?网络将内网服务转换到公网上

如何将内网映射到公网&#xff1f;本地局域网的网络下部署的内网服务地址转换到公网上连接访问是大家比较关注的问题&#xff0c;特别是在无公网IP使用的情况下&#xff0c;很多人不知道怎么做。 在没有公网 IP 的情况下&#xff0c;要将内网映射到公网&#xff0c;以便外网能…

intellij idea最新版git开启Local Changes

习惯了在idea的git插件里&#xff0c;查看项目已修改的文件&#xff0c;但是新版idea默认不展示了&#xff0c;用起来很难受。 参考网上教程开启方法如下&#xff1a; 1. 确保安装Git Modal Commit Interface插件并开启该插件 2. 在Advanced Settings开启Use Modal Commit In…

​​智能制造中的预测性维护:基于深度学习的设备故障预测​​

智能制造中的预测性维护:基于深度学习的设备故障预测 引言 在智能制造领域,设备突发故障可能导致巨大的经济损失。传统维护方式(如定期检修或事后维修)往往效率低下且成本高昂。预测性维护(Predictive Maintenance, PdM)通过实时监测设备状态并预测潜在故障,能够显著减…

DeepSeek+即梦:AI视频创作从0到1全突破

目录 一、开启 AI 视频创作大门&#xff1a;前期准备1.1 注册与登录1.2 熟悉工具界面1.3 硬件与网络要求 二、用 DeepSeek 构思视频脚本2.1 明确创作主题与目标2.2 编写优质提示词2.3 生成并优化脚本 三、即梦 AI 实现画面生成3.1 文生图基础操作3.2 调整参数提升画质3.3 保持人…

初始化列表详解

1.类中包含以下成员&#xff0c;必须放在初始化列表位置进行初始化&#xff1a; 1. 引用成员变量 2.const成员变量 3. 自定义类型成员(且该类没有默认构造函数时 ) 2. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序&#xff0c;与其在初始化列表中的先后次序无关…

基于建造者模式的信号量与理解建造者模式

信号量是什么&#xff1f; AI解释&#xff1a;信号量&#xff08;Semaphore&#xff09;是操作系统中用于 进程同步与互斥 的经典工具&#xff0c;由荷兰计算机科学家 Edsger Dijkstra 在 1965 年提出。它本质上是一个 非负整数变量&#xff0c;通过原子操作&#xff08;P 操作…

开闭原则(OCP)

非常棒的问题&#xff01;&#x1f50d; 开闭原则&#xff08;OCP, Open/Closed Principle&#xff09;是软件设计的核心原则之一&#xff0c;下面我将从定义、意义、优劣分析、Python示例和结构图五个方面完整解析给你。 &#x1f9e0; 什么是开闭原则&#xff1f; 开闭原则&a…

python数据分析(七):Pandas 数据变形与重塑

Pandas 数据变形与重塑全面指南 1. 引言 在数据分析过程中&#xff0c;我们经常需要将数据从一种结构转换为另一种结构&#xff0c;以适应不同的分析需求。Pandas 提供了丰富的数据变形与重塑功能&#xff0c;包括旋转(pivot)、堆叠(stack)、融合(melt)等多种操作。本文将详细…

Android学习总结之jetpack组件间的联系

在传统安卓开发中&#xff0c;UI 组件&#xff08;Activity/Fragment&#xff09;常面临三个核心问题&#xff1a; 生命周期混乱&#xff1a;手动管理 UI 与数据的绑定 / 解绑&#xff0c;易导致内存泄漏&#xff08;如 Activity 销毁后回调仍在触发&#xff09;。数据断层&am…

C++初阶:类和对象(二)

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 一.运算符重载 1.1 基本概念 定义 参数规则 特性 选择原则 重载要点 二.类的默认成员函数 2.1 构造函数 构造函数的特点 2.2 析构函数 析构函数的特点 2.3 拷贝构造函数 拷贝构造的特点 2.4 拷贝赋值运算符重…

【c++】【STL】priority_queue详解

目录 priority_queue的作用priority_queue的接口构造函数emptysizetoppushpopswap priority_queue的实现仿函数&#xff08;函数对象&#xff09;是什么&#xff1f;向上调整算法&#xff08;adjustup&#xff09;向下调整算法&#xff08;adjustdown&#xff09;迭代器构造pus…

测试——用例篇

目录 1. 测试用例 1.1 概念 2. 设计测试用例的万能公式 2.1 常规思考逆向思维发散性思维 2.2 万能公式 3. 设计测试用例例的方法 3.1 基于需求的设计方法 ​编辑 3.2 具体的设计方法 3.2.1 等价类 3.2.2 边界值 3.2.3 正交法 3.2.4 判定表法 3.2.5 场景法 3.2.6…

销售总监求职简历模板

模板信息 简历范文名称&#xff1a;销售总监求职简历模板&#xff0c;所属行业&#xff1a;其他 | 职位&#xff0c;模板编号&#xff1a;KREUNY 专业的个人简历模板&#xff0c;逻辑清晰&#xff0c;排版简洁美观&#xff0c;让你的个人简历显得更专业&#xff0c;找到好工作…

AE脚本 关键帧缓入缓出曲线调节工具 Flow v1.5.0 Win/Mac

Flow是一个非常好用的After Effects脚本,它可以让你更加轻松自如地调整关键帧的速度曲线,无需触碰老旧复杂的图形编辑器。 AE脚本介绍 Flow为After Effects带来了一个简洁的界面,使自定义动画曲线变得十分容易,无需深入研究速度和影响力这些让人困惑的概念 - 只需绘制一个曲线…

ACGRIME:用于全局优化和特征选择的自适应混沌高斯RIME优化器,附完整版免费代码

自然现象中&#xff0c;软冰的形成过程由 Set al. [42] 提出&#xff0c;软冰是空气中的过冷水滴在接触固体物体并冻结时形成的。这种现象发生在特定的气候条件下&#xff0c;当水蒸气尚未凝结时&#xff0c;导致冰覆盖的表面呈现出独特的树枝状和叶子状景观。它在软冰的生长和…

大模型开发学习笔记

文章目录 大模型基础大模型的使用大模型训练的阶段大模型的特点及分类大模型的工作流程分词化(tokenization)与词表映射 大模型的应用 进阶agent的组成和概念planning规划子任务分解ReAct框架 memory记忆Tools工具\工具集的使用langchain认知框架ReAct框架plan-and-Execute计划…

4.27-5.4学习周报

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract一、方法介绍2.Rainbow Memory(RM)2.1多样性感知内存更新2.2通过数据增强增强样本多样性(DA) 二、使用步骤1.实验概况2.RM核心代码 总结 摘要 本博客概…