AMD 和 CMD 交换机和路由器的区别别有哪些

区分几种模块加载器(AMD,CMD...) - 简书
区分几种模块加载器(AMD,CMD...)
异步加载是现在已经不是一个热门的话题了。 虽然不热门了,但他更成为了每一个JSer的基本功。 再次看玉伯博客上推seajs的文章和第一次看的心情已经大有不同。特别是玉伯博客 。
我学习seajs已经是3年前的时候了,还记得当时看到异步加载觉得很NB。看了那篇文章后觉得seajs ‘as lazy as possible' 明显比requirejs 要好...现在看看评论区大家就知道两个东西真正的区别了。
用更科学的方式来区分amd(requirejs), cmd(seajs), commonJS
首先站在框架设计者的角度,思考一个模块加载器要做什么事
0、分析模块代码依赖的文件1、下载文件2、 JS加载文件
现在我们考虑一种seajs和commonJS中的场景
require('b');
require('c');
上面代码 b和c 只有一个会执行。 那么我们这两个文件是否都需要去下载?
动手实践发现seaj 把两个文件都下载了。 但只加载了一个文件。commonjs因为不需要考虑下载,文件都在本地。所以自然是同步执行代码,用到了再去本地加载执行。
再看requireJS的场景
require(['b','c'], function(b,c){
if( flag ){
在动手得知, requirejs也是都下载了2个文件,并且b和c都被JS加载了。
这里的加载指的是b和c在使用到之前已经是一个对象。而在seajs中 到 var b = require('b') ;这行之前 b文件只是一个字符串。
requirejs转化为seajs相当于
require('b');
var c = require('c');
1000行代码
这两个的区别现在就显而易见了。 requirejs 在模块被使用到之前就先准备好。 seajs在用到的时候再去准备模块。
这里我们可以发现seajs 比 requirejs 少做了没用的事,更有效率。
但是我们再考虑一种特殊情况比如c模块中如果会报错。那requirejs在一开始就 抛出了错误。而seajs在执行到的时候抛出错误。但是! 注意那1000行代码。 如果c报错了, 那1000行代码还有必要执行吗?我们还能回滚那1000行代码吗?
这里我们就真正理解了requirejs这样设计的原因。seajs用好了能更加极致,用不好就会出上面这种可怕的错误。
现在我们已经知道设计一个模块加载器要做什么和需要注意的点了。让我们做个整理。
如果在node端不需要下载文件。 我们则让代码同步加载 即Commonjs。
如果在浏览器端, 则都需要提早下载文件, 执行到一半去下载1秒钟这可不行。当然我们可以提供异步下载的实现, require.async 。下载完文件后是否应该先提前准备模块? 是 AMD, 否CMD。
希望看完你可以知道你需要哪一种了。AMD/CMD与前端规范 - 推酷
AMD/CMD与前端规范
这些规范的目的都是为了
JavaScript的模块化开发
,特别是在浏览器端的。目前这些规范的实现都能达成浏览器端模块化开发的目的。
有更详细的说明,
对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。
CMD 推崇依赖就近,AMD 推崇依赖前置。
CMD推崇依赖就近,可以把依赖写进你的代码中的任意一行, 如
define(function(require, exports, module) {
var a = require('./a');
a.doSomething();
var b = require('./b');
b.doSomething();});
AMD是依赖前置的,换句话说,在解析和执行当前模块之前,模块作者必须指明当前模块所依赖的模块。如
define(['./a','./b'],function(a,b) {
a.doSomething()
b.doSomething()});
代码一旦运行到此处,能立即知晓依赖。而无需遍历整个函数体找到它的依赖,因此性能有所提升,缺点就是开发者必须显式得指明依赖——这会使得开发工作量变大。比如,当你写到函数体内部几百上千行的时候,忽然发现需要增加一个依赖,你不得不回到函数顶端来将这个依赖添加进数组。
硬依赖与软依赖
if (status) {
a.doSomething();}
体中,可能依赖
,也可能不依赖
,这种可以称之为
对于软依赖的处理,我推荐依赖前置+回调函数的实现形式。如,
if(status){
async(['a'],function(a){
a.doSomething()
对于硬依赖(强依赖),如果要性能优先,则考虑参照依赖前置的思想设计你的模块加载器,我个人也更推崇这个方案一些;如果考虑开发成本优先,则考虑按照依赖就近的思想设计你的模块加载器。对于弱依赖,只需要将弱依赖的部分改写到回调函数内即可。
CommonJS规范
CommonJS介绍
CommonJS是服务端模块的规范,Node.js采用了这个规范。
根据CommonJS规范,一个单独的文件就是一个模块。加载模块使用
方法,该方法读取一个文件并执行,最后返回文件内部的
对象。如下代码:
console.log(&evaluating example.js&);var invisible = function () {
console.log(&invisible&);};exports.message = &hi&;exports.say = function () {
console.log(message);};
使用require方法,加载example.js。
var example = require('./example.js');
这时,变量
就对应模块中的
对象,于是就可以通过这个变量,使用模块提供的各个方法。
message: &hi&,
say: [Function]}
require方法默认读取js文件,所以可以省略js后缀名。
var example = require('./example');
js文件名前面需要加上路径,可以是相对路径(
相对于使用require方法的文件
),也可以是绝对路径。如果省略路径,node.js会认为,你要加载一个核心模块,或者已经安装在本地 node_modules 目录中的模块。如果加载的是一个目录,node.js会首先寻找该目录中的
package.json
文件,加载该文件
属性提到的模块,否则就寻找该目录下的
最简单的例子
下面的例子是使用一行语句,定义一个最简单的模块。
// addition.jsexports.do = function(a, b) {
return a + b};
上面的语句定义了一个加法模块,做法就是在
对象上定义一个
方法,那就是供外部调用的方法。使用的时候,只要用
函数调用即可。
var add = require('./addition');add.do(1,2) // 3
稍微复杂的例子
再看一个复杂一点的例子。
// foobar.jsfunction foobar(){
this.foo = function(){
console.log('Hello foo');
this.bar = function(){
console.log('Hello bar');
};}exports.foobar =
调用该模块的方法如下:
var foobar = require('./foobar').foobar,
test = new foobar();test.bar(); // 'Hello bar'
有时,不需要
返回一个对象,只需要它返回一个函数。这时,就要写成
module.exports
module.exports = function () {
console.log(&hello world&)};
AMD规范与CommonJS规范的兼容性
CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。
AMD规范则是非同步加载模块,允许指定回调函数
由于Node.js主要用于服务器编程,模块文件一般都已经存在于本地硬盘,所以加载起来比较快,不用考虑非同步加载的方式,所以CommonJS规范比较适用。但是,如果是浏览器环境,要从服务器端加载模块,这时就必须采用非同步模式,因此浏览器端一般采用AMD规范。
AMD规范使用define方法定义模块,下面就是一个例子:
define(['package/lib'], function(lib) {
function foo() {
lib.log('hello world!');
AMD规范允许输出的模块兼容CommonJS规范,这时define方法需要写成下面这样:
define(function( require, exports, module )
var someModule = require( &someModule& );
var anotherModule = require( &anotherModule& );
someModule.doTehAwesome();
anotherModule.doMoarAwesome();
exports.asplode = function() {
someModule.doTehAwesome();
anotherModule.doMoarAwesome();
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致js的模块加载规范amd cmd 有什么区别,网上看了一些资料,不是太明白 - CNode技术社区
积分: 6460
这家伙很懒,什么个性签名都没有留下。
貌似nodejs var xx=require(‘xx’) 这种是cmd
强烈推荐@玉伯 的文章, &&前端模块化开发那点历史&&
注意 Node 是属于 CommonJS, AMD 是分支, CMD 是国人搞出来的分支
AMD 和 CMD 都是主要为前端设计的规范, 和 Node 有分裂, 当然目的都是好的
AMD 主要是 RequireJS 社区的规范, 英文社区的
CMD 是 SeaJS 的, 主要语言是中文, 可以直接去 Github 看
其实感觉CMD比较无聊,CMD文件合并之后,还是AMD。
印象里在 AMD 规范里看到过一种省略写法, 看起来和 CMD 一模一样
实用性你觉得怎么样呢?
这货写的很奇怪,把js路径硬编码到模块文件中去了
如果项目目录调整了怎么办?
RequireJS 吗?.. 因为没错发布都需要重新编译啊
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的}

我要回帖

更多关于 交换机和路由器的区别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信