对于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小时内与您取得联系。