应借鉴 Vue Router 分层设计思想,解耦历史管理、匹配逻辑与视图渲染,提取路由状态机和声明式配置解析为通用内核,按平台实现 history 与 adapter 层,统一抽象 Location 对象,剥离 Vue 响应式依赖以支持多端通用。

直接基于 Vue Router 源码开发多端通用路由库,不建议从零“魔改”官方源码,而应借鉴其核心分层设计思想,解耦历史管理、匹配逻辑与视图渲染三部分,再按目标平台适配底层机制。
明确多端边界:先定义“通用”指哪些环境
Vue Router 的 abstract 模式 已为非浏览器环境提供基础支持(如 Node.js 服务端、Electron 主进程、小程序逻辑层),但真正通用需覆盖:
- Web 浏览器(hash / history / memory)
- 微信/支付宝小程序(无 DOM,URL 管理靠 SDK API)
- React Native(原生导航栈 + JS 路由状态同步)
- 桌面端(Electron 或 Tauri,需桥接原生窗口控制)
关键不是复用全部代码,而是提取 路由状态机 和 声明式配置解析 这两块稳定内核,其余交由平台适配层实现。
架构分层设计:照搬 Vue Router 的模块化思路
参考其 src 目录结构,你的库应划分为四个核心层:
立即学习“前端免费学习笔记(深入)”;
Vue 3 组合式 API 与 最佳实践,涵盖代码组织、useXxx 模式、组合式函数设计、Store 集成、响应式优化及功能抽取。
- core:含 createMatcher、createRouteMap、RouteRecord、Location 等纯逻辑,不依赖任何平台 API
- history:按平台拆分子包 —— web-history、mp-history(小程序)、rn-history、desktop-history
- adapter:封装各端视图更新方式 —— Web 用 Vue 组件、小程序用 Page 构造器、RN 用 NavigationContainer
-
runtime:提供统一的 useRoute、useRouter、
等 API,内部自动代理到底层适配器
这样,新增一个平台只需实现 history + adapter,core 层完全复用,避免重复造轮子。
路由匹配与状态同步是跨端难点
不同平台 URL 抽象程度差异大:
- Web:location.pathname + search + hash
- 小程序:pages.json 定义路径,wx.navigateTo 参数传 data,无标准 query string
- RN:react-navigation 使用 state 对象驱动,URL 是可选副产品
解决方案是统一抽象为 Location 对象:{ path: string, params: Record<string,any>, query: Record<string,any>, hash: string, state: any }。各端 history 实现负责把平台原始跳转动作(如 wx.navigateTo)解析为 Location,并触发 core 的匹配流程;反之,core 匹配结果也通过 history 的 push/replace 方法转译为平台原生调用。
兼容 Vue 生态但不绑定 Vue 运行时
若目标是“多端通用”,就不能强依赖 Vue 响应式系统。可做两件事:
- 将
$route响应式对象改为基于 Proxy 的轻量响应式包装,或直接暴露普通对象 + 订阅回调(onRouteChange) - RouterView 渲染逻辑抽离为 render 函数,Vue 版本只是其中一种封装;小程序版返回 Page 配置,RN 版返回 Navigator.Screen
这样,库本身可作为纯 JS 路由引擎使用,Vue 插件只是上层糖衣,不影响其他框架接入。


















