欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaScript文件的同步和异步加载的实现代码

程序员文章站 2022-05-14 19:09:50
对于js文件的引用,尽管当前有不少框架和工具(比如webpack,commonjs,requiresjs等)都做了很好的处理。但是抛开这些框架,了解原生的加载方式还是不无裨...

对于js文件的引用,尽管当前有不少框架和工具(比如webpack,commonjs,requiresjs等)都做了很好的处理。但是抛开这些框架,了解原生的加载方式还是不无裨益。本文简述一些js文件的同步和异步加载方式。

同步加载

可在html文件里以<script>标签插入,这是初学时最基本的方式。

准备两个js文件如下:

calc1.js

console.log('calc1 loading begin')

function add(...args) {
  return args.reduce((currenttotal, i) => currenttotal + i, 0);
}
console.log('calc1 loading end')

calc2.js

console.log('calc2 loading begin')

console.log(add(1,2,3))

console.log('calc2 loading end')

calc2.js 是依赖calc1.js的。

html文件如下:

<body>

  <script src="calc1.js">
  </script>
  
  <script src="calc2.js">
  </script>
</body>

这种方式下,文件加载是同步的。即calc1.js加载完成后,才加载calc2.js,所以保证了calc2.js总能正确地调用calc1里的add函数。在chrome里的调试结果如下:

JavaScript文件的同步和异步加载的实现代码

但同步加载的缺点也明显,如果有多个文件的时候,全部加载时间会很长,而且阻塞用户界面响应。

通过script element异步加载

异步加载的优点是,能够同时加载多个js文件,而且由于是异步,不会阻塞用户界面,用户体验好。当然缺点是,不能保证有依赖关系的文件的加载顺序。

html 代码

<head>
  <meta charset="utf-8">
  <title>title</title>
  <script type="text/javascript">
    var script1 = document.createelement('script');
    script1.src='calc1.js';
    script1.type='text/javascript';

    var script2 = document.createelement('script');
    script2.src='calc2.js';
    script2.type='text/javascript';

    document.getelementsbytagname('head')[0].appendchild(script1).appendchild(script2);
  </script>
</head>

在chrome里的调试结果有时候能正确的输出如下:

JavaScript文件的同步和异步加载的实现代码

但有时候由于clac1.js没有被先加载,calc2.js执行时会报错。

JavaScript文件的同步和异步加载的实现代码

那么我们就得需要解决加载顺序问题,保证calc1.js先加载。

<head>
  <meta charset="utf-8">
  <title>title</title>
  <script type="text/javascript">
    function loadscript(file, callbackfn) {
      var script = document.createelement('script');
      script.src= file;
      script.type='text/javascript';
      // 监听onload时间,当前js文件加载完成后,再加载下一个
      script.onload = callbackfn;
      document.getelementsbytagname('head')[0].appendchild(script)
    }
    
    loadscript('calc1.js', function () {
      loadscript('calc2.js');
    } );

  </script>
</head>

这样就能永远输出正确结果了。

通过 ajax 加载js文件
 

 <script>
    function loadscript(file, callbackfn) {
      var xhr = new xmlhttprequest();
      xhr.open('get', file, true);
      // for ie
      if (xhr.onreadystatechange) {
        xhr.onreadystatechange = function () {
          console.log(xhr.readystate, xhr.status);
          if (xhr.readystate == 4) {
            if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) {
              insertscripttext(xhr.responsetext);
              if (callbackfn) {
                callbackfn();
              }
            }
          }
        }
      } else {
        xhr.onload = function () {
          insertscripttext(xhr.responsetext);
          if (callbackfn) {
            callbackfn();
          }
        }
      }
      xhr.send(null);
    }

    function insertscripttext(scripttext) {
      var script = document.createelement('script');
      script.type = 'text/javascript';
      script.text = scripttext;
      document.body.appendchild(script);
    }

    loadscript('calc1.js', function () {
      loadscript('calc2.js');
    });

  </script>

也能正确的输出结果。

JavaScript文件的同步和异步加载的实现代码

总结

如果是单一或少数js文件,可以在html body的最后插入script标签,以同步方式加载。webpack其实也是把多个js文件合并称一个,然后在body插入script引用。

如果是多个js文件,建议异步加载,以避免阻塞界面渲染,也缩短整体加载时间。本文介绍了script element和ajax两种方式,并且对于有依赖关系的文件加载顺序,也做了实例。请参考 https://github.com/jackiege/js-learn/tree/master/ch1-async-loading

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。