在两个ExtJS应用之间传递数据的最优实现方式是什么?
现有实现问题修正
你当前的代码存在语法错误+逻辑错误:首先变量名写错(myOb声明后存的时候用了muObj),其次sessionStorage仅支持存储字符串,直接存入对象会被默认转为[object Object],无法正常读取原始数据。修复后的基础用法如下:
// 存数据:先序列化对象为JSON字符串 const myObj = {"key1" : "value1","key2" : "value2"} sessionStorage.setItem('objectData', JSON.stringify(myObj)); // 取数据:反序列化回原始对象 const getTransferData = JSON.parse(sessionStorage.getItem('objectData')); // 用完清除 sessionStorage.removeItem('objectData');
不同场景下的最优方案选择
根据你的两个ExtJS应用的部署/加载方式,选择对应适配的方案即可:
场景1:两个应用在同一个页面上下文加载(无页面跳转,仅同页渲染两个ExtJS应用实例)
- 首选:Ext全局事件总线
这是同页跨应用通信的最优解,无冗余存储,耦合度极低:// appA 发送数据 Ext.GlobalEvents.fireEvent('crossAppTransfer', {key1: 'value1', key2: 'value2'}); // appB 监听接收数据 Ext.GlobalEvents.on('crossAppTransfer', (data) => { // 此处处理拿到的数据即可 console.log(data); }, {single: true}); // 加single参数可实现单次监听后自动销毁,无需手动解绑 - 次选:Ext全局命名空间挂载变量
仅适用于需要长期复用的非敏感数据:
弊端是页面刷新后数据会丢失,仅同页生效。// 存数据,挂载到Ext自带的全局命名空间避免和其他全局变量冲突 Ext.crossAppData = Ext.crossAppData || {}; Ext.crossAppData.userInfo = {key1: 'value1', key2: 'value2'}; // 取数据 const data = Ext.crossAppData?.userInfo; // 用完清空 delete Ext.crossAppData.userInfo;
场景2:两个应用跨页面跳转加载(同域名下)
- 首选:修复后的sessionStorage方案
就是你原本的思路,修复序列化问题后即可正常使用,优势是实现简单,跳转后数据不会丢失,用完即删也不会有数据残留风险。
注意事项:不要存敏感数据(用户可通过开发者工具查看修改存储内容),单条存储数据不要超过5MB。
场景3:两个应用跨域名部署
上述同源方案全部失效,优先用postMessage实现跨域通信:
// appA 发送方(打开appB页面后发消息) const appBWindow = window.open('https://你appB的部署域名.com'); appBWindow.postMessage({key1: 'value1', key2: 'value2'}, 'https://你appB的部署域名.com'); // 第二个参数严格指定目标域名,不要用*避免安全风险 // appB 接收方 window.addEventListener('message', (event) => { // 必须校验发送方来源,防止恶意数据注入 if (event.origin !== 'https://你appA的部署域名.com') return; const transferData = event.data; // 处理数据逻辑 });
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

