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 用于注册两个子应用 app1 和 app2。activeWhen 参数定义了子应用何时应该被激活,这里是当 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 的实际源码会更加复杂,并包含许多额外的检查和处理流程,上面的代码仅仅是一个说明性的简化版。

相关推荐
架构技术专栏23 分钟前
Agent 工具调用:从工具声明到执行反馈
前端·人工智能·后端
别动我齐刘海1 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
志尊宝2 小时前
Vue3 零基础每日笔记(071):暗黑模式与主题切换——CSS 变量 + Element Plus 暗黑方案
前端·css·笔记·vue·html·前端开发·软件开发
刘发财2 小时前
前端如何生成10000页PDF文件?
前端·javascript·开源
A接拉起0073 小时前
2026 年 JavaScript 开发者需要了解的知识
前端·javascript·后端
_馒头3 小时前
pixiJs游戏开发实践 - 跳棋小游戏
javascript·vue.js
用户11481867894843 小时前
面试官:大屏项目里十几个模块同时渲染上万条数据,怎么做到不卡?
前端·性能优化
前端市界3 小时前
Pro React Admin: 统一工程底座,承载多种应用...
前端·github
葡萄城技术团队3 小时前
dsh-spreadjs-editor 当前支持什么:安装前需要了解的几件事
前端
三*一4 小时前
优化修整算法
前端·javascript·算法