vue3+vite中使用new URL遇到的坑

背景:

框架版本:vue3+vite6.3.1

项目中需要动态引入assets文件夹中的图片资源,放到img标签中使用。这里需要开发环境以及生产环境的图片都能正常显示,img的src中带hash码。

问题:

1、测试环境可以显示,但是打包后无法显示。

答:new URL 第一个参数不能写变量,需要直接拼接的写字符串模版。静态资源处理 | Vite 官方中文文档

正确写法:

function getImageUrl(name) {
  return new URL(`./assets/images/label/${name}.png`, import.meta.url).href
}

错误写法:

// Vite 不会转换这个  imagePath不能是变量
const imagePath= `./assets/images/label/${name}.png`
function getImageUrl(name) {
  return new URL(imagePath, import.meta.url).href
}

2、我想把文件路径以及文件名称都传给getImageUrl,而不是只传文件名。但是无法解析,提示undefined

错误写法:

function getImageUrl(name) {
  return new URL(`./assets/images/${name}`, import.meta.url).href
}


// 调用
getImageUrl(`label/01.png`)
getImageUrl(`label/home/02.png`)

答案:如果是vite5的版本是可以这样写的,但是vite6不支持了!目前我用的是非常笨的方法——判断参数然后枚举。连循环拼接都不行。我总结的规律是:new URL第一个参数中需要包含所有的    / (斜杠) 。 /(斜杠) 不能从name中带过来。

正确写法:

function getImageUrl(...args) {
  // 如果只有一个参数,直接返回该路径
  if (args.length === 1) {
    return new URL(`../assets/images/${args[0]}`, import.meta.url).href
  }

  // 如果有两个参数,保持原有逻辑
  if (args.length === 2) {
    return new URL(`../assets/images/${args[0]}/${args[1]}`, import.meta.url)
      .href
  }
  // 如果有三个参数,保持原有逻辑
  if (args.length === 3) {
    return new URL(
      `../assets/images/${args[0]}/${args[1]}/${args[2]}`,
      import.meta.url
    ).href
  }

  // 如果有四个参数,保持原有逻辑
  if (args.length === 4) {
    return new URL(
      `../assets/images/${args[0]}/${args[1]}/${args[2]}/${args[3]}`,
      import.meta.url
    ).href
  }
  if (args.length === 5) {
    return new URL(
      `../assets/images/${args[0]}/${args[1]}/${args[2]}/${args[3]}/${args[4]}`,
      import.meta.url
    ).href
  }
  // 由于vite6问题,这里只能枚举,无法用变量拼接,/只能在url中,不能由参数传来
}

3、new URL不能以src开头`src/xx/xx/xx`,需要写assets的相对当前文件的相对路径`../assets/xx/xx`。

### 使用 Web Workers 在 Vue3 和 TypeScript 的 Vite 项目中的实现 在现代前端开发中,Web Workers 提供了一种简单的方式来运行后台线程以处理耗时的任务。这可以显著提高应用程序的性能并改善用户体验。 以下是关于如何在基于 Vue3、TypeScript 和 Vite 的项目中集成和使用 Web Worker 的详细说明: #### 创建 Web Worker 文件 首先,在项目的 `src` 目录下创建一个新的文件夹来存储所有的 worker 脚本。例如,命名为 `workers/worker.ts`: ```typescript // src/workers/worker.ts self.onmessage = (event: MessageEvent<number>) => { const result = event.data * 2; self.postMessage(result); }; ``` 上述代码定义了一个简单的 Web Worker[^1],它接收来自主线程的消息并将该消息乘以二后再返回给主线程。 #### 配置 Vite 支持 Web Worker 为了使 Vite 正确加载 `.ts` 或其他类型的 Web Worker 文件,需要配置其构建工具支持这些扩展名作为模块导入的一部分。通常情况下,默认设置已经能够很好地工作;但如果遇到任何问题,则可以在 vite.config.js 中显式声明插件或调整选项。 #### 导入与初始化 Web Worker 接着,在组件内部通过 `new Worker()` 构造函数实例化这个新创建的工作线程。由于我们正在使用 TypeScript,因此还需要指定正确的类型定义以便获得更好的 IDE 支持以及编译期检查功能。 下面是一个完整的例子展示如何在一个名为 Page2 的 Vue 组件里启动并通信于之前建立起来的那个倍增器工人角色: ```vue <template> <div>{{ doubledValue }}</div> </template> <script setup lang="ts"> import { ref } from &#39;vue&#39;; const doubledValue = ref(0); if (typeof window !== &#39;undefined&#39;) { const worker = new Worker(new URL(&#39;./workers/worker&#39;, import.meta.url), { type: &#39;module&#39; }); worker.onmessage = (e) => { doubledValue.value = e.data as number; }; worker.onerror = (err) => console.error(&#39;Worker error:&#39;, err.message); worker.postMessage(4); // 发送初始数据到 worker 进行计算 } </script> ``` 在这个片段中,当页面加载完成后会向 worker 发送数值 4 ,随后等待接收到经过加工后的结果更新界面显示内容。 --- #### 注意事项 - **跨域限制**: 如果尝试从外部源引入脚本可能触发 CORS 错误。 - **调试困难**: 浏览器开发者工具对于监控 workers 行为的支持有限。 - **资源管理**: 记得清理不再使用的 workers 来释放内存和其他系统资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值