uni-app 【报Bug】vuecli Vue3/Vite版 组件template内第一行添加注释后打包class、事件丢失

发布于 1周前 作者 nodeper 来自 Uni-App

uni-app 【报Bug】vuecli Vue3/Vite版 组件template内第一行添加注释后打包class、事件丢失

产品分类:

uniapp/H5

示例代码:

自定义组件cards

<template>  
    <!-- 注释 -->  
    <view class="content">  
        {{ num }}  
    </view>  
</template>  

<script setup>  
defineProps({  
    num: {  
        default: ''  
    }  
})  
</script>  

<style scoped>  
.content{  
    width: 100%;  
    height: 100rpx;  
    background-color: red;  
}  
</style>  

使用cards

<template>  
  <view class="content">  
    <cards :num="item" v-for="item in 6" class="mb-20" @click="hanlderClick(item)" :key="item"/>  
  </view>  
</template>  

<script setup>  
const hanlderClick = (item) => {  
  console.log(item)  
}  
</script>

项目依赖包版本

"dependencies": {  
    "[@dcloudio](/user/dcloudio)/uni-app": "3.0.0-3090820231124001",  
    "[@dcloudio](/user/dcloudio)/uni-app-plus": "3.0.0-3090820231124001",  
    "[@dcloudio](/user/dcloudio)/uni-components": "3.0.0-3090820231124001",  
    "[@dcloudio](/user/dcloudio)/uni-h5": "3.0.0-3090820231124001",  
    "[@dcloudio](/user/dcloudio)/uni-mp-alipay": "3.0.0-3090820231124001",  
    "[@dcloudio](/user/dcloudio)/uni-mp-baidu": "3.0.0-3090820231124001",  
    "[@dcloudio](/user/dcloudio)/uni-mp-jd": "3.0.0-3090820231124001",  
    "[@dcloudio](/user/dcloudio)/uni-mp-kuaishou": "3.0.0-3090820231124001",  
    "[@dcloudio](/user/dcloudio)/uni-mp-lark": "3.0.0-3090820231124001",  
    "[@dcloudio](/user/dcloudio)/uni-mp-qq": "3.0.0-3090820231124001",  
    "[@dcloudio](/user/dcloudio)/uni-mp-toutiao": "3.0.0-3090820231124001",  
    "[@dcloudio](/user/dcloudio)/uni-mp-weixin": "3.0.0-3090820231124001",  
    "[@dcloudio](/user/dcloudio)/uni-mp-xhs": "3.0.0-3090820231124001",  
    "[@dcloudio](/user/dcloudio)/uni-quickapp-webview": "3.0.0-3090820231124001",  
    "vue": "^3.2.45",  
    "vue-i18n": "^9.1.9"  
  },  
  "devDependencies": {  
    "[@dcloudio](/user/dcloudio)/types": "^3.3.2",  
    "[@dcloudio](/user/dcloudio)/uni-automator": "3.0.0-3090820231124001",  
    "[@dcloudio](/user/dcloudio)/uni-cli-shared": "3.0.0-3090820231124001",  
    "[@dcloudio](/user/dcloudio)/uni-stacktracey": "3.0.0-3090820231124001",  
    "[@dcloudio](/user/dcloudio)/vite-plugin-uni": "3.0.0-3090820231124001",  
    "@vue/runtime-core": "^3.2.45",  
    "vite": "4.0.3"  
  }

vite.config.js

import { defineConfig } from 'vite'  
import uni from '[@dcloudio](/user/dcloudio)/vite-plugin-uni'  

export default defineConfig({  
  plugins: [  
    uni(),  
  ],  
  build: {  
    // outDir: 'customDist'  
  }  
})

10 回复

HBuilderX 3.99.2023121601-alpha 已修复。


确实有这么个问题 你可以先用自定义事件解决这个问题 自定义组件cards <template>

<view class=“content” @tap=“emit(‘cardTap’)”>
{{ num }}
</view>
</template>

<script setup> const emit = defineEmits(['cardTap']) defineProps({ num: { default: '' } }) </script> <style scoped> .content { width: 100%; height: 100rpx; background-color: red; } </style>

使用cards

<template> <view class="content"> <cards :num="item" v-for="item in 6" class="mb-20" @cardTap="hanlderClick(item)" :key="item"/> </view> </template> <script setup> const hanlderClick = (item) => { console.log(item) } </script>

谢解答! 这样确实可以解决点击事件的问题,但不光是click事件丢失,class也同样丢失。 临时的解决方案倒是有,比如给cards包一层标签使用,class、click全绑在外层标签上。 但这不是很好的方式,我使用cli版本的目的是自动化构建,代码写的符合规范,运行正常,编译出问题,这给开发带来很大的不确定性和开发成本。

临时解决方案:替换附件文件到 node_modules/@dcloudio/vite-plugin-uni/bin/uni.js,然后重新build。

如果是用GIT命令在服务端npm安装并build的话,该怎么解决?

回复 1***@qq.com: 该问题已经修复了,如果是cli项目,执行npx @dcloudio/uvm@latest升级到最新版即可。

HbuilderX构建发行H5一切正常,加注释也打包结果也正常。应该就是uniapp vue3+vite版的编译包的问题。 给官方提个bug,尽快完善

这个bug给废老大劲才发现,完整的一个项目转到CLI版,运行一切正常,一打包很多样式和事件没了。试了很多方法,从来没往注释的方向想。一个完整的项目最后给我删到只有一个组件,一个页面,所有依赖配置全部删掉,最后才发现是一个注释引起的。一个注释浪费了我一周的时间…

感谢反馈,已复现问题,后续会修复。

uni-app 中使用 Vue 3Vite 构建项目时,如果在组件的 template 内第一行添加注释,可能会导致打包后 class 和事件丢失的问题。这通常是由于 Vite 的模板解析或 uni-app 的编译机制在处理注释时出现了问题。

解决方案

  1. 避免在 template 第一行添加注释: 最简单的解决方案是避免在 template 的第一行添加注释。将注释放在 template 的其他位置,或者放在 script 标签内。

    <template>
      <!-- 不要在这里添加注释 -->
      <div class="container" @click="handleClick">
        <!-- 可以在这里添加注释 -->
        <p>Hello World</p>
      </div>
    </template>
  2. 使用 v-pre 指令: 如果你确实需要在 template 的第一行添加注释,可以尝试使用 v-pre 指令来跳过该部分的编译。

    <template>
      <!-- 使用 v-pre 指令 -->
      <div v-pre><!-- 这里是注释 --></div>
      <div class="container" @click="handleClick">
        <p>Hello World</p>
      </div>
    </template>
  3. 检查 Viteuni-app 的版本: 确保你使用的是最新版本的 Viteuni-app,因为这个问题可能已经在后续版本中修复。

    npm update vite [@dcloudio](/user/dcloudio)/uni-app
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!