vite中JS动态引入图片

在HTML中可以使用如下方法获取图片:

<img src="../../assets/bg.png">

但是我们想要在JS中获取图片怎么办?

vue2

在vue2中可以使用require来获取图片

let url=require("./assets/logo.png")
console.log(url);

输出结果是一个base64图片格式

vue3
  1. 方法一

    在vue3中使用require会报错ReferenceError: require is not defined,这是因为vite中不支持这个写法了,vite中静态资源的引入方法已改变[https://cn.vitejs.dev/guide/assets.html#new-url-url-import-meta-url]。

    虽然可以直接import引入,在开发环境下有一个提示,在生产环境下可能会出错。

     import defaultUrl from '@/assets/image/default.jpg'
    

    所以使用以下的方法:

    <img :src="defaultUrl">
    <script>
    const defaultUrl=new URL("@/assets/image/default.jpg",import.meta.url).href
    </script>
    
    • new URL()返回一个URL对象,new URL(url,[base])第一个参数是一个静态路径,第二个参数设置后返回一个URL对象

    • import.meta是当前模块的信息,里面有一个url属性,表示当前的url

      现在打印一下new URL("@/assets/image/default.jpg",import.meta.url)这个新的URL对象,里面有一个href属性就是图片路径,这样无论什么时候都是正确地路径。

  1. 方法二

    import.meta.glob 是 Vite 提供的一种特殊的 API,用于获取符合某种路径模式的所有文件,并自动导入这些文件。

    @ 是 Vite 配置的别名,通常指向 src 目录,因此 @/assets/image/**/* 实际上是匹配 src/assets/image/ 目录下的所有文件。

    eager: true 是一个选项,它告诉 Vite 立即加载(预加载)所有匹配的模块,而不是等到它们被访问时才动态加载。

    const getImage = (name) => {
        const glob = import.meta.glob(`@/assets/images/**/*`, { eager: true })
        console.log(glob);
      	// 假设传入的name为bg.jpg 输出的就是图片路径/src/assets/images/bg.jpg
    		console.log( glob[`/src/assets/images/bg.jpg`]["default"])
        return glob[`/src/assets/images/${name}`]["default"]
    }
    

    可以看到glob是所有/src/assets/images/文件夹下的所有模块,里面的default属性就是图片的路径名。

    image-20241105234412426

### 如何在 ViteVue3 项目中引入图片 #### 使用静态资源路径 对于大多数情况,在 `public` 文件夹下放置图像文件是一个简单有效的方法。任何放在该目录下的文件都可以通过根 URL 访问[^1]。 ```html <img src="/my-image.png" alt="Descriptive text"> ``` 这里的 `/my-image.png` 是相对于 `public` 文件夹的路径。 #### 导入作为模块 另一种方法是在 JavaScript 中导入图片,这使得 Webpack 或者 Vite 能够处理这些资产并返回最终构建中的正确路径: ```javascript import img from './assets/my-image.png'; // 动态加载方式 // or const img = new URL('./assets/my-image.png', import.meta.url).href; // 静态分析URL的方式 ``` 之后可以在模板里使用变量 `img` 来设置 `<img>` 标签的 `src` 属性: ```vue <template> <div> <img :src="img"/> </div> </template> <script setup> import img from './assets/my-image.png'; </script> ``` #### 利用环境变量管理不同环境下使用的图片源 为了适应不同的运行环境(开发、生产),可以通过配置 `.env.*` 文件来指定特定于环境的基础 URL 或 CDN 地址[^2]: ```bash # .env.development VITE_IMAGE_BASE_URL=http://localhost:8080/images/ # .env.production VITE_IMAGE_BASE_URL=https://cdn.example.com/assets/ ``` 接着修改组件代码如下所示: ```vue <template> <div> <img :src="`${import.meta.env.VITE_IMAGE_BASE_URL}image-name.png`"/> </div> </template> ``` 这样做的好处是可以轻松切换不同环境下的资源配置而无需更改业务逻辑代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值