vite2+vue3引入动态图片报错404问题

本文探讨了Vite打包过程中如何处理config.js中@符号的配置,如何正确引用动态路径,包括使用根目录、绝对路径和newURL方法。重点在于动态引入时避免解析@符号的技巧和解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

出现这一问题大致可以归结为,vite打包的时候会忽略config.js文件中配置的@ 相当于src这么一说,

// vite.config.js
... 
resolve: {
    alias: {
      "~": path.resolve(__dirname, './'),
      "@": path.resolve(__dirname, 'src')
    }
  },
...

静态图片路径是相对路径还是绝对路径都可以,相当于写死静态文件地址,

<img src="@/assets/img/common/pokemon/other_imgs/bg.png" alt="" />

方法一:动态图片的话,把@换成根目录开始就可以展示了

<img 
v-lazyload="`/src/assets/img/${item.file_name)}`" alt="" class="pokemon-list--box__img" >

方法二:利用new URL()方法即可

// 动态获取src
const getImageUrl = (item) => {
  /* 
  new URL (url, [base])
    url —— 完整的 URL,或者仅路径(如果设置了 base),
    base —— 可选的 base URL:如果设置了此参数,且参数 url 只有路径,则会根据这个 base 生成 URL

    其实不管是用new URL方法还是动态:src 都明白了一点,动态地址 不解析 打包配置的 @符号,要么../ 要么/src 
  */
  return  =  new URL(`../../../assets/img/${item.file_name)}`,import.meta.url)
};

总结:如果在动态引入的时候,直接使用根目录或者是绝对路径,不用配置替换符@即可!

### Vite + Vue3 + TypeScript 路由配置解决方案 在构建基于 ViteVue3 和 TypeScript 的项目时,路由配置可能会遇到一些常见问题。以下是针对该场景下的具体分析与解决办法。 #### 1. 配置 `tsconfig.json` 中的路径映射 为了简化模块导入路径,通常会在项目的根目录下定义 `tsconfig.json` 文件中的 `paths` 属性来设置别名[^1]。例如: ```json { "compilerOptions": { "baseUrl": ".", "paths": { "@/*": ["src/*"] } } } ``` 通过上述配置,可以使用 `@/components/example.vue` 这样的方式替代冗长的相对路径。 --- #### 2. 确保路由和 Vuex 文件为 TypeScript 类型 如果发现引入 `router` 或 `store` 时报错,则可能是由于这些文件未提供类型声明所致。建议将原本的 `.js` 文件转换为 `.ts` 文件,并为其添加必要的类型支持。 例如,在 `router/index.ts` 中定义如下内容: ```typescript import { createRouter, createWebHistory, RouteRecordRaw } from &#39;vue-router&#39;; const routes: Array<RouteRecordRaw> = [ { path: &#39;/&#39;, name: &#39;Home&#39;, component: () => import(&#39;@/views/HomeView.vue&#39;) }, ]; const router = createRouter({ history: createWebHistory(process.env.BASE_URL), routes, }); export default router; ``` 同样地,对于 Vuex 存储部分也需要调整其扩展名为 `.ts` 并补充类型信息[^2]: ```bash npm install vuex@next --save ``` 随后创建对应的存储逻辑文件(如 `store/index.ts`),并按照官方文档完成初始化操作。 --- #### 3. 添加全局前置守卫实现权限校验功能 当需要对某些特定页面实施访问控制机制时,可以通过注册导航钩子函数达成目标[^3]。下面展示了一个简单的例子用于验证用户是否已登录: ```typescript import type { Router } from &#39;vue-router&#39;; import { getToken, goLogin } from &#39;@/utils/common&#39;; // 假设存在工具类库帮助获取 token 及重定向至登录页 export const setRouterBefore = (router: Router) => { router.beforeEach(async (to) => { if (to.fullPath !== &#39;/sign/login&#39; && !getToken()) { goLogin(); return false; // 终止当前流程 } return true; // 放行请求 }); }; ``` 最后记得调用此方法传入实例化的路由器对象即可生效。 --- #### 4. 处理动态加载资源引发的相关误 有时会因为不恰当的方式尝试异步读取静态资产而导致异常情况发生。对此推荐采用 glob 方法代替传统手段以规避潜在风险[^4]。比如要按需加载地图数据可参照以下做法: ```javascript // 替代旧版写法 // const GeoJson = await import(`@/assets/maps/${adcode}.json`); // const data = GeoJson.default; const path = `/src/assets/maps/${adcode}.json`; const GeoJson = import.meta.glob(&#39;/src/assets/maps/*.json&#39;); const result = await GeoJson[path](); console.log(result.default); const data = result.default; ``` 这样不仅能够有效避免跨域等问题还能提升整体性能表现。 --- ### 总结 综上所述,面对 Vite 结合 Vue3 和 TypeScript 构建应用过程中所遭遇的各种挑战,我们应当逐一排查可能存在的隐患点——从基础环境搭建到高级特性运用均不可忽视任何一个细节环节。只有这样才能真正意义上打造出高质量的产品级框架结构!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值