一、路由概念与价值
什么是页面路由
先问大家一个问题:你在手机 App 里点了一个按钮,跳到了另一个页面。这个「跳转」的过程,背后是谁在管?
嗯,就是路由。
页面路由,说白了就是一套「页面跳转的规则和机制」。它决定了:
- 从 A 页面怎么到 B 页面
- 跳转时带什么参数
- 返回时怎么处理
- 页面栈怎么维护
我刚开始做混合开发时,觉得路由不就是个跳转吗?后来项目越来越大,页面越来越多,才发现路由管理的好坏,直接决定了项目的维护成本和开发效率。
核心定义:路由 = 页面跳转的规则 + 参数传递 + 生命周期管理 + 页面栈控制
路由在混合开发中的核心价值
混合开发里,路由的价值比纯原生或纯 Web 要大得多。为什么?
因为混合开发涉及两个世界:原生(Native)和 Web。路由要在这两个世界之间搭桥。
我总结了一下,路由在混合开发中有三大核心价值:
- 统一跳转入口:不管你是原生页面、H5 页面、还是 RN/Flutter 页面,都走同一套路由规则。开发人员不用关心目标页面是什么技术栈。
- 解耦页面依赖:页面之间不再直接引用。A 页面要跳 B 页面,只需要知道 B 页面的路由名,不需要 import B 的类。这在大型项目中太重要了。
- 灵活配置与动态下发:路由表可以放在服务端。今天想改跳转逻辑?不用发版,改一下配置就行。我在项目中就遇到过,运营要临时调整某个活动页面的入口,路由动态下发直接搞定。
我的经验:路由做得好,后期加页面、改跳转流程,基本不动原有代码。路由做得差,改一个跳转能改出一堆 bug。
原生路由 vs Web 路由的差异
这个问题,我面试时经常问候选人。很多人答不上来,或者答得很浅。
其实两者的差异,说白了就是「两个世界的底层逻辑不同」。
| 对比维度 | 原生路由 | Web 路由 |
|---|---|---|
| 页面栈管理 | 系统维护,push/pop 操作 | 浏览器维护,history 或 hash 控制 |
| 参数传递 | 通过 Intent/Bundle 传参,类型安全 | URL query 或 state,字符串为主 |
| 生命周期 | 有完整的生命周期回调(onCreate、onResume 等) | 只有 DOM 加载、卸载等有限事件 |
| 跨页面通信 | 需要借助 EventBus、广播等机制 | 可以通过 localStorage、postMessage |
| 拦截能力 | 可以拦截跳转、重定向、添加动画 | 路由守卫(beforeEach 等) |
| 性能 | 页面切换流畅,但页面创建销毁开销大 | SPA 切换快,但首次加载慢 |
你想想看,原生路由和 Web 路由,本质上是在解决不同的问题。原生路由更关注「页面实例的管理」,Web 路由更关注「URL 与视图的映射」。
混合开发中,我们要做的就是把这两套逻辑统一起来。嗯,这里有个坑:
我曾经踩过的坑:在混合 App 里直接用 Web 的路由跳原生页面,结果参数传过去全是字符串,类型对不上,崩溃了好几次。后来我统一做了参数序列化和反序列化,才解决这个问题。
混合开发中的路由架构图
下面这张图,是我自己总结的混合开发路由核心架构。你可以看到,路由层处于原生和 Web 之间,起到桥梁作用。
这张图你看懂了吗?路由层在中间,向上对接原生页面,向下对接 Web 页面。所有的跳转请求都先经过路由层,由路由层决定:这个页面是原生打开,还是 Web 打开,还是走降级方案。
小结
路由这个概念,说简单也简单,说复杂也复杂。简单是因为它本质上就是个跳转,复杂是因为在混合开发中,它要处理两个世界的差异。
我个人习惯,在项目一开始就把路由架构设计好。不要等到页面多了再重构,那时候代价就大了。
嗯,这一章就到这里。路由的概念和价值,你心里有数了吧?
公众号:蓝海资料掘金营,微信deep3321