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)
  })
}

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


总结

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

相关推荐
发现一只大呆瓜10 分钟前
深度解密 Rollup 插件开发:核心钩子函数全生命周期图鉴
前端·vite
java_nn1 小时前
一文了解前端技术
前端
发现一只大呆瓜1 小时前
深度解析 Rollup 配置与 Vite 生产构建流程
前端·vite
小码哥_常1 小时前
安卓黑科技:让手机成为你的“跌倒保镖”
前端
小李子呢02112 小时前
前端八股Vue---Vue2和Vue3的区别,set up的用法
前端·javascript·vue.js
m0_647057962 小时前
Harness Engineering 实践指南
前端
邂逅星河浪漫3 小时前
【银行内网开发-管理端】Vue管理端+Auth后台开发+Nginx配置+Linux部署(详细解析)
linux·javascript·css·vue.js·nginx·html·前后端联调
JJay.3 小时前
Android BLE 稳定连接的关键,不是扫描,而是 GATT 操作队列
android·服务器·前端
一 乐3 小时前
电影院|基于springboot + vue电影院购票管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·电影院购票管理管理系统
星空椰3 小时前
JavaScript 进阶基础:函数、作用域与常用技巧总结
开发语言·前端·javascript