CommonJS Module 规范

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

目前实现此规格的包有:

Yabble,CouchDB,Narwhal (0.2), Wakanda, TeaJS (formerly v8cgi), CommonScript, PINF JS Loader, SeaJS, ArangoDB, sorrow.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

exports.add = function() {var sum = 0, i = 0, args = arguments, l = args.length;while (i < l) {sum += args[i++];}return sum;
};

increment.js

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

program.js

var inc = require('increment').increment;
var a = 1;
inc(a); // 2module.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
    看一个例子:

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

Javascript模块化编程系列三: CommonJS AMD 模块化规范描述相关推荐

  1. Javascript模块化编程系列二: 模块化的标准化(CommonJS AMD)

    前言 Javascript模块化编程系列一: 模块化的驱动 在前一篇介绍了为什么要进行Javascript模块化编程.至于如何实现模块化,不同的开发组织和个人具体的实现方式肯定是不一样.如何统一一个规 ...

  2. JavaScript面向对象编程-第三版不完全系统解读

    JavaScript面向对象编程-第三版不完全系统解读 作者:老九-技术大黍 产品:查看原文 社交:知乎 公众号:老九学堂(新手有福利) 特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系笔者 ...

  3. JavaScript 函数式编程(三)

    slide 地址 四.Talk is cheap!Show me the ... MONEY! 以下内容主要参考自 Professor Frisby Introduces Composable Fun ...

  4. 学习ASP.NET Core Razor 编程系列三——创建数据表及创建项目基本页面

    原文:学习ASP.NET Core Razor 编程系列三--创建数据表及创建项目基本页面 学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 ...

  5. Javascript模块化编程系列一: 模块化的驱动

    Javascript 函数编程 初涉Javascript ,会以为Javascript 是面向过程的编程语言, 和C类似,使用函数来达成效果. <!--Add by oscar999--> ...

  6. JavaScript 面向对象编程(三) —— 函数进阶 / 严格模式 / 高阶函数 / 闭包 / 浅拷贝和深拷贝

    本篇为 JavaScript 进阶 ES6 系列笔记第三篇,将陆续更新后续内容.参考:JavaScript 进阶面向对象 ES6 :ECMAScript 6 入门 系列笔记: JavaScript 面 ...

  7. JS JavaScript模块化(ES Module/CommonJS/AMD/CMD)

    前言 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了, jQuery,Ajax,Node.Js,MVC,MVVM等的助力也使得 ...

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

    这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库require.js. 一.为什么要用require.js? 最早的 ...

  9. [技巧] Javascript模块化编程(三):require.js的用法

    这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库require.js. 一.为什么要用require.js? 最早的 ...

最新文章

  1. 从TimeQuest角度看set_max_delay
  2. Python判断 子集
  3. SAP中和计量单位有关的表
  4. SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载)
  5. BJUI修改弹窗dialog的宽度和高度
  6. MySQL高级 - 锁 - InnoDB行锁 - 介绍及背景知识
  7. 副本放置策略Copysets论文解读及工程实践
  8. python 服务端框架_GitHub - edisonlz/fastor: Python服务端开发框架-极易上手,超出你的想象!...
  9. 树形列(无限级联下拉列的曲线版本)
  10. EAST算法超详细源码解析:数据预处理与标签生成
  11. 一阶电路中的时间常数_你知道RC电路和RL电路中时间常数的来源么?
  12. 搭一个简单的接口测试框架
  13. iso qemu 安装ubuntu_qemu 安装 ubuntu-server 虚拟机
  14. signature=efaf25d07c6ea03d7552906c0caee5a8,幼児の認知発達における関係把握の問題
  15. 英特尔再爆重大芯片漏洞,苹果谷歌微软相继中招!
  16. oracle 创建视图_Oracle 中视图的创建和处理方法
  17. 通达信版弘历软件指标_通达信精选指标——弘历趋势
  18. 一篇文章教会你需求分析文档怎么写
  19. php 输出七芒星,SongNet:硬格式控制下的文本生成
  20. 哥德尔命题6、背景知识和ω一致性观念——哥德尔读后之十七021-08-09

热门文章

  1. Pro*C/C++简单介绍
  2. JAVA_SE基础——46.引用数据类型变量.值交换[独家深入解析]
  3. HttpResponse类
  4. 局域网聊天工具FreeChat 1.0 开发日志
  5. webpack1.x环境配置与打包基础【附带各种 “坑“ 与解决方案!持续更新中...】
  6. 【干货】房地产基础知识及开发流程.pdf(附下载链接)
  7. 拼多多再添新瓜!15 岁上浙大、22 岁获世界冠军的天才黑客 Flanker 疑因拒绝违法攻击被强制开除...
  8. 【白皮书分享】2020双十一五大趋势洞察白皮书.pdf(附下载链接)
  9. 一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
  10. 全球首发!惯性导航导论(剑桥大学)第七部分