--- title: uni-ku/root iframe: true iframeFormatter: subPages/uni-ku-root/index --- # @uni-ku/root 在传统的 UniApp 开发中,由于框架限制,无法像标准 Vue 应用那样使用全局根组件来管理公共状态和组件,这给开发带来了诸多不便。 为了解决这个问题,我们引入了 [@uni-ku/root](https://github.com/uni-ku/root) 插件,它通过 Vite 模拟出虚拟根组件,让 UniApp 项目也能享受到类似 Vue 标准应用的开发体验,也可以解决 `@uni-helper/vite-plugin-uni-layouts` 插件无法使用微信小程序 `page-meta` 的问题。 ## 🎯 @uni-ku/root 是什么? @uni-ku/root 借助 Vite 模拟出虚拟根组件(支持SFC的App.vue),解决 uniapp 无法使用公共组件问题。 ### 🎏 支持 - 自定义虚拟根组件文件命名(App.ku.vue文件命名支持更换) - 更高灵活度的获取虚拟根组件实例(获取KuRootView的Ref) - 自动提取PageMeta到页面顶层(自动提升小程序PageMeta[用于阻止滚动穿透]组件) ## 🚀 接入步骤和配置 ### 📦 安装 ```bash pnpm add -D @uni-ku/root yarn add -D @uni-ku/root npm install -D @uni-ku/root ``` ### 🚀 Vite 配置 在 `vite.config.ts` 中引入并配置 UniKuRoot 插件: ```typescript import { defineConfig } from 'vite' import Uni from '@dcloudio/vite-plugin-uni' import UniHelperManifest from '@uni-helper/vite-plugin-uni-manifest' import UniHelperPages from '@uni-helper/vite-plugin-uni-pages' import UniHelperLayouts from '@uni-helper/vite-plugin-uni-layouts' import UniHelperComponents from '@uni-helper/vite-plugin-uni-components' import AutoImport from 'unplugin-auto-import/vite' import { WotResolver } from '@uni-helper/vite-plugin-uni-components/resolvers' import UniKuRoot from '@uni-ku/root' // https://vitejs.dev/config/ export default async () => { const UnoCSS = (await import('unocss/vite')).default return defineConfig({ plugins: [ // https://github.com/uni-helper/vite-plugin-uni-manifest UniHelperManifest(), // https://github.com/uni-helper/vite-plugin-uni-pages UniHelperPages({ dts: 'src/uni-pages.d.ts', subPackages: [ 'src/subPages', ], /** * 排除的页面,相对于 dir 和 subPackages * @default [] */ exclude: ['**/components/**/*.*'], }), // https://github.com/uni-helper/vite-plugin-uni-layouts UniHelperLayouts(), // https://github.com/uni-helper/vite-plugin-uni-components UniHelperComponents({ resolvers: [WotResolver()], dts: 'src/components.d.ts', dirs: ['src/components', 'src/business'], directoryAsNamespace: true, }), // https://github.com/uni-ku/root UniKuRoot(), Uni(), // https://github.com/antfu/unocss // see unocss.config.ts for config UnoCSS(), ], }) } ``` **重要提示**:UniKuRoot 插件必须放在 `Uni()` 插件之前,如果存在修改 pages.json 的插件和 `Layout` 插件,需要将 UniKuRoot 放在它们之后。 ### 🎉 创建虚拟根组件 在 `src/App.ku.vue` 中创建虚拟根组件: > 注意 `App.ku.vue` 中暂时无法编写样式全局生效,所以我们可以将样式写到 `App.vue` 中 ```html ``` ## 💡 代码示例和使用方法 ### 1. 在页面中使用全局 Toast ```html ``` ### 2. PageMeta 自动提升示例 在页面中使用 PageMeta 组件,会自动提升到页面顶层: ```html ``` ## 🎉 总结 通过接入 `@uni-ku/root`,wot-starter 项目成功实现了: - ✅ 全局组件的统一管理 - ✅ 主题配置的全局应用 - ✅ 更好的代码组织结构 - ✅ 接近标准 Vue 应用的开发体验 - ✅ 完美支持 Wot UI 组件库 这个方案不仅解决了 UniApp 开发中的痛点,还可以解决 `@uni-helper/vite-plugin-uni-layouts` 插件无法使用微信小程序 `page-meta` 的问题,一举多得,美哉! ## 🔗 相关链接 - [@uni-ku/root GitHub](https://github.com/uni-ku/root) - [Wot UI](https://wot-ui.cn) - [Wot Starter](https://starter.wot-ui.cn)