Vue Router(MPA)

本示例让 Vue Router 运行在 Sparkling 导航之上, 从而用一份路由配置驱动多个原生 Lynx 页面之间的导航 —— 即多页(MPA)模型。

它基于 sparkling-history: 一个与框架无关的 shim,在 Sparkling 的 router.open / router.close 之上实现了 Vue Router 的 history 契约。

与 VueLynx 的视图内路由不同

VueLynx 通过 createMemoryHistory单个 LynxView(同一个 JS heap)构建 SPA。本示例正相反:每个页面是一个独立的 Lynx 容器、拥有 各自的 JS heap,Vue Router 驱动它们之间的原生导航。这些 heap 不共享内存 —— 仅靠一份 构建期生成的路由清单相互连接。

堆内导航(网页预览中可实时运行)

main bundle 拥有两个路由 //features。在两者间切换是发生在同一个 heap 内的 普通 Vue Router 过渡,不涉及原生桥,因此可在下方的网页预览中实时运行。点击 Features (或页内按钮),可见路由在不打开新页面的情况下发生变化。

这一点超越了其他示例

Sparkling 的其他网页预览只渲染 UI —— 其原生调用在浏览器中是失效的。而这里堆内的路由过渡在 网页上确实可用,因为这一部分是纯粹的 Vue Router。

动态路由(users bundle)

users bundle 拥有 /users 与动态的 /users/:id。点击某个用户是带路由参数的堆内导航, 完全由该 bundle 自己的 router 解析。此预览从该 bundle 自身的默认路由(/users)启动。

跨页导航(MPA —— 请用二维码 / 真机标签页)

router.push 解析到另一个 bundle 拥有的路由(依据路由清单)时,shim 会将其转发到 router.open,从而压入一个新的原生容器。上一个页面仍存活于其下方,与原生导航栈完全一致。

<Go> 网页预览一次只渲染一个 bundle,且不提供 Sparkling 的原生方法桥(spkPipe 模块), 因此 router.open 无处可去。在上方预览中点击跨页按钮不会导航,而是显示一行提示 ("native navigation unavailable here — open on device")。要体验完整流程:

  • 扫描二维码,在(已集成 Sparkling 的)Lynx Explorer 中打开,router.open 会原生运行;或
  • 运行本地 web-shell harness,它提供方法桥并忠实模拟原生容器栈 —— 见 示例 README
为何堆内可用、跨页不可用

堆内导航是运行在卡片自身 JS heap 内的纯 Vue Router —— 没有原生调用 —— 因此在预览中可用。 跨页导航调用 router.open,需要一个原生 host。sparkling-navigation 暴露了可插拔的 RouterWebHost 供嵌入方提供 host,但 go-web 的预览目前没有暴露在其 <lynx-view> 上注册 该 host(或 spkPipe 桥)的钩子。而 web-shell 拥有整个页面,会自行安装该 host 与桥。

映射关系

Vue RouterSparkling
当前 bundle 拥有的路由堆内过渡(SPA)
其他 bundle 拥有的路由router.open(<scheme>) —— 新容器(MPA)
router.back() 越过本地历史router.close() —— 弹出容器
history.state通过 scheme URL 在 heap 之间传递
history 模式(createWebHistory 等)createHybridHistory 取代

Vue Router 完整特性集在 MPA 模型下的支持、重构与限制情况,参见 兼容性矩阵