commonjs 是服务器端的规范
requirejs 采用 amd
-
4月10号粗略的看了下requirejs的源码 发现它主要是在浏览器加载js用的 而且 主要是创建 script的标签 然后监听 onreadystatechange事件 来判断是否load 但是有一个问题 load了就代表本地代码执行了么 ?
-
团队解答:
js在下载的时候 接下来就是执行 下载完了 并不会马上触发 onreadystatechange 因为 js是单线程 所以会把主线程的任务都执行完了 才会释放控制权 去检查异步线程队列是否可执行 所以 下载执行都在主线程里 相当于说 onreadystatechange的load
事件也可以代表说 下载执行完成了
特点:依赖前置 加载模块前 先加载依赖
加载了js export就存在在内存里了 即是下一个文件还依赖 这个js 也不会在去加载 而是直接去内存里去调用这个对象
// AMD
define(['a', 'b'], function(a, b) {
a.doSomething();
b.doSomething();
})
seajs 采用 cmd
特点: cmd推崇依赖就近,延迟执行
// CMD
define(function(require, exports, module) {
var a = require('./a');
a.doSomething();
var b = require('./b');
b.doSomething();
})
共同点:
1.cmd和amd 都是预加载依赖js
区别:
1.调用和声明依赖的地方不同。
AMD和CMD都是用difine和require,但是CMD标准倾向于在使用过程中提出依赖,就是不管代码写到哪突然发现需要依赖另一个模块,那就在当前代码用require引入就可以了,规范会帮你搞定预加载,你随便写就可以了。但是AMD标准让你必须提前在头部依赖参数部分写好(没有写好? 倒回去写好咯)。这就是最明显的区别。
浏览器的加载规范之UMD
由于CommonJS是服务器端的规范,跟AMD、CMD两个标准实际不冲突
当我们写一个文件需要兼容不同的加载规范的时候怎么办呢,看看下面的代码。
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['jquery', 'underscore'], factory);
} else if (typeof exports === 'object') {
// Node, CommonJS之类的
module.exports = factory(require('jquery'),
require('underscore'));
} else {
// 浏览器全局变量(root 即 window)
root.returnExports = factory(root.jQuery, root._);
}
}(this, function ($, _) {
// 方法
function a(){}; // 私有方法,因为它没被返回 (见下面)
function b(){}; // 公共方法,因为被返回了
function c(){}; // 公共方法,因为被返回了
// 暴露公共方法
return {
b: b,
c: c
}
}));
参考文章
网友评论