moduleA.js 代码html
console.log("I'm A"); /* 此处能够放jquery源码 使得该文件变大,以便异步加载时看效果 */
moduleB.js 代码jquery
console.log("I'm B");
同步加载app
<body> <script src="moduleA.js" onload="console.log('A loaded')"></script> <script src="moduleB.js" onload="console.log('B loaded')"></script> </body>
输出异步
I'm A A loaded I'm B A loaded
defer
:在文档完成解析后,触发 DOMContentLoaded 事件前执行。若是缺乏 src 属性(即内嵌脚本),该属性不该被使用,由于这种状况下它不起做用。对动态嵌入的脚本使用 async=false
来达到相似的效果。async
async
:是否在容许的状况下异步执行该脚本。该属性对于内联脚本无做用 (即没有src属性的脚本)。ui
<body> <script defer src="moduleA.js" onload="console.log('A loaded')"></script> <script src="moduleB.js" onload="console.log('B loaded')"></script> </body>
输出url
I'm B B loaded I'm A A loaded
异步加载code
<body> <script> loadScript("moduleA.js", "async A loaded"); loadScript("moduleB.js", "async B loaded"); function loadScript(url, text) { var srcEle = document.createElement("script"); srcEle.src = url; srcEle.async = true; srcEle.onload = function () { console.log(text); }; document.body.appendChild(srcEle); } </script> </body>
动态建立的script标签,async默认为true;
输出htm
I'm B async B loaded I'm A async A loaded
相同之处:事件
不一样之处
RequireJS的标准
特色:依赖前置、预执行
define(['./a', './b'], function(a, b) { //运行至此,a.js和b.js已经下载完成 //a模块和b模块已经执行完 a.doing(); b.doing(); });
SeaJS的标准
特色:依赖就近、懒执行
define(function(require, exports, module) { var a = require("./a"); //等待a.js下载、执行完 a.doing(); var b = require("./b"); //等待b.js下载、执行完 b.doing(); });