译者: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/
相关推荐
确保你在调用axios方法时遵循其API规范,例如:`axios.get()`, `axios.post()`等。检查语法错误、拼写错误以及异步操作的处理。 5. **环境问题**:Node.js运行时环境可能存在问题,例如缺失必要的模块或设置。确保...
CommonJS模块/1.0 服务器端: Node.js( ) MongoDB( ) ImageMagick( ) 执照 UPPERSITE的许可证遵循以下文件。 接触 官方网站: : UPPERSITE: : 2014ⓒBTNcafe· · contact@btncafe.com
除了AMD,`curl`还兼容CommonJS Modules/1.1规范,这是服务器端JavaScript模块化的一种标准。在CommonJS中,模块通过`module.exports`和`require`进行定义和引用。`curl`能够将服务器端的模块转换为浏览器可用的形式...
jvm-npm, 适用于JVM的兼容CommonJS模块加载器 JVM上Javascript运行时中的NPM模块加载支持。 实现基于 http://nodejs.org/api/modules.html,应该完全兼容。 当然,不包括完整的node.js API,因此不要期望依赖于它的...
CommonJS模块/1.0 浏览器端: 几乎所有现有的浏览器,包括IE 6 服务器端: Node.js( ) MongoDB( ) Redis( ) ImageMagick( ) 执照 UPPERCASE.IO的许可证遵循以下文档。 接触 官方网站: : ...
Modular-Explain ...CommonJS社区由许多致力于标准化开源的牛人组建,CommonJS的前身原本叫ServerJS,在2009年-2010年期间推出了Modules/1.0规范后,在Node.js等环境下的运用中取得了突出的。 在CommonJS规范
nashorn-commonjs-modules, CommonJS的模块支持 Nashorn CommonJS模块支持 Nashorn这个库增加了对CommonJS模块( aka require ) inside的支持( Nashorn脚本引擎) 。 它基于 NodeJS模块的规范,它支持从文件夹加载模块...
CDN构建-jsDelivr , unpkg 安装 $ npm install @chocolateboy/uncommonjs 用法 // ==UserScript==// @name My Userscript// @description A userscript which uses some CommonJS modules// @include
rollup-plugin-commonjs, 将CommonJS模块转换为 ES2015 rollup-plugin-commonjs 将CommonJS模块转换为 ES6,以便它们可以包含在Rollup包中安装npm install --save-dev rollup-plugin-commonjs用法
├── LIFE // 包含模块部分的反模式集合和命名空间解决方案│ ├── anti-pattern.js│ └── namespace.js├── amd // amd范例│ ├── caculator.js│ └── math.js├── commonjs // 放置commonjs...
描述 "when.java.zip, commonjs promises/a 规范的 java 实现 when.js 的 java 端口" 提到了一个名为 "when.js" 的 JavaScript 库的 Java 版本,名为 "when.java"。"when.js" 是一个遵循 CommonJS Promises/A 规范的...
CommonJS Modules/2.0规范进一步细化了模块化规则,为Node.js和其他实现提供了标准化的接口。 JavaScript数据推送则是为了让Web应用能够实时接收服务器数据,避免频繁的Ajax轮询。Comet是一种基于HTTP长连接的...
cjs4esm CommonJS require通过ESM...// use require to bring in CommonJS based modules/filesconst local = require ( './demo' ) ;const fromNodeModules = require ( 'circular-json' ) ;// also availablerequire
axios-retry, 拦截失败请求的Axios插件,只要可能就重试 axios重试拦截失败请求的Axios插件,只要可能就重试。安装npm install axios-retry用法// CommonJS// const axiosRetry = require('axio
CommonJS和ESM(ECMAScript Modules)是两种主要的模块规范。CommonJS是Node.js环境中广泛使用的模块化标准,而ESM则是ES6引入的原生模块系统,适用于浏览器和Node.js。本篇文章将深入探讨Babel 7中的转换插件,特别...
扩展的EXTJS公共类,扩展的EXTJS公共类,扩展的EXTJS公共类
安装该软件包可以从 NPM 安装: npm install phantomjs-dirty例子 var dirty = require('./node_modules/phantomjs-dirty');var db = dirty.open('test.dirty');db.set('a-key', { a: 1 });console.log(db.get('a-...
-save @ jledentu / vue-finder vue-finder可以使用Vue.js组件显示分层数据(如MacOS X finder)安装npm install --save @ jledentu / vue-finder vue-finder可以在CommonJS和ES模块环境中用作模块。 在非模块化环境...