Javascript模块化编程系列三: CommonJS & AMD 模块化规范描述

CommonJS Module 规范     

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

目前实现此规格的包有:java

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

注意,这里并无找到 requireJS,由于它使用的是AMD规范。github

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

  • 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.jsapi

 

[javascript]  view plain copy
 
  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框架

[javascript]  view plain copy
 
  1. var add = require('math').add;  
  2. exports.increment = function(val) {  
  3.     return add(val, 1);  
  4. };  

program.js异步

[javascript]  view plain copy
 
  1. var inc = require('increment').increment;  
  2. var a = 1;  
  3. inc(a); // 2  
  4.    
  5. 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 
    看一个例子:
    [javascript]  view plain copy
     
    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
    可选的常见配置。
 
相关文章
相关标签/搜索