首页 > 其他分享 >vue3+vite动态引入图片(import.meta.glob)

vue3+vite动态引入图片(import.meta.glob)

时间:2023-12-21 11:24:37浏览次数:46  
标签:bg assets url glob meta vue3 import

Vite官方提供的 import.meta.glob API。

这个方法一般用于批量引入js或者ts文件,但实际上这个方法就是 很多import语句的集合而已,import是可以引入图片的,所以import.meta.glob 也同样可以引入图片资源,只不过需要加入配置项 as:'url' 就可以了。

 通常来说,我们可以用ES提供的 import 来代替 commonJS 的require(),在webpack中,动态引入静态文件可以这样:

<img :src="require(imgPath)" />

而在Vite中,我们虽然不能直接使用require(),但可以这样批量引入静态资源:

<template>
  <div>
    <img
      v-for="(image, index) in images"
      :key="index"
      :src="image"
      alt="dynamic image"
      width="100"
      height="100"
    />
  </div>
</template>
 
<script setup lang="ts">
import { ref } from 'vue'
 
const obj = import.meta.glob('/src/assets/*.{png,jpg}', {
  as: 'url'
})
 
const images = ref<string[]>([])
 
for (const key in obj) {
  obj[key]().then((res) => {
    images.value.push(res)
  })
}
</script>

这样一来,Vite就会帮我们自动import对应的静态资源,所以即使在线上环境,我们也可以展示动态指定路径的静态资源了。

但是要注意:vite提供的这个批量import的方法不能保证每次返回时都是按照顺序返回的,要进行额外处理才行,额外处理的逻辑我就不写了,我的思路是:把 import.meta.glob 返回的数组,通过includes方法检索key值,然后按照自己需要的顺序重排原数组,或者新建一个新数组依序push元素。

路径问题:

一般都配置了@符号作为src路径,那么可以写成import.meta.glob('@/music/*.mp3', {eager: true}),或者直接使用相对路径import.meta.glob('../../music/*.mp3', {eager: true})(这是示例,具体相对路径是什么看你项目中在哪里使用)

写成这样就行了  这里不要用@表示src,我的项目配置了快捷路径的,其它地方也能用,但这里不行,谨记!

 

 

方式一

 

比较笨的实现方法 使用 import()

const bgImage = ref<string>("");
const bgImageFunc = (url: string) =>
  import(url).then((res: any) => {
    bgImage.value = res.default;
  });
// 使用
bgImageFunc("../../assets/images/bg/bg.jpg");

 

 

方式二

使用vite官方提供的方式

/**
 * <p> 获取加载图片地址 </p>
 * examples: bg/bg.png
 * @param imgPath: string
 */
export const requireImg = (imgPath: string) => {
  return new URL(`../assets/images/${imgPath}`, import.meta.url).href;
};
// 使用
requireImg("bg/bg.png");

 

方式三

使用 import.meta.glob 提供的方法

/**
 * <p> 获取加载图片地址 </p>
 * examples: /src/assets/bg/bg.png
 * @param url: string
 *
 */
export const useFile = (url: string) => {
  const modules: Record<string, any> = import.meta.glob("@/assets/images/**/*.{png,svg,jpg,jpeg}", { eager: true });
  if (modules[url]) return modules[url].default;
  else {
    // 地址错误
    console.log("Error url is wrong path");
  }
};
// 使用 必须是带有/src 完整目录
useFile("/src/assets/bg/bg.png");

以上三种方式可以任选一种即可

 

vue3使用vite2.0动态引入本地图片img

引入到js中批量绑定在dom上,作图标进行展示。

 

 

 

这样就可以动态引入了

第二种直接引入

import tyarticle_iconpe from '@/assets/images/home_icon/brochure_icon.png'

第三种可以直接在assets前面加一个src就能识别了

new URL(`/src/assets/images/home_icon/name_icon`, import.meta.url).href

 

标签:bg,assets,url,glob,meta,vue3,import
From: https://www.cnblogs.com/Fooo/p/17918578.html

相关文章

  • 边做笔试边查缺补漏——算法、js基础、vue3官方文档、八股文
    边投简历边完善自己的知识库。最近这些天一直在面试和笔试+投简历中,每次面试或笔试完后其实最重要的不是结果,而是做题的过程或者说对话的过程。因为只有这些才让我知道自己哪里还有不足,比如一碰到算法题就歇菜、vue3和vue2混用、js基础知识不牢固等等。那我痛定思痛,有缺点咱就认......
  • vue vue3 jsx tsx
    0.安装插件(@vitejs/plugin-vue-jsx)vite官方提供了官方的插件来支持在vue3中使用jsx/tsx,直接安装就行。yarn add @vitejs/plugin-vue-jsx -D安装完之后在vite.config.ts中插入一下代码import vueJsx from "@vitejs/plugin-vue-jsx";export default defineConfig({......
  • Vue3
    1、ref和reactive原来reactive是一个对象类型,使用reactive重新赋值一个对象不起作用<scriptlang="ts"setup>import{reactive}from"vue";letuser=reactive({name:'小明',age:10});constdj=()=>{user={name:'大白',age:1......
  • vue3 静态配置文件
    前言有时候我们负责做的只是一个大平台系统下的某个子系统,有时候我们需要调用这个大平台系统下别的子系统的接口。如果直接把别的接口地址,直接写在代码里,那么如果别的子系统的接口调整了,会影响到我们的系统,我们还要重新打包,部署,会很繁琐。解决思路我们的想法是这样:敲代码的......
  • Vite4+Typescript+Vue3+Pinia 从零搭建(7) - request封装
    项目代码同步至码云weiz-vue3-template基于axios封装请求,支持多域名请求地址安装npmiaxios封装utils目录下新建request文件夹,并新建index.ts、request.ts和status.ts文件。1.status.ts文件主要是封装状态码exportconstErrMessage=(status:number|s......
  • VUE3学习基础之模板语法
    我的vue3学习之路总是学学停停,最开始在18年开发微信小程序,就发现小程序和vue的语法有些相似,然后就去看了vue2的文档,随后忙其它的事情就丢下了。直到22年又开始捡起来vue3,有了组合式api,语法简明很多,然后又不知道忙什么丢下。。。前段有些空时间,就把vue3的学习整理下,使用vite构建......
  • vue3学习笔记(四)
    表单输入绑定<!--文本(Text)--><inputv-model="message"placeholder="editme"/><p>Messageis:{{message}}</p><!--多行文本(Textarea)--><textareav-model="message"placeholder="addmultipl......
  • uniapp vue3版本的scroll-view的scroll-into-view方法不生效解决
    问题代码如图bug原因建了vue2版本和vue3版本的uniapp分别测试,vue3版本的scroll-view存在scroll-into-view不生效的问题,目前未修复(23.12.20)解决方法,换了个思路,如图思路:获取当前选中元素的left值,并动态绑定给scroll-left实现定位效果......
  • vue3 实现用户登录和权限验证思路梳理
    2023-12-20星期三一、用登录和退出问题1登录 思路一: 1.1login登录页面,将token存储本地中。 1.2前置路由守卫获取token并验证, 1.3前置路由从缓存中获取用户的访问权限,并生成动态路由。 1.4aixos请求拦截器,从存储中获取存储的token,在所有请求前,设置请求头 思......
  • R-CNN作者Ross Girshick离职,何恺明、谢赛宁回归学界,Meta CV走出了多少大神
    FAIR又一位大佬级研究科学家「出走了」,这次是R-CNN作者RossGirshick。近日,Meta首席科学家YannLeCun发推宣布,RossGirshick将离开FAIR,加入艾伦人工智能研究所(AI2)。此前离职的还有 ResNeXt一作谢赛宁(加入纽约大学任助理教授)、GeorgiaGkioxari(加入Caltech任助理教授)等......