Single SPA 如何监听 URL 变化

single-spa 6.x 使用 popstate 事件和 hashchange 事件来监听浏览器 URL 的变化,并且它还会拦截链接点击和表单提交事件来确保 URL 变化时能够正确处理路由。

当你调用 start() 方法时,single-spa 会设置事件监听器来监听 URL 的变化,并在变化时根据注册的应用和活动函数判断哪些应用需要被加载、挂载或卸载。

以下是一个使用 single-spa 6.x 的基本代码示例,说明了 single-spa 如何配置和启动,以及如何注册应用并监听 URL 的变化:

javascript 复制代码
import { registerApplication, start } from 'single-spa';

// 注册子应用,提供加载函数和活动条件
registerApplication({
  name: 'app1',
  app: () => System.import('app1'), // 加载子应用的函数
  activeWhen: location => location.pathname.startsWith('/app1'),
});

registerApplication({
  name: 'app2',
  app: () => System.import('app2'), // 加载子应用的函数
  activeWhen: ['/app2'], // 活动条件,可以是字符串、函数或者数组
});

// 启动 single-spa
start();

在这个例子中,registerApplication 用于注册两个子应用 app1app2activeWhen 参数定义了子应用何时应该被激活,这里是当 URL 路径以 /app1/app2 开头时。

single-spa 的 start 函数会设置好监听 URL 变化的逻辑,但是 single-spa 本身的源码中是如何设置的呢?下面是一个简化的示例,说明 single-spa 是如何内部设置这些监听器的:

javascript 复制代码
function urlReroute() {
  // 此函数负责检查当前活动的应用,并根据需要加载、挂载或卸载它们
}

// 监听 popstate 事件
window.addEventListener('popstate', urlReroute);

// 监听 hashchange 事件(如果你的应用使用了 hash 路由)
window.addEventListener('hashchange', urlReroute);

// 拦截所有的链接点击事件
window.addEventListener('click', function(event) {
  // 检查点击事件是否应该导致路由切换,并在必要时调用 urlReroute
});

// 拦截表单提交事件
window.addEventListener('submit', function(event) {
  // 检查表单提交是否应该导致路由切换,并在必要时调用 urlReroute
});

在实际的 single-spa 库中,上述逻辑会更加复杂,因为它需要处理许多边缘情况和浏览器兼容性问题。不过,上面的代码给出了如何使用原生 JavaScript 事件监听器来监听 URL 变化的大致思路。实际上 single-spa 还封装了这些逻辑,并提供了一些配置选项来优化性能和行为。

请注意,single-spa 的实际源码会更加复杂,并包含许多额外的检查和处理流程,上面的代码仅仅是一个说明性的简化版。

相关推荐
蓝莓味的口香糖1 小时前
【vue】初始化 Vue 项目
前端·javascript·vue.js
aikongmeng1 小时前
【Ai】Claude Code 初始化引导
javascript
光影少年2 小时前
数组去重方法
开发语言·前端·javascript
我命由我123452 小时前
浏览器的 JS 模块化支持观察记录
开发语言·前端·javascript·css·html·ecmascript·html5
weixin_443478512 小时前
Flutter第三方常用组件包之路由管理
前端·javascript·flutter
武藤一雄2 小时前
C# 异步回调与等待机制
前端·microsoft·设计模式·微软·c#·.netcore
啥都不懂的小小白2 小时前
前端CSS入门详解
前端·css
林恒smileZAZ3 小时前
前端大屏适配方案:rem、vw/vh、scale 到底选哪个?
开发语言·前端·css·css3
QQ5110082853 小时前
基于区块链的个人医疗咨询挂号信息系统vue
前端·vue.js·区块链
程序员小寒5 小时前
JavaScript设计模式(八):命令模式实现与应用
前端·javascript·设计模式·ecmascript·命令模式