惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
Blog — PlanetScale
Blog — PlanetScale
阮一峰的网络日志
阮一峰的网络日志
M
MIT News - Artificial intelligence
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
U
Unit 42
博客园_首页
WordPress大学
WordPress大学
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
F
Fortinet All Blogs
腾讯CDC
罗磊的独立博客
IT之家
IT之家
I
InfoQ
V
V2EX
博客园 - 叶小钗
A
About on SuperTechFans
Y
Y Combinator Blog
C
Check Point Blog
量子位
Martin Fowler
Martin Fowler
Vercel News
Vercel News

博客园 - 丁少华

adb提取本机apk 安卓ADB调试安卓 高德地图车机版本9.5制作共存 Taskfile 拆分子文件 go项目的taskfile Go 内嵌网页 windows的终端像mac一样好用 pgsql指定用户看到某个表 Huma + Orval 前后端 API 自动生成方案 Mac安装nginx 不喜欢Go的几点 代码写错分支拯救指南 React UI 库推荐 Loop Engineering Vue 3 UI 组件库 Neon白嫖免费pgsql 域名利用cloudflare免费图床 nginx反代CloudflarePages提示502 vite使用shadcn vite使用biome Window下Nginx winserver2022安装不上软件 mac已损坏无法打开 代码高亮 命令运行器之task 命令运行器之just windows开启wsl 白嫖Redis 白嫖MongoDB vercel无服务函数
vue不使用根组件
丁少华 · 2026-08-21 · via 博客园 - 丁少华

可以省略 App.vue,但 Vue 的 createApp() 必须接收一个根组件。可以直接把 RouterView 作为根组件:

// src/main.ts
import { createApp, h } from 'vue'
import { RouterView } from 'vue-router'
import router from '@/router'
import '@/assets/css/global.css'

const Root = {
  render: () => h(RouterView),
}

createApp(Root)
  .use(router)
  .mount('#app')

甚至可以简化为:

import { createApp } from 'vue'
import { RouterView } from 'vue-router'
import router from '@/router'
import '@/assets/css/global.css'

createApp(RouterView)
  .use(router)
  .mount('#app')

不过保留 App.vue 通常便于放置全局结构,例如:

<template>
  <GlobalTitleBar />
  <RouterView />
  <GlobalDialog />
</template>

如果项目没有全局布局,直接用 RouterView 作为根组件完全没问题。React 其实也有根组件,只是经常直接在入口中写成:

root.render(<RouterProvider router={router} />)

Vue 对应的思路就是:

createApp(RouterView).use(router).mount('#app')

如果有需要根组件,怎么办
这种全局 Provider 需要包住 RouterView。不使用 App.vue 时,可以在 main.ts 里直接创建根组件:

import { createApp, h } from 'vue'
import { RouterView } from 'vue-router'
import { NMessageProvider } from 'naive-ui'

import router from '@/router'
import '@/assets/css/global.css'

const Root = {
  render() {
    return h(
      NMessageProvider,
      null,
      {
        default: () => h(RouterView),
      },
    )
  },
}

createApp(Root)
  .use(router)
  .mount('#app')

等价的 Vue 模板是:

<n-message-provider>
  <RouterView />
</n-message-provider>

<content /> 不是 Vue Router 的路由出口;应使用 <RouterView />

如果还有多个 Naive UI Provider,可以继续嵌套,但这时保留一个 App.vue 会更清晰:

<script setup lang="ts">
import {
  NConfigProvider,
  NDialogProvider,
  NMessageProvider,
  NNotificationProvider,
} from 'naive-ui'
</script>

<template>
  <NConfigProvider>
    <NDialogProvider>
      <NNotificationProvider>
        <NMessageProvider>
          <RouterView />
        </NMessageProvider>
      </NNotificationProvider>
    </NDialogProvider>
  </NConfigProvider>
</template>

所以只有一个 Provider 时可直接写在 main.ts;Provider 较多时,App.vue 更适合作为全局 Provider 容器。