uni-app vue3之后在nvue中使用原生插件打包自定义基座会出现 resolution via compilerOptions.isCustomElement.导致自定义事件无法触发

uni-app vue3之后在nvue中使用原生插件打包自定义基座会出现 resolution via compilerOptions.isCustomElement.导致自定义事件无法触发

开发环境 版本号 项目创建方式
Mac HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Mac

HBuilderX类型:正式

HBuilderX版本号:4.85

手机系统:Android

手机系统版本号:Android 11

手机厂商:小米

手机机型:redmi k50pro

页面类型:nvue

vue版本:vue3

打包方式:云端

示例代码:

<template>  
<view style="flex:1;background-color: #0A98D5;" >  
<button type="default" @click="play">play</button>  
<button type="default" @click="pause">pause</button>  
<button type="default" @click="sendGift">sendGift</button>  
<sn-svga-view ref="svga" :autoPlay="true" :dynamicTexts="dTexts" @load="load" @finish="finish" :loopCount="1"  
clearsAfterStop="false" style="flex:1;background-color: red;" :source="source" />
</view>
</template>  

<script>
export default {
data() {
return {
// source: '/static/rose_2.0.0.svga',
source: '',
// source: 'https://snice.oss-cn-hangzhou.aliyuncs.com/svga/posche.svga',
dTexts: {}
};
},
methods: {
play() {
this.source = '/static/image/gift/520.svga';
this.$refs.svga.play();
},
pause() {
this.$refs.svga.pause();
},
load(e) {
console.log(e);
console.log(this.$refs.svga);
uni.showToast({
icon: 'none',
title: JSON.stringify(e.detail)
});
},
sendGift() {
//this.$refs.svga.stop();
this.source = '';
this.$nextTick(() => {
this.source = '/static/image/gift/666.svga';
});
},
finish(e) {
uni.showToast({
icon: 'none',
title: JSON.stringify(e.detail)
});
}
}
};
</script> 

操作步骤:

使用vue3+vite创建的脚手架项目,打包app使用自定义基座来调试,报警告[Vue warn]: Failed to resolve component: sn-svga-view,自定义事件无法触发

预期结果:

没有警告,自定义事件正常触发

实际结果:

报警告,自定义事件无法触发

bug描述:

在使用脚手架创建的vue3+vite项目中,使用原生的自定义组件没有效果,自定义事件无法触发,如果不是脚手架创建的vue3项目,测试虽然有警告,但是自定义事件可以正常触发


更多关于uni-app vue3之后在nvue中使用原生插件打包自定义基座会出现 resolution via compilerOptions.isCustomElement.导致自定义事件无法触发的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app vue3之后在nvue中使用原生插件打包自定义基座会出现 resolution via compilerOptions.isCustomElement.导致自定义事件无法触发的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在 uni-app Vue3 + nvue 环境下使用原生插件时,出现组件解析警告和自定义事件无法触发的问题,主要原因是 Vue3 对自定义元素的处理机制与 Vue2 不同。

问题分析:

  1. Vue3 默认会将非原生 HTML 标签视为未知组件并抛出警告
  2. 原生插件注册的组件(如 sn-svga-view)在 Vue3 中需要显式配置或通过编译器选项识别
  3. 在 nvue 环境中,组件注册机制与 vue 页面有所不同

解决方案:

  1. 配置编译器选项 在 vite.config.js 或对应构建配置中,添加自定义元素配置:
// vite.config.js
export default defineConfig({
  plugins: [
    uni()
  ],
  compilerOptions: {
    isCustomElement: tag => tag.startsWith('sn-')
  }
})
  1. 显式注册组件 在页面中显式定义自定义组件:
import { defineCustomElement } from 'vue'

export default {
  components: {
    'sn-svga-view': defineCustomElement(/* 组件定义 */)
  },
  // ...其余代码
}
  1. 检查原生插件注册 确保在 main.js 或插件配置中正确注册了原生组件:
// 原生插件注册
import svgaPlugin from './plugins/svga-plugin'
app.use(svgaPlugin)
  1. 事件处理调整 Vue3 中自定义事件需要通过 emits 显式声明:
export default {
  emits: ['load', 'finish'],
  methods: {
    load(e) {
      this.$emit('load', e)
    }
  }
}
回到顶部