# vite-plugin-uni-root UniApp 虚拟根组件 Vite 插件,零额外依赖,纯字符串操作实现。 ## 解决的问题 UniApp 不支持原生的根组件包裹机制,无法在全局统一注入 `u-config-provider`、`u-toast`、`u-modal` 等需要在每个页面根部存在的组件。传统方案需要在每个页面手动添加,维护成本高。 本插件通过 Vite 构建时注入,自动为每个页面包裹 `` 根组件,无需修改任何页面代码本身。 ## 技术方案 ### 架构 ``` App.root.vue(源码) → 在 main.ts 中导入并注册为全局组件 global-root-view → 页面模板被包裹 页面内容 → 渲染时页面内容填入 ``` ### 工作流程 ``` ┌─────────────┐ ┌──────────────┐ ┌─────────────────┐ │ main.ts │ → │ 注入 import │ → │ 全局注册组件 │ │ │ │ + 注册代码 │ │ global-root-view │ └─────────────┘ └──────────────┘ └─────────────────┘ │ ┌─────────────┐ ┌──────────────┐ │ │ page.vue │ → │ 包裹模板 │ │ │ │ │ │ ←─────────┘ └─────────────┘ └──────────────┘ │ ┌─────────────┐ │ │ App.root.vue│ → 接收页面内容 └─────────────┘ ``` ### 三步实现 1. **main.ts 注入**(`root.ts -> registerRootApp`) - 在 main.ts 中注入 `import GlobalRootView from "./App.root.vue"` - 注入 `app.component("global-root-view", GlobalRootView)` 注册为全局组件 - 注:`GlobalRootView` 仅为局部变量名,实际组件就是 `App.root.vue` 2. **页面模板包裹**(`page.ts -> transformPage`) - 解析 SFC,定位 `