js ajax同步和异步的,JavaScript文件的同步和异步加载

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

同步加载

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

准备两个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文件如下:

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

bVTeT9?w=181&h=94

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

通过Script Element异步加载

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

html 代码

Title

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);

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

bVTeT9?w=181&h=94

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

bVTeTR?w=328&h=90

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

Title

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');

} );

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

通过 AJAX 加载JS文件

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');

});

也能正确的输出结果。

bVTeT9?w=181&h=94

总结

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值