译者:CommonJS Modules/1.0 是目前JavaScript模块化的事实标准,虽然其已经被 CommonJS Modules/1.1 所替代,但是1.0的适用范围非常广,支持者也很多,其中包括Flusspferd, GLUEscript, GPSEE, JSBuild, Narwhal (0.1), Persevere, RingoJS, SproutCore 1.1/Tiki, node.js, TeaJS (formerly v8cgi), CouchDB, Smart Platform, Yabble, Wakanda, XULJet等,所以翻译此规范还是很有必要的,以下为正文。
此规范指出了如何编写可以在同类模块系统中所共用的模块,这类模块系统可以同时在客户端和服务端,以安全的或者不安全的方式已经被实现了或者通过语法扩展可以被未来的系统所支持。这些模块需要提供顶级作用域的私有性,并提供从其他模块导入单例对象到自身并且可以导出自身API的能力。含蓄的说,这个规范定义了如果一个模块系统要支持共用模块,那么它需要提供的最少的功能特性。
契约
模块上下文
1.在一个模块中,存在一个自由的变量”require”,它是一个函数。
- 这个”require”函数接收一个模块标识符。
- “require”返回外部模块所输出的API。
- 如果出现依赖闭环(dependency cycle),那么外部模块在被它的传递依赖(transitive dependencies)所require的时候可能并没有执行完成;在这种情况下,”require”返回的对象必须至少包含此外部模块在调用require函数(会进入当前模块执行环境)之前就已经准备完毕的输出。(译者:如果难理解,看下面的例子。)
- 如果请求的模块不能返回,那么”require”必须抛出一个错误。
2. 在一个模块中,会存在一个名为”exports”的自由变量,它是一个对象,模块可以在执行的时候把自身的API加入到其中。
3. 模块必须使用”exports”对象来做为输出的唯一表示。
模块标识符
- 模块标识符是一个以正斜杠分隔的多个”term”组成的字符串。
- 一个term必须是一个驼峰格式的标识符,”.”或者”..”。
- 模块标识符可以不加文件扩展名,比如”.js”。
- 模块标识符可以是「相对的」或者「顶级的」(top-level)。如果一个模块标识符的第一个term是 “.”或者”..”,那么它是「相对的」。
- 顶级标识符是概念上的模块命名空间的根。
- 相对标识符是相对于在其内部调用了”require”的模块的标识符来进行解析的。
未规范
此规范对如下关于协同工作能力方面的重要内容未进行规范:
- 模块是否可以通过数据库,文件系统或者工厂函数进行存储,或者可以通过链接库进行内部交换。
- 模块加载器是否应该支持PATH变量用来解析模块标识符。
单元测试
- Unit Tests at Google Code by Kris Kowal
- Unit Tests Git Mirror by Ash Berlin
实例代码
math.js
increment.js
program.js
依赖闭环解释(译者添加)
因为node.js完全实现了CommonJS Modules/1.0规范,那么我们用其来解释CommonJS Modules/1.0中的依赖闭环问题。看如下代码:
a.js
b.js
main.js
当main.js加载a.js的时候,a.js加载b.js,同时,b.js想要加载a.js,这时候就产生了依赖闭环的问题,为了避免无限循环,需要打破这个闭环。根据CommonJS Modules/1.0规范中的说明「在这种情况下,”require”返回的对象必须至少包含此外部模块在调用require函数(会进入当前模块执行环境)之前就已经准备完毕的输出。」,有些绕,让我们从依赖闭环产生的地方跟踪,b.js需要require a.js,这里b.js做为当前模块,a.js相对于b.js来说是外部模块,那么a.js的输出应该是在其require b.js之前(即「进入当前模块执行环境」)就应该返回,执行过程如下:
a.js
然后b.js继续执行完成。以下是执行结果:
注意,虽然main.js同时require了a.js和b.js,但是根据node.js的模块缓存策略,模块只执行一次。
http://blog.jobbole.com/49290/
相关推荐
Modular-Explain ...CommonJS社区由许多致力于标准化开源的牛人组建,CommonJS的前身原本叫ServerJS,在2009年-2010年期间推出了Modules/1.0规范后,在Node.js等环境下的运用中取得了突出的。 在CommonJS规范
这个对象由SVGPlotModule.js文件创建,提供了一个从 CommonJS Modules 1.0 规范松散派生的接口。 有关更多项目信息,请参阅 ,或参阅了解有关“plot”元素的更多信息。 执照 SVG 绘图模块扩展是根据。 在线演示 要...
与Node.js的module 1.0规范类似,SeaJS能够帮助开发者更好地组织和管理前端代码。尤其对于习惯于Java开发的程序员来说,SeaJS的模块化思想与Java类的组织方式有异曲同工之妙,这使得学习和使用SeaJS变得更加容易。 ...
python学习资源
jfinal-undertow 用于开发、部署由 jfinal 开发的 web 项目
基于Andorid的音乐播放器项目设计(国外开源)实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。
python学习资源
python学习资源
python学习一些项目和资源
【毕业设计】java-springboot+vue家具销售平台实现源码(完整前后端+mysql+说明文档+LunW).zip
HTML+CSS+JavaScarip开发的前端网页源代码
python学习资源
【毕业设计】java-springboot-vue健身房信息管理系统源码(完整前后端+mysql+说明文档+LunW).zip
成绩管理系统C/Go。大学生期末小作业,指针实现,C语言版本(ANSI C)和Go语言版本
1_基于大数据的智能菜品个性化推荐与点餐系统的设计与实现.docx
【毕业设计】java-springboot-vue交流互动平台实现源码(完整前后端+mysql+说明文档+LunW).zip
内容概要:本文主要探讨了在高并发情况下如何设计并优化火车票秒杀系统,确保系统的高性能与稳定性。通过对比分析三种库存管理模式(下单减库存、支付减库存、预扣库存),强调了预扣库存结合本地缓存及远程Redis统一库存的优势,同时介绍了如何利用Nginx的加权轮询策略、MQ消息队列异步处理等方式降低系统压力,保障交易完整性和数据一致性,防止超卖现象。 适用人群:具有一定互联网应用开发经验的研发人员和技术管理人员。 使用场景及目标:适用于电商、票务等行业需要处理大量瞬时并发请求的业务场景。其目标在于通过合理的架构规划,实现在高峰期保持平台的稳定运行,保证用户体验的同时最大化销售额。 其他说明:文中提及的技术细节如Epoll I/O多路复用模型以及分布式系统中的容错措施等内容,对于深入理解大规模并发系统的构建有着重要指导意义。
基于 OpenCV 和 PyTorch 的深度车牌识别
【毕业设计-java】springboot-vue教学资料管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
此数据集包含有关出租车行程的详细信息,包括乘客人数、行程距离、付款类型、车费金额和行程时长。它可用于各种数据分析和机器学习应用程序,例如票价预测和乘车模式分析。