在node中 一个 .js文件就称之为一个模块
使用模块的好处:
1.提高代码可维护性
2.多个地方调用
3.避免函数名和变量冲突
模块名字就是一个文件名
例如 hello.js,代码如下:
.............................................................
var s = 'hello';
function greet (name) {
console.log(s+',' + name+'!')
}
module.exports = greeet;
...............................................................
最后一行语句是,将函数greet作为模块的输出暴露出去,这样其他模块就可以使用greet函数啦
ok!在main.js中使用hello模块的greet函数:
.................................................................
var greet = require('./hello');
var s = 'liao'
greet(s); // hello , liao
.................................................................
main.js中的greet变量就是hello模块导出的greet函数
类似这种加载机制被称为CommonJS规范, 在这个规范下,每一个.js文件都是一个模块。
一个模块想要对外暴露变量(函数也是变量),可以用module.exports = variable; 一个模块要引用其他模块暴露的变量,用 var ref = require('module_name'),就可以拿到引用模块的变量。
注意: module.exports = variable 输出的变量可以是任意对象、函数、数组等
模块原理:
js语言本身没有模块机制保证不同模块使用相同的变量,nodejs如何实现的呢?
js是一种函数式编程语言,支持闭包,如果把一段js代码用一个函数包装起来,这段代码的所有全局 变量就变成了函数内部的局部变量
hello.js代码是这样的
.............................................................
var s = 'hello';
var name = 'world';
console.log(s + ' ' + name + '!')
...............................................................
node加载hello.js后,它把代码包装成这样执行:
...................................................................
(function(){
var s = 'hello';
var name = 'world';
console.log(s + ' ' + name + '!')
})()
...................................................................
以上就实现了模块的隔离
如何实现模块的输出呢 module.exports?
// 准备module对象
var module = {
id: 'hello',
exports: {}
};
var load = function () {
// 读取的hello.js代码:
function greet (name) {
console.log('hello', + name + '!');
}
module.exports = greets;
return module.exports;
};
var exported = load(module);
// 保存,module
save(module, exported);