关于乾坤加载子应用导致跨域?

问题: 加载百度地图 sdk 导致跨域

由此联想到的问题, 为什么乾坤可以劫持很多请求, 子应用的js和css资源加载都会被拦截到 ?

通常加载 script 的方式

  • 通过script标签
  • 通过动态创建 script 插入 html
    以上两种方式都不会造成跨域, 在 chrome 里面两者的请求归属于 js 资源, 并不是 fetch/xhr,

乾坤在请求子应用的时候, 会先拿到子应用的字符串, 经过一系列的处理将 js, css 等分类, 然后自行去请求相应的资源, 而请求资源的方式是通过 fetch api 来拿到资源的, 像 js 这种资源, 拿到字符串后会通过 eval 来执行代码字符,以此来注入相应的sdk或者插件, 在请求的过程中又做了请求劫持的操作, 所以造成了跨域的问题

乾坤加载子应用的方式(只说 加载 js 资源)

export function getExternalScripts(
  scripts,
  fetch = defaultFetch,
  errorCallback = () => {}
) {
  const fetchScript = (scriptUrl) => {
    // 通过fetch 获取js资源,如果有缓存从缓存拿
    // 略
  };

  return Promise.all(
    scripts.map((script) => {
      if (typeof script === "string") {
        if (isInlineCode(script)) {
          // 获取内联的js code
          return getInlineCode(script);
        } else {
          // fetch 获取外联的js code
          return fetchScript(script);
        }
      } else {
        // 上面说过了,processTpl 方法会处理各种js css资源,其中对于需要异步执行的js资源会打上async标识
        // 打上async标识的js资源,会使用requestIdleCallback延迟执行
        const { src, async } = script;
        if (async) {
          return {
            src,
            async: true,
            content: new Promise((resolve, reject) =>
              requestIdleCallback(() => fetchScript(src).then(resolve, reject))
            ),
          };
        }

        return fetchScript(src);
      }
    })
  );
}
posted @ 2022-11-23 22:23  阿臻  阅读(1037)  评论(0编辑  收藏  举报