异步加载 JS 文件

export function loadScript(url, { crossOrigin = false } = {}) {
  return new Promise((resolve, reject) => {
    let script = document.createElement('script');
    script.type = 'text/javascript';
    script.async = 'async';
    script.loaded = false;

    if (crossOrigin) {
      script.crossOrigin = 'anonymous';
    }

    /*
         * onload 在其他浏览器中有效
         * onreadystatechange 在 IE 中有效
         */
    script.onload = script.onreadystatechange = function() {
      if (
        !this.readyState || // 其他浏览器
                /^(loaded|complete)$/.test(this.readyState) // IE
      ) {
        resolve();

        // avoid mem leaks in IE.
        script.onload = script.onreadystatechange = null;
      }
    };

    script.onerror = function() {
      reject(new Error(`script load error: ${url}`));

      // avoid mem leaks in IE.
      script.onerror = null;
    };

    script.src = url;
    document.getElementsByTagName('head')[0].appendChild(script);
  });
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38