CommonJS 是以在浏览器环境之外构建 JavaScript 生态系统为目标而产生的项目,比如在服务器和桌面环境中。
这个项目最开始是由 Mozilla 的工程师 Kevin Dangoor 在2009年1月创建的,当时的名字是 ServerJS。
我在这里描述的并不是一个技术问题,而是一件重大的事情,让大家走到一起来做决定,迈出第一步,来建立一个更大更酷的东西。 —— Kevin Dangoor’s What Server Side JavaScript needs
CommonJS 规范是为了解决 JavaScript 的作用域问题而定义的模块形式,可以使每个模块它自身的命名空间中执行。该规范的主要内容是,模块必须通过 module.exports 导出对外的变量或接口,通过 require() 来导入其他模块的输出到当前模块作用域中。
Commonjs 提供两个工具:
require()
函数,当前作用域下导入其他模块.module
对象, 当前域到处变量和接口.
无格式的js例子
这是一个没有commonjs的例子:
在salute.js
文件里面定义一个别的地方要用到的变量MySalute。
// salute.js
var MySalute = "Hello";
在world.js
文件里面使用salute.js
里面定义的变量
// world.js
var Result = MySalute + " world!";
Module 定义
可以看到world.js
里面的MySalute
is not defined。
所以,我们需要给每个文件定义一个module:
// salute.js
var MySalute = "Hello";
module.exports = MySalute;
// world.js
var Result = MySalute + "world!";
module.exports = Result;
我们用了一个特殊变量module
,并将定义的变量引用放到module.exports
以至于CommonJS模块系统知道我们模块的对象。salute.js
暴露了 MySalute
, world.js
暴露了 Result
.
Module 依赖
我们还差一步就完成了:依赖定义。
我们给每个文件定义一个独立的模块,但是world.js
得知道是谁定义的Mysalute
We’ve already defined every script as an independent module, but world.js
// salute.js
var MySalute = "Hello";
module.exports = MySalute;
// world.js
var MySalute = require("./salute");
var Result = MySalute + "world!";
module.exports = Result;
注一道我们没有用完整的文件名salute.js
而是./salute
, ./
表示和world
module在同一个目录.
例子
函数
// moduleA.js
module.exports = function( value ){
return value*2;
}
// moduleB.js
var multiplyBy2 = require('./moduleA');
var result = multiplyBy2( 4 );