全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

对于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里的调试结果如下:

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

通过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里的调试结果有时候能正确的输出如下:

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

那么我们就得需要解决加载顺序问题,保证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>

也能正确的输出结果。

总结

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

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

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


# 异步加载js文件  # js  # 同步异步加载  # js同步加载和异步加载  # JS异步加载的三种实现方式  # 详解JS异步加载的三种方式  # 浅析JS异步加载进度条  # JavaScript 脚本异步加载的几种实现方法  # 加载  # 多个  # 不无裨益  # 这是  # 很好  # 完成后  # 就能  # 也能  # 两种  # 可在  # 就得  # 很长  # 报错  # 再加  # 都做  # 也做  # 请参考  # 大家多多  # 正确地  # 文件合并 


相关文章: 如何选择适配移动端的WAP自助建站平台?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  简历在线制作网站免费版,如何创建个人简历?  高防服务器:AI智能防御DDoS攻击与数据安全保障  建站org新手必看:2024最新搭建流程与模板选择技巧  建站主机如何选?性能与价格怎样平衡?  如何高效利用200m空间完成建站?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何通过商城自助建站源码实现零基础高效建站?  如何快速搭建高效可靠的建站解决方案?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  制作网站公司那家好,网络公司是做什么的?  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  个人网站制作流程图片大全,个人网站如何注销?  建站之星安装提示数据库无法连接如何解决?  建站之星如何配置系统实现高效建站?  建站之星如何保障用户数据免受黑客入侵?  如何使用Golang table-driven基准测试_多组数据测量函数效率  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  如何通过商城免费建站系统源码自定义网站主题?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  c# await 一个已经完成的Task会发生什么  建站主机选择指南:服务器配置与SEO优化实战技巧  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  建站之星会员如何解锁更多建站功能?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  如何在万网自助建站中设置域名及备案?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  如何高效完成自助建站业务培训?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  建站之星Pro快速搭建教程:模板选择与功能配置指南  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  上海网站制作开发公司,上海买房比较好的网站有哪些?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  大型企业网站制作流程,做网站需要注册公司吗?  如何用腾讯建站主机快速创建免费网站?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  济南网站制作的价格,历城一职专官方网站?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  建站之星导航菜单设置与功能模块配置全攻略  小建面朝正北,A点实际方位是否存在偏差?  开封网站制作公司,网络用语开封是什么意思?  常州自助建站工具推荐:低成本搭建与模板选择技巧  如何在Windows 2008云服务器安全搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。