CommonJS规范 by ranyifeng
1,概述
CommonJS是服务器端模块的规范,Node.js采用了这个规范。
根据CommonJS规范,一个单独的文件就是一个模块。加载模块使用require方法,该方法读取一个文件并执行,最后返回文件内部的exports对象。下面就是一个简单的模块文件example.js。
console.log("evaluating example.js"); var invisible = function () {
console.log("invisible");
} exports.message = "hi"; exports.say = function () {
console.log(message);
}
使用require方法,加载example.js。
var example = require('./example.js');
这时,变量example就对应模块中的exports对象,于是就可以通过这个变量,使用模块提供的各个方法。
{
message: "hi",
say: [Function]
}
js文件名前面需要加上路径,可以是相对路径(相对于使用require方法的文件),也可以是绝对路径。如果省略路径,node.js会认为,你要加载一个核心模块,或者已经安装在本地 node_modules 目录中的模块。如果加载的是一个目录,node.js会首先寻找该目录中的 package.json 文件,加载该文件 main 属性提到的模块,否则就寻找该目录下的 index.js 文件。
下面的例子是使用一行语句,定义一个最简单的模块。
// addition.js exports.do = function(a, b){ return a + b };
上面的语句定义了一个加法模块,做法就是在exports对象上定义一个do方法,那就是供外部调用的方法。使用的时候,只要用require函数调用即可。
var add = require('./addition'); add.do(1,2)
//
再看一个复杂一点的例子。
// foobar.js function foobar(){
this.foo = function(){
console.log('Hello foo');
} this.bar = function(){
console.log('Hello bar');
}
} exports.foobar = foobar;
调用该模块的方法如下:
var foobar = require('./foobar').foobar,
test = new foobar(); test.bar(); // 'Hello bar'
有时,不需要exports返回一个对象,只需要它返回一个函数。这时,就要写成module.exports。
module.exports = function () {
console.log("hello world")
}
2,AMD规范与CommonJS规范的兼容性
CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。AMD规范则是异步加载模块,允许指定回调函数。由于Node.js主要用于服务器编程,模块文件一般都已经存在于本地硬盘,所以加载起来比较快,不用考虑异步加载的方式,所以CommonJS规范比较适用。但是,如果是浏览器环境,要从服务器端加载模块,这时就必须采用异步模式,因此浏览器端一般采用AMD规范。
AMD规范使用define方法定义模块,下面就是一个例子:
define(['package/lib'], function(lib){ function foo(){
lib.log('hello world!');
} return {
foo: foo
};
});
AMD规范允许输出的模块兼容CommonJS规范,这时define方法需要写成下面这样:
define(function (require, exports, module){
var someModule = require("someModule");
var anotherModule = require("anotherModule"); someModule.doTehAwesome();
anotherModule.doMoarAwesome(); exports.asplode = function (){
someModule.doTehAwesome();
anotherModule.doMoarAwesome();
};
});
最新文章
- Python学习日志(四)
- volatile关键字详解
- hadoop入门(2)——HDFS2.0应用场景、原理、基本架构及使用方法
- Android apk集成
- Visual Studio Developer Assistant 3月新功能展示
- Sass 编译的几种方法
- windows server 2008 R2 忘记administrator密码
- okhttp 常用使用方式 封装 演示
- Kibana5 数据探索使用(Discover功能)
- Egret学习笔记 (Egret打飞机-1.大致思路)
- 用JavaScript比较两个数组是否相等
- Thinkphp5.0支付宝支付扩展库类库大全
- Deepfakes:AI换脸技术自制明星XX片
- BZOJ3393 [Usaco2009 Jan]Laserphones 激光通讯 BFS
- 一个ip对应多个域名多个ssl证书配置-Nginx实现多域名证书HTTPS
- sqlalchemy使用
- 蓝桥杯 生命之树【树状dp】
- SVM 为什么要从原始问题变为对偶问题来求解
- 练习十一:兔子数量计算—斐波那契实例
- REBXOR