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安全高效搭建个人网站?

