vue打包后图片路径错误

vue 打包后 static 中图片路径不对的问题
`template` 中 `img` 标签中 `src`
`template` 中 `img` 标签中 `v-bind:src`
在做这个 vue-cms 项目时,npm run build 打包部署后,然后 访问 的时候,发现:图片不能正常的显示(包括背景图,logo 之类的),请求的路径都 404 了。我的图片都放在了 static/image 中。

部署后,查看网络请求,发现
原本应该请求 neveryu.github.io/vue-cms/static/login-bg.jpg 的路径,实际的网络请求是: neveryu.github.io/static/login-bg.jpg【ps:虽然我在开发时,图片能正常显示】

没错,其实在我们准备打包项目之前,需要考虑的一个问题是:【我们的项目最终是要部署在根目录还是子目录】

如果是部署在 根目录,并不会出现什么问题,因为你的资源文件放在 static 中,然后你在引用的时候,都是 /static/images/a.png、/static/images/login-bg.jpg 这样的路径来引用(不管是 css 中,还是 template 中),这样是不会有任何问题的。

大家看到我这个项目的访问路径,应该就知道,我这是属于 【子目录】 部署的情况。

那么在 子目录 部署的时候,就有可能出现本文要说的这个问题 【vue 打包后 static 中图片路径不对的问题】所以,本文后续内容的前置条件就是 子目录 部署。

【重点内容开始】

首先,你如果要部署在子目录的话,那么,你的 config/index.js 配置中,需要将 assetsPublicPath: '/' 改成 assetsPublicPath: './' => 示例代码 。这一点,应该没什么疑问吧。
然后这个时候,你的代码中,引入 static 中图片的时候,就不能使用 /static/images/a.png 这种绝对路径的形式; (虽然,你在开发环境,使用这种绝对路径的方式仍然没有任何问题,但是你部署后,就会发现,原本应该请求 xxx.com/aaaa/static/... 下面的资源,实际的请求地址是 xxx.com/static/... 就像我文章开头说的那样)。而是要使用相对路径的形式。=> 示例代码 大致如下:

<style scoped lang="stylus">
  .login-container
    background: mix(#494166, #424b50) url('../../../static/image/login-bg.jpg') center no-repeat;
    background-size: cover;
</style>


与此同时呢,由于我们在 css 中使用了相对路径来引入图片。那么,打包后,我们的 css 会抽离出来为一个单独的 css 文件,这个时候, css 和 图片 之间的一个相对路径关系就改变了。为了解决这个问题,我们需要在 build/utils.js 中,增加一个 pablicPath 的配置,示例代码 如下:

if (options.extract) {
  return ExtractTextPlugin.extract({
    use: loaders,
    fallback: 'vue-style-loader',
    publicPath: '../../' // 作用是设置打包过程中提取css的方法
  })
} else {
  return ['vue-style-loader'].concat(loaders)
}


这个时候,就解决了打包后图片路径404的问题了。

我们项目中,不光 style 中会有图片的引用,在 template 中同样会有图片的引用。主要分下面三种情况:

style 标签中 background-image (上面示例中已讲解)
template 中 img 标签中 src
template 中 img 标签中 v-bind:src
template 中 img 标签中 src
这种情况与 style 标签中 background-image 一样,我们使用相对路径就行了。
这里 也有一个例子:

<div slot="header" class="el-card-header">
  <img src="../../../static/image/login-logo.png" alt="">
  <h2 class="login-title">{{$t('login.title')}}</h2>
</div>



【唯一需要值得注意的是,template 中 img 标签中 v-bind:src 将不适用这个规则】

template 中 img 标签中 v-bind:src
这里 有一个例子:

<div class="avatar-wrapper">
  <img class="user-avatar" :src="avatar">
  <div class="username-wrapper">
    <span class="user-name">{{name}}</span>
    <i class="el-icon-caret-bottom"></i>
  </div>
</div>



这里的 :src="avatar" 中的 avatar 是多少呢?

admin: {
  avatar: './static/image/avatar/0.jpg'
}


直接使用 src 和 v-bind:src 还是有区别的。
 

<think>好的,我现在需要解决用户关于Vue3+Vite项目中使用JavaScript设置的背景图片打包路径错误的问题。首先,我得回忆一下Vite和Vue3的静态资源处理机制。 用户提到的是通过JS设置的背景图片路径问题。通常,在Vite项目中,如果在模板里直接使用相对路径,Vite会自动处理这些资源路径。但使用JS动态设置时,情况可能不同,因为路径可能在构建过程中没有被正确解析或替换。 首先,我应该考虑资源引用的方式是否正确。在Vite中,引用静态资源时,应该使用import或者将资源放在public目录下。如果图片放在assets目录里,使用import引入可以获得处理后的路径,而public目录下的资源则直接复制到dist根目录,引用时无需加public路径。 用户可能是在JS中直接使用了相对路径,比如`backgroundImage: url('./assets/bg.jpg')`,这样在开发环境下可能有效,但构建时路径可能发生变化,导致404错误。这是因为Vite在构建时会对assets中的资源进行哈希处理,并放在assets目录下,而原始的相对路径可能没有正确指向这个新位置。 接下来,我需要确认用户是如何引入图片的。正确的做法应该是在JS中使用import引入图片,这样Vite会处理并返回正确的URL。例如: ```javascript import bgImage from './assets/bg.jpg'; // 然后在样式中使用 backgroundImage: `url(${bgImage})` ``` 这样,构建后的路径会被替换为正确的哈希路径。 如果用户将图片放在public目录下,应该使用绝对路径,比如`/bg.jpg`,但需要注意public目录下的文件不会被处理,直接复制到dist根目录,所以要保持文件名一致,且没有哈希。 另外,可能涉及到vite.config.js的配置问题,比如base路径设置是否正确。如果项目部署在子路径下,可能需要配置base选项,确保资源路径正确。 还有,用户可能在CSS中使用动态URL,这时需要注意Vite对CSS中URL的处理。但如果是通过JS内联样式设置,可能需要确保路径已经被正确转换。 总结可能的问题点: 1. 未正确导入图片资源,直接使用相对路径。 2. 图片存放位置错误(应放在assets或public目录,并正确引用)。 3. 未处理构建后的路径变化,如哈希文件名。 4. Vite配置中的base或assets配置问题。 解决方案步骤: 1. 确认图片存放位置,如果是项目资源,使用import导入。 2. 检查JS中图片引用方式,使用导入的变量。 3. 检查vite.config.js中的相关配置,如base、assetsInclude等。 4. 构建后检查dist目录结构,确认图片是否被正确复制和处理。 最后,可能需要提供具体的代码示例和配置说明,帮助用户调整他们的代码,确保构建后的路径正确。</think>在 Vue3 + Vite 项目中通过 JavaScript 动态设置背景图片时,打包后出现路径错误通常是因资源处理机制导致的。以下是完整解决方案: --- ### 问题原因 Vite 在构建时会对 `assets` 目录中的资源添加哈希指纹并重写路径,但通过 JS 动态拼接的路径无法被 Vite 自动处理。 --- ### 解决方案 #### 1. 正确导入静态资源 ```javascript // 在组件中导入图片 import bgImage from '@/assets/bg.jpg'; // 使用方式 const style = { backgroundImage: `url(${bgImage})` } ``` #### 2. 配置 Vite 路径别名(可选) ```javascript // vite.config.js import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import path from 'path' export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': path.resolve(__dirname, './src') } } }) ``` #### 3. 处理生产环境路径问题 ```javascript // 动态获取基础路径 const basePath = import.meta.env.BASE_URL // 适用于 public 目录的静态资源 const publicStyle = { backgroundImage: `url(${basePath}static-image.jpg)` } ``` --- ### 目录结构规范 ``` 项目根目录 ├─ src │ └─ assets // 需要打包处理的资源 │ └─ bg.jpg ├─ public // 直接复制的静态资源 │ └─ static-image.jpg ``` --- ### 两种资源处理方式对比 | 特性 | /assets 目录 | /public 目录 | |--------------------|----------------------------------|----------------------------| | 适用场景 | 需要打包处理的资源(压缩、哈希) | 直接复制的原始文件 | | 引用方式 | 必须使用 import 导入 | 使用绝对路径 `/filename` | | 构建结果 | 带哈希的文件名 | 保持原始文件名 | | 路径示例 | `url(/assets/bg.03a6a8.jpg)` | `url(/static-image.jpg)` | --- ### 扩展配置 ```javascript // vite.config.js 添加资源处理配置 export default defineConfig({ build: { assetsDir: 'static', // 修改构建后的资源目录名称 assetsInlineLimit: 4096 // 小于4KB的图片转为base64 } }) ``` --- ### 常见问题排查 1. **404错误**:检查控制台报错路径与实际构建路径是否匹配 2. **哈希未生效**:确保图片是通过 import 方式引入 3. **开发/生产环境差异**:使用 `import.meta.env.MODE` 区分环境 4. **部署子目录**:设置 `base: '/sub-path/'` 配置项 通过正确导入资源 + 合理目录规划,可以彻底解决打包路径问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值