vue+vite项目,无法使用绝对地址动态导入

博主的桌面工具软件已经正式开发,获取方式:

  • 可以关注我的小程序【中二少年工具箱】获取。(若小程序更新有延迟,可先收藏小程序)

  • 通过下载链接

  • 百度网盘: 链接:pan.baidu.com/s/15zDnSoEz... 提取码:1234 复制这段内容后打开百度网盘手机App,操作更方便哦

具体已实现功能,参考文章中二少年工具箱简介 @TOC


前言

项目中遇到一个场景,页面的标题栏结构基本相同,只是图片需要动态改变,不同类型的页面,进入后,加载不同的图片。


一、静态导入

代码示例

c 复制代码
      <img :src="imgt" alt="">
      
      import img from '@/common/assets/images/base-info/org-user-edit.png'

如果用静态导入的方式,那么就需要穷举所有可能情况,把所有图片都导入,然后加载,显然并不优雅。如果这个组件用在更多的模块,穷举的方式可能还会造成高耦合。

二、import函数

c 复制代码
import(`/src/common/assets/images/base-info/${props.titleImg}`).then(res=>{
  console.log(res)
})

写文章这部分的时候,中文官网挂了,只能贴英文的截图了:

  1. 文档翻译:vite支持原生import函数,但是变量中只能有一层文件路径,也就是说如果写成"import(${xxx}/common/assets/images/base-info/${props.titleImg})"或者titleImg是多层文件,例如:xxx/xxx.png,都会报错
  2. 尽量不要在script中直接写await语法糖,否则容易造成一些不可预知的问题。比如说template已经渲染完毕,而函数部分阻塞,导致props中的变量无法解析,依赖props渲染的dom,可能会有异常。
  3. 这样写有可能vite会报错:

The above dynamic import cannot be analyzed by Vite. See github.com/rollup/plug... for supported dynamic import formats. If this is intended to be left as-is, you can use the / @vite-ignore / comment inside the import() call to suppress this warning.

其实这是不用管的,如果感觉碍眼,可以增加vite忽略:/* @vite-ignore */,修改上面的代码为:

c 复制代码
import(/* @vite-ignore */`/src/common/assets/images/base-info/${props.titleImg}`).then(res=>{
  pathr.value=res.default
})

三、new URL(url, import.meta.url)

这是vite官网介绍的一种方式,官网原文对它的介绍是: ==import.meta.url 是一个 ESM 的原生功能,会暴露当前模块的 URL。将它与原生的 URL 构造器 组合使用,在一个 JavaScript 模块中,通过相对路径我们就能得到一个被完整解析的静态资源 URL== 简单来说,就是通过当前模块的路径【import.meta.url】配合相对路径【url】,就能获取到绝对路径。

c 复制代码
const path=new URL('../../',import.meta.url).href

在哪个模块调用上面的代码,就是得到模块祖父级文件的绝对路径。

四、import.meta.glob

最后介绍glob的方式。这是vite官网介绍的一种方式,官网介绍如下: import.meta.glob可以得到一个json对象,对象的keys由符合条件的绝对路径组成,对应的value是函数,返回一个promise对象,所以根据路径筛选符合条件的json元素,然后运行对应的函数,就能得到资源。

获取对应目录下的所有图片地址:

c 复制代码
const getPathFn=import.meta.glob('@/common/assets/images/base-info/**')[`/src/common/assets/images/base-info1/${props.titleImg}`]
if(getPathFn){
  getPathFn().then(res=>{
    console.log(res.default)
  })
}

我推荐这种方式,因为它限制更少,功能全面。


总结

遇到问题,查官网。官网不懂,问博主。

相关推荐
天蓝色的鱼鱼12 分钟前
前端开发者的组件设计之痛:为什么我的组件总是难以维护?
前端·react.js
codingandsleeping13 分钟前
使用orval自动拉取swagger文档并生成ts接口
前端·javascript
石金龙1 小时前
[译] Composition in CSS
前端·css
白水清风1 小时前
微前端学习记录(qiankun、wujie、micro-app)
前端·javascript·前端工程化
Ticnix1 小时前
函数封装实现Echarts多表渲染/叠加渲染
前端·echarts
用户22152044278001 小时前
new、原型和原型链浅析
前端·javascript
阿星做前端1 小时前
coze源码解读: space develop 页面
前端·javascript
叫我小窝吧1 小时前
Promise 的使用
前端·javascript
NBtab2 小时前
Vite + Vue3项目版本更新检查与页面自动刷新方案
前端
天天扭码2 小时前
来全面地review一下Flex布局(面试可用)
前端·css·面试