Vite Vue-3 - 项目@不适用于 srcset

Posted

技术标签:

【中文标题】Vite Vue-3 - 项目@不适用于 srcset【英文标题】:Vite Vue-3 - project @ not working for srcset 【发布时间】:2021-07-30 22:48:15 【问题描述】:

我按照this 解决方案使别名@ 工作:

我的 vite.config.js:

import  defineConfig  from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'

// https://vitejs.dev/config/
export default defineConfig(
  plugins: [vue()],
  resolve: 
    alias: [
       find: '@', replacement: path.resolve(__dirname, 'src') 
    ],
  ,
)

这行得通:

<img src="@/assets/logo.png">

这不起作用:

<img src="@/assets/logo.png" srcset="@/assets/logo@2x.png 2x">

这是我在浏览器中的输出:

<img
  src="/src/assets/logo.png"
  srcset="/src/views/@/assets/logo@2x.png 2x"
>

【问题讨论】:

【参考方案1】:

看起来@vue/compiler-sfc 有一个错误,在v3.0.0-beta.9 adding support for absolute URLs in srcset 时引入。这个错误绕过了transformation that would've resolved the asset URLs in srcset。 (在 GitHub 问题 vuejs/vue-next#4819 中报告)

我发现的一种解决方法是手动创建 srcset 并明确解析资产 URL:

<template>
  <img :srcset="srcset" />
</template>

<script setup>
import logo2x from '@/assets/logo@2x.png'
import logo3x from '@/assets/logo@3x.png'

const srcset = `$logo2x 2x, $logo3x 3x`
</script>

或者使用动态导入,如果您需要动态更新srcset,这可能会有所帮助:

<template>
  <img :srcset="srcset" />
</template>

<script setup>
import  ref  from 'vue'

const srcset = ref(null)
Promise.all([
  import('@/assets/logo@2x.png'),
  import('@/assets/logo@3x.png')
]).then(([ default: logo2x ,  default: logo3x ]) => 
  srcset.value = `$logo2x 2x, $logo3x 3x`
)
</script>

【讨论】:

这个问题是否知道或已报告给 vite 团队?很快会有什么简单的解决方法吗? @Syed 我在github.com/vuejs/vue-next/issues/4819中报告了这个错误【参考方案2】:

除非您不是很明确地将图像保存在 ./src/assets/images 文件夹中,否则有一个简单的解决方法,即将您的图像移动到 ./public/assets/image 文件夹并引用它:

<img src="/assets/images/img-01.png"
     srcset="/assets/images/img-01@2x.png 2x">

【讨论】:

【参考方案3】:

您是否尝试过使用 srcset 的 v 绑定。

<img 
  src="@/assets/logo.png" 
  :srcset="require('@/assets/logo@2x.png') + ' 2x'"/>

【讨论】:

感谢您的帮助,但这并没有帮助。我收到此错误:Uncaught (in promise) ReferenceError: require is not defined 和更多我正在寻找不使用 require() 的解决方案。

以上是关于Vite Vue-3 - 项目@不适用于 srcset的主要内容,如果未能解决你的问题,请参考以下文章

Tailwind 不适用于带有 Sass 的 vue 4.3.1

如何将打字稿添加到 Vue 3 和 Vite 项目

使用vite 搭建vue 3的项目

Vue 2.7 + Vite项目搭建

vue3-vite搭建运行

vue3-vite搭建运行