xdomain 出现的背景
由于浏览器的同源策略,跨域请求需要做额外的配置才能工作。
CORS 是一个通用的解决方案,唯一缺点是低版本浏览器(< IE 9)不支持。低版本 IE 支持一个私有的 XDomainRequest,是个鸡肋 —— 如不能带 cookie。
如果需要兼容 IE 9 以下, 需要另外一种方案来实现跨域请求。xdomian 便是其中一种。
xdomain 实现原理
xodomain 本质是利用 iframe 和 postMessage 技术来实现跨域请求的。
以一个请求为例。localhost:8000 请求 localhost:58000 的 api。
1 | // localhost:8000 的 index.html |
localhost:58000 proxy.html:
1 | <!doctype html> |
完整测试用例在这里。
xdomain 的思路是:1
2
3
41. 在 localhost:8000 建立一个 `**iframe**`, 指向 localhost:58000 的一个页面,通常是 proxy.html。
2. 当 a 向 b 发起请求时,将请求转给 localhost:58000/proxy.html 来真正发起,避免跨域问题。
3. 最后结果从 /proxy.html 传递给 localhost:8000。
4. 通过 xhook,将返回最终传递给 a 的请求。
这里涉及到的消息传递通过 **postMessage*
(兼容 IE8) 来实现。
如果将 localhost:8000 称为 master, localhost:58000称为 slave。那么通常一个经过代理的请求消息传递如下:
1 | 0. master 和 slave 各建立一个 socket。 |
注意在第7条中, xhr-event 是 proxy.html 发 ajax 触发一系列请求过程的消息转发。通过 xhook 控制 master 的 beforeXHR 将数据最终放到 master 的 请求 response 里。
其他
xdomian 实现了一套自己的通信协议。并且主从代码打在了一起。从设计到实现都很精妙。
xdomain 作者不推荐 CORS,理由 有点站不住脚。通常只需要在 IE 9 以下 做兼容。
1 | <!--[if lte IE 9]> |
- 面向事件编程代码难以阅读。很难理清楚各个事件的顺序,以及调用关系。个人感觉可以通过事件代码汇总,文档来降低复杂度。
参考链接
ISSUE
有问题?来 github 一起讨论。