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();
};
});

最新文章

  1. Python学习日志(四)
  2. volatile关键字详解
  3. hadoop入门(2)——HDFS2.0应用场景、原理、基本架构及使用方法
  4. Android apk集成
  5. Visual Studio Developer Assistant 3月新功能展示
  6. Sass 编译的几种方法
  7. windows server 2008 R2 忘记administrator密码
  8. okhttp 常用使用方式 封装 演示
  9. Kibana5 数据探索使用(Discover功能)
  10. Egret学习笔记 (Egret打飞机-1.大致思路)
  11. 用JavaScript比较两个数组是否相等
  12. Thinkphp5.0支付宝支付扩展库类库大全
  13. Deepfakes:AI换脸技术自制明星XX片
  14. BZOJ3393 [Usaco2009 Jan]Laserphones 激光通讯 BFS
  15. 一个ip对应多个域名多个ssl证书配置-Nginx实现多域名证书HTTPS
  16. sqlalchemy使用
  17. 蓝桥杯 生命之树【树状dp】
  18. SVM 为什么要从原始问题变为对偶问题来求解
  19. 练习十一:兔子数量计算—斐波那契实例
  20. REBXOR

热门文章

  1. bfs(标记整个棋盘)
  2. 【题解】Intervals
  3. adb shell常用命令总结
  4. 关于vuex中的状态变量的思考???
  5. linux单机部署kafka(filebeat+elk组合)
  6. Oracle 存储过程--01
  7. mysql中文乱码解决办法
  8. LUOGU1438无聊的数列
  9. 编写mapreduce的程序的套路
  10. 英语单词operand