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

发布时间 - 2026-01-11 02:52:20    点击率:

对于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 脚本异步加载的几种实现方法  # 加载  # 多个  # 不无裨益  # 这是  # 很好  # 完成后  # 就能  # 也能  # 两种  # 可在  # 就得  # 很长  # 报错  # 再加  # 都做  # 也做  # 请参考  # 大家多多  # 正确地  # 文件合并 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在香港免费服务器上快速搭建网站?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  大连网站制作公司哪家好一点,大连买房网站哪个好?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  详解阿里云nginx服务器多站点的配置  如何快速生成专业多端适配建站电话?  Laravel如何为API编写文档_Laravel API文档生成与维护方法  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  微信小程序 canvas开发实例及注意事项  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  php打包exe后无法访问网络共享_共享权限设置方法【教程】  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  如何快速配置高效服务器建站软件?  详解jQuery停止动画——stop()方法的使用  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  JavaScript如何操作视频_媒体API怎么控制播放  JavaScript如何实现路由_前端路由原理是什么  C++时间戳转换成日期时间的步骤和示例代码  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  如何快速重置建站主机并恢复默认配置?  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  如何确认建站备案号应放置的具体位置?  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  如何在建站宝盒中设置产品搜索功能?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  三星网站视频制作教程下载,三星w23网页如何全屏?  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  实现点击下箭头变上箭头来回切换的两种方法【推荐】  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Java解压缩zip - 解压缩多个文件或文件夹实例  教你用AI润色文章,让你的文字表达更专业  EditPlus中的正则表达式 实战(2)  如何在阿里云香港服务器快速搭建网站?  文字头像制作网站推荐软件,醒图能自动配文字吗?  如何续费美橙建站之星域名及服务?  如何生成腾讯云建站专用兑换码?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  HTML 中动态设置元素 name 属性的正确语法详解  Android GridView 滑动条设置一直显示状态(推荐)  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Laravel怎么使用artisan命令缓存配置和视图  高防服务器:AI智能防御DDoS攻击与数据安全保障  如何用5美元大硬盘VPS安全高效搭建个人网站?