CommonJS Module 规范

CommonJS 的模块化规范描述在Modules/1.1.1 中

目前实现此规格的包有:

Yabble,CouchDB,Narwhal (0.2), WakandaTeaJS (formerly v8cgi)CommonScriptPINF JS LoaderSeaJSArangoDBsorrow.js

注意,这里并没有找到 requireJS,因为它使用的是AMD规范。

此规范定义的具体内容包括:

  • Require
    require是一个function。这个function接收一个模组的标识,返回外部模组的接口。如果有循环依赖的话,因为需要一个传递依赖,外部模组就不会立即执行;in this case, the object returned by "require" must contain at least the exports that the foreign module has prepared before the call to require that led to the current module's execution.
    如果请求的模组不能被返回,require需要抛出异常。
    require 函数必须有 "main"属性。
    必须有"paths" attribute.
  • Module Context
    在一个模组中,有一个"require"的自由变量。
    有一个"exports"的自由变量。
    必须有一个"module"的对象变量
  • Module Identifiers
    模组标识是正斜杠区隔的字符串短语。
    短语使用驼峰法,“.”,“..”命名
    模块的标识可以是“相对的”或“顶层”的。
    顶层标识解决概念性模组的命名
    相对标识符被解决相对的标识符模块。
  • Unspecified
    此规范遗留了一些互操作不确定性的要点:
    是否模块需存储数据库,文件系统,工厂功能模块,互换的链接库?
    路径是否被模组加载器支持来解决模块标识的问题?

看一下依此规范定义和使用的例子:
math.js

  1. exports.add = function() {
  2. var sum = 0, i = 0, args = arguments, l = args.length;
  3. while (i < l) {
  4. sum += args[i++];
  5. }
  6. return sum;
  7. };

increment.js

  1. var add = require('math').add;
  2. exports.increment = function(val) {
  3. return add(val, 1);
  4. };

program.js

  1. var inc = require('increment').increment;
  2. var a = 1;
  3. inc(a); // 2
  4. module.id == "program";

注,以上例子并不能实际run, 因为我们没有实现require这个function.

AMD规范

目前实现AMD规范的有:
Dojo (1.7)、MooTools (2.0)、Firebug (1.8) , jQuery (1.7) ,RequireJS等
AMD的规范定义在 :https://github.com/amdjs/amdjs-api/wiki
AMD API 规范主要包含:

  • AMD
    -引用和定义模块化的JS代码的主要构建块。
    define() 函数的定义   -- define(id?, dependencies?, factory);
    id表示该模块的标识,为可选参数。

    dependencies是一个字符串Array,表示该模块依赖的其他所有模块标识,模块依赖必须在真正执行具体的factory方法前解决,这些依赖对象加载执行以后的返回值,可以以默认的顺序作为factory方法的参数。dependencies也是可选参数,当用户不提供该参数时,实现AMD的框架应提供默认值为[“require”,”exports”,“module”]。

    factory是一个用于执行改模块的方法,它可以使用前面dependencies里声明的其他依赖模块的返回值作为参数,若该方法有返回值,当该模块被其他模块依赖时,返回值就是该模块的输出。
    define.amd property 
    Transporting more than one module at a time 
    看一个例子:

    1. define("alpha", ["require", "exports", "beta"], function (require, exports, beta) {
    2. exports.verb = function() {
    3. return beta.verb();
    4. //Or:
    5. return require("beta").verb();
    6. }
    7. });
  • require
    requrie() 函数的API,允许动态的,异步的加载模块和解决模块ID标识字符串到文件路径的转换。
    require(String) 
    require(Array, Function) 
    require.toUrl(String)
  • Loader-Plugins
    允许加载非传统的JS 依赖项的其他资源。
  • Common-Config
    可选的常见配置。
 

Javascript模块化编程系列三: CommonJS & AMD 模块化规范描述的更多相关文章

  1. Javascript模块化编程(三):require.js的用法

    Javascript模块化编程(三):require.js的用法 原文地址:http://www.ruanyifeng.com/blog/2012/11/require_js.html 作者: 阮一峰 ...

  2. (转)Javascript模块化编程(三):Require.js的用法

    转自 ruanyifeng 系列目录: Javascript模块化编程(一):模块的写法 Javascript模块化编程(二):AMD规范 Javascript模块化编程(三):Require.js的 ...

  3. Javascript面向对象编程(三):非构造函数的继承(对象的深拷贝与浅拷贝)

    Javascript面向对象编程(三):非构造函数的继承   作者: 阮一峰 日期: 2010年5月24日 这个系列的第一部分介绍了"封装",第二部分介绍了使用构造函数实现&quo ...

  4. WCF编程系列(三)地址与绑定

    WCF编程系列(三)地址与绑定   地址     地址指定了接收消息的位置,WCF中地址以统一资源标识符(URI)的形式指定.URI由通讯协议和位置路径两部分组成,如示例一中的: http://loc ...

  5. 转:JavaScript函数式编程(三)

    转:JavaScript函数式编程(三) 作者: Stark伟 这是完结篇了. 在第二篇文章里,我们介绍了 Maybe.Either.IO 等几种常见的 Functor,或许很多看完第二篇文章的人都会 ...

  6. JavaScript 面向对象编程(三):非构造函数对象的继承

    JavaScript 面向对象编程(三):非构造函数对象的继承 一.什么是"非构造函数"的继承? 比如,现在有一个对象,叫做"中国人". var Chinese ...

  7. 前端模块化方案全解(CommonJS/AMD/CMD/ES6)

    模块化的开发方式可以提高代码复用率,方便进行代码的管理.通常一个文件就是一个模块,有自己的作用域,只向外暴露特定的变量和函数.目前流行的js模块化规范有CommonJS.AMD.CMD以及ES6的模块 ...

  8. JavaScript 面向对象编程(三)如何写类和子类

    在JavaScript面向对象编程(一)原型与继承和JavaScript面向对象编程(二)构造函数和类中,我们分别讨论了JavaScript中面向对象的原型和类的概念.基于这两点理论,本篇文章用一个简 ...

  9. 022年9月12日 学习ASP.NET Core Blazor编程系列三——实体

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

随机推荐

  1. mac配置appium进行自动化测试

    先去brew.sh这个网站,拷贝最新的下载安装命令,黏贴到终端里,回车,按提示下载安装. 安装完毕后,运行brewupdate 看看是否有更新,然后输入brew ios-webkit-debug-pr ...

  2. switch……case不能匹配字符串的方法 .xml

    pre{ line-height:1; color:#d1653c; background-color:#000000; font-size:16px;}.sysFunc{color:#566d68; ...

  3. jQuery Mobile 页面事件总结

    一.页面初始化事件(Page initiallization) 在页面创建前,当页面创建时,以及在页面初始化之后.只在第一次加载时执行. 1. pagebeforecreate 页面创建前 [sour ...

  4. Axure中继器基础教程(增行、删当前、标记、全部、规则行) Mark

    ---恢复内容开始--- 一.中继器的新增行 中继器所显示的列表项与中继器的数据集有关,默认情况下是一一对应的.也就是说,中继器数据集中有多少行数据,那么,列表项就有多少个. 那么,我们能不能通过新增 ...

  5. 第三百三十天 how can I 坚持

    今天是姥姥二周年,不是忘了,是根本就没不知道,没放在心上,正月十九,记下了,人这一辈子. 搞不懂,搞不懂那签. 锥地求泉,先难后易,顺其自然,偶遇知己,携手同行,是签文的关键,我逐个解释给你听.锥地求 ...

  6. 第一百九十三天 how can I 坚持

    我以为我是谁. 你可以记录你今天看了电影 也可以记录你最近在听什么歌 但这都会成为回忆 .  ---oncelife 快受不了了啊.咋办. 今天看了<滚蛋吧,肿瘤君>,还看了<那山那 ...

  7. <转>linux进程间通信<一>

    这篇文章真心不错,只是代码比较久,有些地方需求大家自行修改.先全文转载,以备复习只用.原文链接为:http://www.ibm.com/developerworks/cn/linux/l-ipc/pa ...

  8. JAVA应用apache httpclient探测http服务

    代码很简单,apache都已经提供了封装. import org.apache.commons.httpclient.HttpClient; import org.apache.commons.htt ...

  9. Codeforces 719 E. Sasha and Array (线段树+矩阵运算)

    题目链接:http://codeforces.com/contest/719/problem/E 题意:操作1将[l, r] + x; 操作2求f[l] + ... + f[r]; 题解:注意矩阵可以 ...

  10. UVaLive 6608 Cabin Baggage (水题)

    题意:给定四个数代表长宽高和重,问你是不是满足下面条件,长不高于56,宽不宽于45,高不高于25,或者总和不大于125,并且重量不高于7. 析:判断输出就好,注意这个题是或,不要想错了. 代码如下: ...