0.8.0重磅发布:路由自动生成功能上线
v0.8.0 为 非破坏性 版本(0.7.0 → 0.8.0),两条主线:① 新增 基于文件的路由生成 插件——页面就近声明,构建期自动产出
pages.json与路由表,消除双份手工维护;② 集中修复跨端问题——Android 云打包 UTS 强类型编译错误、H5 端router.push崩溃与uni.*编译警告,并补全 App 端导航动画透传。升级无需改动代码。
一、新特性:基于文件的路由生成
为什么需要
uni-app x 项目里,一个页面的元信息要在两处重复维护:
// router/routes.ts —— 手写路由表
{ path: 'pages/index/index', name: 'home', meta: { title: '首页', isTab: true } }
// pages.json —— 手写页面条目(title 与上面 meta.title 重复维护)
{ "path": "pages/index/index", "style": { "navigationBarTitleText": "首页" } }
页面一多,path / title / tabBar / isTab 极易两处不同步。v0.8.0 引入构建期 dev 工具(随路由库同包分发,运行时零额外依赖):在页面旁就近声明,构建期自动生成 pages.json(含 tabBar / subPackages)与路由表 routes.gen.uts。
快速上手
从新增的子路径导出 @meng-xi/unix-router/vite-plugin 引入 vite 插件(unplugin 打包内置,vite / webpack 通用):
// vite.config.ts(CLI 项目)
import { defineConfig } from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
import { routeGen } from '@meng-xi/unix-router/vite-plugin'
export default defineConfig({
plugins: [
uni(),
routeGen({
pages: {
pagesDir: 'pages',
subPackages: [{ root: 'pages-sub', dir: 'pages-sub' }],
entryPage: 'pages/index/index',
tabBar: { color: '#7A7E83', selectedColor: '#007AFF', backgroundColor: '#FFFFFF' }
},
router: { dts: true }
})
]
})
页面就近声明 defineUniPage 宏:
<!-- pages/index/index.uvue -->
<script setup lang="uts">
defineUniPage({ title: '首页', name: 'home', isTab: true })
</script>
路由表直接使用生成产物:
// router/index.ts
import { createRouter } from '@meng-xi/unix-router'
import { routes } from './routes.gen.uts' // 构建期自动生成
export const router = createRouter({ routes })
::: warning HBuilderX 项目注意
HBuilderX 下项目根存在 vite.config.ts 时会整体替换内置配置(内置的 uni() 不再生效),必须自行从 HBuilderX 内置目录引入 @dcloudio/vite-plugin-uni;否则 dev server 启动后页面空白 / /main 404。详见文档基于文件的路由生成。
:::
三个独立插件,按需选型
插件拆分为三个独立实现(node/ 目录重组为 route-gen / pages-gen / routes-gen + shared),可独立或组合注册、互不影响:
| 插件 | 职责 | 适用场景 |
|---|---|---|
routeGen |
页面文件 → pages.json + 路由表 |
默认推荐,全链路自动同步 |
pagesGen |
页面文件 → 仅 pages.json(含宏 dts) |
页面注册自动化,路由表自己手写 |
routesGen |
pages.json → 仅路由表 |
pages.json 手写或由其他工具维护;name / meta / beforeEnter 经扩展声明文件注入 |
pagesGen+routesGen组合可替代routeGen,两阶段解耦,支持从「手写 pages.json」渐进迁移到「全自动」- 选项随插件拆分:公共选项(
pagesJsonPath/watch/verbose/errorStrategy)+pages段 /router段
二、文件路由的关键设计
- 优先级链:宏 >
<route-config>自定义块 > 插件推导(titleFallback/tabBar配置兜底),字段级合并 - name 自动规范化:末段 camelCase → 冲突回退全路径 camelCase → 终极冲突按
errorStrategy(strict 抛错 / warn 告警跳过) - 保留你的修改:
preserveRouteChanges(默认开启)在重生成时保留对路由文件的既有修改与自定义路由;pages.json手写的非页面字段(globalStyle、uniIdRouter等)合并保留 - 扩展路由:
routesGen模式经routes.ext.uts声明文件注入显式 name / meta 扩展 /beforeEnter(函数原文注入生成文件,须自包含;router.extensions可改路径或false关闭) - watch:页面新增 / 删除 / 修改,200ms 去抖串行重跑两阶段流水线
- 类型产物(均可关闭):
route-name.gen.d.ts(WEB 端RouteNameMap字面量类型)、define-uni-page.d.ts(宏类型声明)
三、修复:Android 云打包编译错误(UTS 强类型)
两处 UTS 强类型约束导致的 Kotlin 编译失败:
Promise.catch回调参数类型:any→any | null。UTS 的any编译为 Kotlin 非空Any,无法匹配UTSPromise.catch要求可空回调参数的重载isNavigationFailure首参签名:Error | null→any | null(内部instanceof收窄),修复.catch((e) => isNavigationFailure(e))链式用法编译失败
四、修复:H5 端两处问题
router.push崩溃:pickAnimation/toUniAnimation/pickEvents对可选字段=== null判断后直接取.length/.size,而 H5(JS 运行时)字段缺省值是undefined,抛TypeError中断导航;统一?? null归一化后判断uni.*导航 API 编译类型警告:WEB 端导航 options 收敛为统一桥接函数applyWebNavOptions(动态字段经as any桥接),消除uni.navigateTo等的编译警告,运行时行为不变
五、补全:App 端导航动画透传
AnimationPlugin 此前 App 端实际未透传动画参数(0.7.0 为规避非蒸汽编译错误,App 端使用了无动画字段的字面量)。0.8.0 换用官方具名 Options 补全:uni.navigateTo / uni.navigateBack 携带 animationType / animationDuration。
按 HBuilderX 官方类型声明(@uniPlatform 标注),动画字段仅 App 支持:
| 平台 | 动画字段支持 | 本库行为 |
|---|---|---|
| App-Android / iOS / HarmonyOS | ✅ 4.18+ / 4.25+ / 4.61+ | 透传原生窗口打开 / 关闭动画 |
| Web / H5 | ❌ | WAAPI(element.animate)播放进入 / 退出动画 |
| 小程序各端 | ❌(官方 uniVer: "x") |
不携带动画字段 |
redirectTo / reLaunch / switchTab |
官方 Options 无动画字段 | 各端均不携带 |
六、文档站与 core 全量对齐
- 新增「基于文件的路由」章节(文件约定 / 扩展路由 / 三插件选型 / HBuilderX 接入说明)、
query-utils/useOpenerEventChannel/type-plugin(PluginContext)API 页 - 重写 file-based-routing 主指南,双语侧边栏更新
- 全量精校中英文档与源码一致性,更正动画「仅 App 支持」的平台差异表述(含兼容性矩阵)
七、升级指南
0.7.0 → 0.8.0 无破坏性变更,升级后无需改动代码:
pnpm add @meng-xi/unix-router@0.8.0
版本兼容性
| 功能 | 0.7.0 | 0.8.0 |
|---|---|---|
| 导航 / 守卫 / 状态 / 参数 / 事件 API | ✅ | ✅(不变) |
| 插件实例化注册 | ✅ | ✅(不变) |
| 基于文件的路由生成 | ❌ | ✅ @meng-xi/unix-router/vite-plugin |
| Android 云打包(Promise.catch / isNavigationFailure 链式用法) | ❌ 编译报错 | ✅ |
App 端 navigateTo / navigateBack 原生动画 |
❌ 未透传 | ✅ 透传(官方仅 App 支持) |
H5 端 router.push(携带动画 / events 缺省字段) |
❌ 崩溃 | ✅ |
相关链接
欢迎反馈与共建:GitHub

浙公网安备 33010602011771号