vite 动态导入静态资源

内容来源:https://www.jb51.net/javascript/35178695n.htm

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

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

1

2

3

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() 语法按需加载资源:

1

2

3

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

  imgSrc.value = res.default;

});

特性

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

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

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

1

2

3

4

5

6

7

// 预加载所有 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 属性。

在使用 Vite 构建项目时,引入静态资源的方式与传统构建工具(如 Webpack)有所不同。Vite 基于原生 ES 模块进行开发,因此在处理静态资源方面更加现代化和高效。 ### 静态资源的引入方式 #### 1. **使用 `new URL()` 动态导入本地资源** Vite 支持通过 `import.meta.url` 构建动态路径来引入本地静态资源,例如图片、字体等。这种方式适用于动态路径拼接的场景,常用于组件中根据变量加载图片: ```javascript const pathKey = `../assets/${val}.jpg`; const src = new URL(pathKey, import.meta.url); imgSrc.value = src.href; ``` 该方式在开发和构建时都能正确解析路径,避免了路径错误的问题[^1]。 #### 2. **通过工具函数统一引入资源** 对于多个静态资源的引入,建议统一创建一个工具函数来管理资源路径。例如,在 `src/utils/tool.js` 中定义如下函数: ```javascript const getAssetsFile = (url) => { return new URL(`../assets/images/${url}`, import.meta.url).href; }; export default { getAssetsFile }; ``` 在组件中使用时,只需调用该函数传入文件名即可获取正确的资源路径: ```javascript import tool from '@/utils/tool'; const imagePath = tool.getAssetsFile('logo.png'); ``` 这种方式提高了代码的可维护性,也便于资源集中管理[^4]。 #### 3. **静态资源放置与打包配置** Vite 默认将静态资源放在 `assets` 文件夹中,并根据资源大小决定是否转换为 Base64 编码。在 `vite.config.js` 中可以配置资源处理策略: ```javascript export default defineConfig({ build: { outDir: 'dist', rollupOptions: { output: { assetFileNames: "[hash].[name].[ext]" } }, assetsInlineLimit: 4096, // 小于 4KB 的资源将转为 Base64 assetsDir: "static" // 静态资源输出目录 } }); ``` 该配置影响资源在构建时的命名与输出路径,适用于优化资源加载和缓存策略[^3]。 #### 4. **直接使用相对路径引入资源** 对于静态资源如图片、SVG 等,可以直接在模板中使用相对路径引入: ```html <img src="../assets/logo.png" alt="Logo" /> ``` Vite 会自动识别并处理这些路径,适用于静态路径且不需要动态加载的场景。 ### 注意事项 - **不支持 `require` 引入方式**:在 Vue3 + Vite 项目中,`require` 不再被支持,应使用 `import` 或 `new URL()` 方式替代[^2]。 - **路径问题**:确保资源路径正确,特别是在使用动态路径拼接时,路径拼接格式应符合模块解析规则。 - **组件库资源引用**:若在组件库(如 Element Plus、Ant Design Vue)中使用本地资源,应确保组件属性接受 `href` 或 `URL` 类型,或通过 `v-bind` 动态绑定路径。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值