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

推荐订阅源

Google DeepMind News
Google DeepMind News
U
Unit 42
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
J
Java Code Geeks
D
DataBreaches.Net
B
Blog RSS Feed
D
Docker
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
F
Fortinet All Blogs
Y
Y Combinator Blog
A
About on SuperTechFans
V
V2EX
罗磊的独立博客
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
MongoDB | Blog
MongoDB | Blog
博客园 - 【当耐特】
Last Week in AI
Last Week in AI
S
SegmentFault 最新的问题
月光博客
月光博客
Vercel News
Vercel News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
阮一峰的网络日志
阮一峰的网络日志

博客园 - 丁少华

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 容器。