什么是模块
Node.js的模块遵循Common.js的模块规范,包括模块引用,模块定义和模块标识。
模块引用
模块的引用是通过上下文提供的require 方法完成 如:
var module = require('module');
如此便完成了对一个模块的引用
模块的定义
模块定义也就是如果创建一个模块,在Node.js 中一个文件就是一个模块。每一个模块中有一个module对象,代表模块本身,在module对象中还有一个exports属性,exports是模块公开的接口,require方法返回的即为一个exports对象。我们可以通过log详细看下
// module.js
exports.name = 'this is my module';
console.log('下面为module对象:')
console.log(module);
console.log('通过require引入的模块对象:')
var module = require('./module');
console.log(module)
执行后log输出
下面为module对象:
Module {
id: '.',
exports: {},
parent: null,
filename: '/Users/gqs/blogs/app.js',
loaded: false,
children: [],
paths:
[ '/Users/gqs/blogs/node_modules',
'/Users/gqs/node_modules',
'/Users/node_modules',
'/node_modules' ] }
通过require引入的模块对象:
{ name: 'this is my module' }
模块标识
模块标识就是require方法中的参数。规定该标识必须是符合小驼峰命名的字符串,或者以.、..开头的相对路径,或者绝对路径,可以没有文件名。
模块特性
- 单次加载
加载模块和创建对象的区别是模块只会加载一次,也就是无论调用多少次require方法,返回的模块都同一个,或者都是同一个exports对象
var module1 = require('./module');
module1.name = "name1";
var module2= require('./module');
module2.name = 'name2';
console.log(module1 === module2);
console.log('Name is '+module1.name)
执行输出
true
Name is name2
第一次赋值被第二次赋值覆盖
- 覆盖 exports
exorts 只是一个普通对象,专门用来声明接口,所有如果我们只是想暴露一个对象,可以直接对其进行覆盖,如
// module.js
function Hello(){
this.sayHello = function(name){
console.log('hello...');
};
}
modules.exports = Hello;
//app.js
var Hello = require('./module');
console.log(new Hello());
Hello { sayHello: [Function] }
看输出 确实是被被覆盖了
ok 以上就是对Node.js的简单介绍
参考书籍
- 《Node.js开发指南》
- 《深入浅出Node.js》
网友评论