一、路由概念与价值

什么是页面路由

先问大家一个问题:你在手机 App 里点了一个按钮,跳到了另一个页面。这个「跳转」的过程,背后是谁在管?

嗯,就是路由。

页面路由,说白了就是一套「页面跳转的规则和机制」。它决定了:

  • 从 A 页面怎么到 B 页面
  • 跳转时带什么参数
  • 返回时怎么处理
  • 页面栈怎么维护

我刚开始做混合开发时,觉得路由不就是个跳转吗?后来项目越来越大,页面越来越多,才发现路由管理的好坏,直接决定了项目的维护成本和开发效率。

核心定义:路由 = 页面跳转的规则 + 参数传递 + 生命周期管理 + 页面栈控制

路由在混合开发中的核心价值

混合开发里,路由的价值比纯原生或纯 Web 要大得多。为什么?

因为混合开发涉及两个世界:原生(Native)和 Web。路由要在这两个世界之间搭桥。

我总结了一下,路由在混合开发中有三大核心价值:

  1. 统一跳转入口:不管你是原生页面、H5 页面、还是 RN/Flutter 页面,都走同一套路由规则。开发人员不用关心目标页面是什么技术栈。
  2. 解耦页面依赖:页面之间不再直接引用。A 页面要跳 B 页面,只需要知道 B 页面的路由名,不需要 import B 的类。这在大型项目中太重要了。
  3. 灵活配置与动态下发:路由表可以放在服务端。今天想改跳转逻辑?不用发版,改一下配置就行。我在项目中就遇到过,运营要临时调整某个活动页面的入口,路由动态下发直接搞定。

我的经验:路由做得好,后期加页面、改跳转流程,基本不动原有代码。路由做得差,改一个跳转能改出一堆 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 之间,起到桥梁作用。

混合开发路由核心架构 原生层(Native) iOS ViewController Android Activity/Fragment 原生导航栏 / TabBar 原生弹窗 / 原生分享 原生权限请求 统一路由层(Router) 路由注册中心 参数解析器 页面栈管理器 拦截器 Web 层(H5 / RN / Flutter) Vue Router / React Router Flutter Navigator H5 页面栈 WebView 容器 JS Bridge 通信 路由层作为桥梁,统一管理原生与 Web 的页面跳转

这张图你看懂了吗?路由层在中间,向上对接原生页面,向下对接 Web 页面。所有的跳转请求都先经过路由层,由路由层决定:这个页面是原生打开,还是 Web 打开,还是走降级方案。

小结

路由这个概念,说简单也简单,说复杂也复杂。简单是因为它本质上就是个跳转,复杂是因为在混合开发中,它要处理两个世界的差异。

我个人习惯,在项目一开始就把路由架构设计好。不要等到页面多了再重构,那时候代价就大了。

嗯,这一章就到这里。路由的概念和价值,你心里有数了吧?


公众号:蓝海资料掘金营,微信deep3321