什么是CommonJS
JavaScript是一种强大的面向对象语言,它有很多快速高效的解释器。官方JavaScript标准定义的API是为了构建基于浏览器的应用程序。然而,并没有定义一个用于更广泛的应用程序的标准库。CommonJS API定义了很多普通应用程序(主要指非浏览器的应用)使用的API,从而填补了这个空白。它的终极目标是提供一个类似Python,Ruby和Java的标准库。这样的话,开发者可以使用CommonJS API编写应用程序,然后这些应用可以运行在不同的JavaScript解释器和不同的主机环境中。在兼容 CommonJS 的系统中,你可以使用JavaScript开发服务器端JavaScript应用程序、命令行工具、图形界面应用程序和Hybrid混合应用程序。
CommonJS与NodeJS的关系
CommonJS是一种规范,NodeJS是这种规范的实现。
以下的例子很好的说明了它们之间的关系:

CommonJS Modules
CommonJS Modules是有关如何实现模块化的定义,使得API可以通过模块化的系统协同工作。
- 在一个module中,有一个全局function变量“require”,require函数接受一个module identifier参数,然后返回一个外部module导出的API。外部module准备好一个exports对象,require函数返回这个exports对象,可以向exports对象中添加API。如果请求的module无法返回时,require函数将抛出error。
如果出现依赖闭环(dependency cycle),那么外部模块在被它的传递依赖(transitive dependencies)所require的时候可能并没有执行完成;在这种情况下,"require"返回的对象必须至少包含此外部模块在调用require函数(会进入当前模块执行环境)之前就已经准备完毕的输出
- 如上所述,在一个module中,也有一个对象变量“exports”。module添加API到该对象中。
- module必须使用exports的形式导出API。
- module identifier必须是符合小驼峰命名的字符串,或以“.”、“..”开头的相对路径或绝对路径,可以没有文件名后缀.js。
Sample Code
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); // 2
NodeJS中的modu.exports和exports
每一个node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {}。而exports是引用 module.exports的值。module.exports 被改变的时候,exports不会被改变,当模块导出的时候,真正导出的执行是module.exports,而不是exports
React Native
在React Native中,所有模块组件文件可以遵循CommonJS的规范,如果js文件是通过应用本地bundle加载肯定没有问题,而如果是通过服务器获取js文件,应该是相关文件会一次性打包压缩传输到本地。
加载模块:
var React = require('react-native');
var SearchPage = require('./SearchPage');
导出模块:
module.exports = SearchPage;
相关资料
JavaScript模块化(require函数):
Javascript模块化编程(一):模块的写法
Javascript模块化编程(二):AMD规范
Javascript模块化编程(三):require.js的用法