vue3如何定义全局组件

 更新时间:2024年10月11日 11:08:11   作者:harmsworth2016  
本文介绍了如何在Vue3中注册和使用全局组件,并解决了通过template定义组件时出现的警告问题,具体方法是在vite.config.js文件中配置Vue构建版本为vue.esm-bundler.js,以支持运行时编译,此操作确保全局组件可以正常工作并解决了编译警告

前言

vue3 全局组件需在 main.js 中定义,参考官网中的 2 个例子,实操如下。

若需构建 vue 项目,请移步 vite构建vue3项目

目录如下

注册全局组件

// main.js
import { createApp } from 'vue'
import App from './App.vue'

// createApp 函数创建一个应用实例
const app = createApp(App)
// 定义全局组件
app.component('alert-box', {
  template: `
  <div class="demo-alert-box">
  <strong>Error!</strong>
  <slot></slot>
  </div>
  `
})

app.component('blog-post', {
  props: ['postTitle'],
  template: `
  <h3>{{ postTitle }}</h3>
  `
})
// mount 函数返回根组件实例
const vm = app.mount('#app')

console.warn('app', app, vm);

使用全局组件

// HelloWorld.vue
<template>
  <h1>{{ msg }}</h1>

  <p>
    <a href="https://vitejs.dev/guide/features.html" rel="external nofollow"  target="_blank">
      Vite Documentation
    </a>
    |
    <a href="https://v3.vuejs.org/" rel="external nofollow"  target="_blank">Vue 3 Documentation</a>
  </p>

  <button @click="state.count++">count is: {{ state.count }}</button>
  <p>
    Edit
    <code>components/HelloWorld.vue</code> to test hot module replacement.
  </p>
  <table>
    <tr v-is="'blog-post'" post-title="表格行的标题"></tr>
  </table>
  <alert-box>
    Something bad happened.
  </alert-box>
  <blog-post post-title="hello!"></blog-post>
</template>

<script setup>
import { defineProps, reactive } from 'vue'

defineProps({
  msg: String
})

const state = reactive({ count: 0 })
</script>

<style scoped>
a {
  color: #42b983;
}
</style>

结果全局组件未生效,且控制台打印出警告:

[Vue warn]: Component provided template option but runtime compilation is not supported in this build of Vue. Configure your bundler to alias “vue” to “vue/dist/vue.esm-bundler.js”.

此处的警告在官网中已经有明确的原因描述 

运行时 + 编译器 vs. 仅运行时

使用构建工具

由于 main.js 中全局组件都是使用 html 字符串传递到 template 选项,此时就是 运行时 + 编译器,需要完整的构建版本,故需在 vite.config.js 中配置 vue 构建版本为 vue.esm-bundler.js

配置 vue 构建版本

// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      'vue':  'vue/dist/vue.esm-bundler.js' 
    },
  },
})

效果如下:

总结

vue3 使用构建工具,默认仅运行时

总结以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue 中自定义指令改变data中的值

    vue 中自定义指令改变data中的值

    这篇文章主要介绍了vue 中自定义指令改变data中的值,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-06-06
  • Vue3如何实现内嵌iframe文档显示功能

    Vue3如何实现内嵌iframe文档显示功能

    这篇文章主要为大家详细介绍了如何在Vue3项目中优雅地实现内嵌iframe功能,用于加载外部文档内容,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-05-05
  • vue打包并部署到nginx上的实现示例

    vue打包并部署到nginx上的实现示例

    本文主要介绍了vue打包并部署到nginx上的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • Vue动态路由路径重复及刷新丢失页面问题的解决

    Vue动态路由路径重复及刷新丢失页面问题的解决

    这篇文章主要介绍了Vue动态路由路径重复及刷新丢失页面问题的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Vue Router官方路由解决方案全解析(最新推荐)

    Vue Router官方路由解决方案全解析(最新推荐)

    VueRouter与Vue核心深度集成,提供响应式路由、声明式导航、懒加载等性能优化,以及与Vuex的无缝协作,其极简API和声明式编程模型提升开发效率,是Vue项目的首选路由方案,本文介绍Vue Router官方路由解决方案解析,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • uniapp 小程序和app map地图上显示多个酷炫动态的标点效果(头像后端传过来)

    uniapp 小程序和app map地图上显示多个酷炫动态的标点效果(头像后端传过来)

    这篇文章主要介绍了uniapp 小程序和app map地图上显示多个酷炫动态的标点效果(头像后端传过来),本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 关于Vue中的全局导航守卫(beforeEach、afterEach)

    关于Vue中的全局导航守卫(beforeEach、afterEach)

    这篇文章主要介绍了关于Vue中的全局导航守卫(beforeEach、afterEach),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • vue实现虚拟滚动渲染成千上万条数据

    vue实现虚拟滚动渲染成千上万条数据

    本文主要介绍了vue实现虚拟滚动渲染成千上万条数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Vue按钮权限的实现示例

    Vue按钮权限的实现示例

    在编写Vue代码的时候,经常会碰到各种权限问题,本文主要介绍了Vue按钮权限的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • 路由vue-route的使用示例教程

    路由vue-route的使用示例教程

    这篇文章主要介绍了路由vue-route的使用,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12

最新评论