JavaScript模块化编程 - CommonJS, AMD 和 RequireJS之间的关系
这几天在学习CommonJS的时候突然在StackOverflow上搜索到一个非常好的一个帖子,是关于CommonJS, AMD和RequireJS之间的关系的问答贴。我感觉写的非常好,鉴于没有找到相关的中文文章,特意翻译过来一下和大家分享一下。

先说说CommonJS
CommonJS - 大家是不是觉得JavaScript仅仅是一个客户端的编译语言,其实JavaScript设计之初不仅仅是针对客户端设计的语言。后来只是由于Web的迅速流行,加之Netscape和微软之间之争过早的将JavaScipt标准化。要了解详细的JS历史请查看:http://zh.wikipedia.org/zh-cn/JavaScript。过早的标准化JS就导致JS的诸多缺陷和标准类库的缺乏,即使这样也不影响JS成为一门优秀的编程语言(比如现在非常流行的Node.js)。目前JS仅仅包括基本的API,如果要作为一个server端的编程语言,像IO, FS, i18n, package等等特性都没有,CommonJS是一个组织,它让JS可以在共同的方向上做努力,来完善JS。尽量Common JS现在还没有一个正式版发布,但是很多方向的草案的实现都已经取得很好的成果。例如现在非常流行的Node.js。
再回到本文的主题来,CommonJS和AMD,RequireJS有什么关系呢?原来CommonJS其中就有一个Modules规范,我们都像JS现在这样所有东西都写在一个文件中来写server端应用是一件非常困难的事情,它就是来解决JS没有模块化管理代码的功能。关键部分就二个函数:
- require - 用来引入依赖
- export - 用来导出模块,包括标识符(identifier)和模块内容(contents)
CommonJS并没有只是一个规范,就像Java中的Interface一样,并没有注明你应该怎么实现。
问题在于CommonJS的这个Modules规范设计之初是为了server端设计的,它是一个同步的模式。但是这种模式并不适合于浏览器端,大家设想一下如果浏览器同步模式一个一个加载模块,那么打开将会变得非常的慢,所以AMD就是为了这个诞生,它最大的特点就是可以异步的方式加载模块,具体的不同在于AMD有一个define函数,它可以让当前模块运行时先加载当前模块所依赖的模块,例如以下定义的意义就是在运行function时先加载依赖的module, dependency, array模块。
define('module/id/string', ['module', 'dependency', 'array'],
function(module, dependency, array) {
return ModuleContents;
});
所以说CommonJS Module和AMD都是JS模块化定义的API,出自相同的起源的,就是可以让JS可以模块化加载。
那么RequrieJS其实就是AMD现在用的最广泛,最流行的实现。在RequireJS网站上的介绍其实也有说明RequireJS诞生的原因,只是当时我并没有看懂。
RequireJS is a JavaScript file and module loader. It is optimized for in-browser use, but it can be used in other JavaScript environments, like Rhino and Node. Using a modular script loader like RequireJS will improve the speed and quality of your code.
从以上基本可以看清CommonJS(泛指Modules规范),AMD和RequireJS之前的关系了。简单的来讲CommonJS Modules和AMD都是为了解决JS模块化的规范API,CommonJS更适合于Server端,而AMD基本是用于浏览器端(不过它也可以用于Server端,比如Node loader的方向的努力:http://requirejs.org/docs/node.html),而RequireJS就是AMD最流行的实现。
原文地址在:http://stackoverflow.com/questions/16521471/relation-between-commonjs-amd-and-requirejs
JavaScript模块化编程 - CommonJS, AMD 和 RequireJS之间的关系的更多相关文章
- 【JavaScript】JavaScript模块化编程 - CommonJS, AMD 和 RequireJS之间的关系
通行的Javascript模块规范共有两种:CommonJS和AMD 先说说CommonJS CommonJS - 大家是不是觉得JavaScript仅仅是一个客户端的编译语言,其实JavaScr ...
- CommonJS, AMD 和 RequireJS之间的关系(转载)
先说说CommonJS CommonJS - 大家是不是觉得JavaScript仅仅是一个客户端的编译语言,其实JavaScript设计之初不仅仅是针对客户端设计的语言.后来只是由于Web的迅速流行, ...
- JavaScript模块化演变 CommonJs,AMD, CMD, UMD(一)
原文链接:https://www.jianshu.com/p/33d53cce8237 原文系列2链接:https://www.jianshu.com/p/ad427d8879cb 前端完全手册: h ...
- Javascript模块化编程(二)AMD规范(规范使用模块)
这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块,先想一想,为什么模块很重要?接下来为您详细介绍,感兴趣的朋友可以了解下啊.今天介绍如何规范地使用模块. 七.模块 ...
- Javascript模块化编程:AMD规范及require.js用法【转】 - loheonly的笔记 - 前端网(W3Cfuns)
http://www.w3cfuns.com/blog-5425789-5399326.html
- javascript模块化编程:CommonJS和AMD规范
AMD规范,异步模块定义.与CommonJS规范齐名并列. 作用都是利于JavaScript的模块化编程. 模块化编程的好处就是: 1.可重用 2.独立 3.能解决加载的依赖性问题 4.能解决重复加载 ...
- JavaScript模块化编程之AMD - requireJS基础使用
JavaScript模块化编程之AMD requireJS基础使用 标签(空格分隔): JavaScript 参考文章 AMD规范 AMD是"Asynchronous Module Defi ...
- javascript模块化之CommonJS、AMD、CMD、UMD、ES6
javascript模块化之CommonJS.AMD.CMD.UMD.ES6 一.总结 一句话总结: CommonJS是同步加载模块,用在服务端:AMD是异步加载模块,用于浏览器端 1.为什么服务器端 ...
- Javascript模块化编程(二):AMD规范
Javascript模块化编程(二):AMD规范 作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2012/10/asynchronous_module_d ...
随机推荐
- 不在界面上用控件 动态创建idhttp,IdAntiFreeze来用
不在界面上用控件 动态创建idhttp,IdAntiFreeze来用 var IdHTTP: Tidhttp; IdAntiFreeze: TidAntiFreeze; begin IdAntiFre ...
- 转:C语言申请内存时堆栈大小限制
一直都有一个疑问,一个进程可以使用多大的内存空间,swap交换空间以及物理内存的大小,ulimit的stack size对进程的内存使用有怎样的限制?今天特亲自动手实验了一次,总结如下: 开辟一片内存 ...
- 转:SRIO错误侦测和管理机制
http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/22879.aspx http://www.deyi ...
- Android录音服务
MediaRecorder Mediarecorder=new MediaRecorder();//创建一个MediaRecorder对象 Mediarecorder.setAudioSource(M ...
- 读<<如何阅读一本书>>乱七八糟的笔记1
阅读层次 第一层:基础阅读 第二层:检视阅读 系统化略读 第三层:分析阅读 第四层:主题阅读(比较阅读) 第二层:检视阅读 1.有系统的粗读或略读 (1)先看书名页,然后如果有序就先看序 (2)研究目 ...
- linux mount命令学习
我们在下面这篇博文中已经有笼统的学习了文件系统的一些相关知识, http://blog.csdn.net/boyxulin1986/article/details/12107113 本篇我们主要是用来 ...
- 计算N!的质因数2的个数
容易得出N!质因数2的个数 = [N / 2] + [N / 4] + [N / 8] + .... 下面通过一个简单的例子来推导一下过程:N = 10101(二进制表示)现在我们跟踪最高位的1,不考 ...
- MyEclipse 10.x中拓展自动提示功能
原文转自:MyEclipse 10.7中拓展自动提示功能 在myeclipse 9以前的版本中,我们如果要为html编辑器添加自动的代码提示可以这样操作: 1.windows-->prefere ...
- 字符流;字节流;带缓冲的输入输出流;以及用scanner读文件
概念: InputStream类是字节输入流的抽象类,是所有字节输入流的父类. OutputStream类是字节输入流的抽象类,是所有字节输出流的父类. In(可以理解为读)Out(可以理解为写) 一 ...
- Mongodb 条件查询
1.1 查询出所有数据的指定键(name ,age ,country) db.persons.find({},{name:1,age:1,country:1,_id:0}) 2.查询条件 2.查询条件 ...