node中的js—模块系统
原创
©著作权归作者所有:来自51CTO博客作者wx633288bd5c53e的原创作品,请联系作者获取转载授权,否则将追究法律责任
模块有三种
在Node中的JavaScript还有一个重要的概念,模块系统。
- 模块作用域
- 使用require方法来加载模块
- 使用exports接口对象来导出模板中的成员
加载require
语法:
var 自定义变量名 = require('模块')
作用:
- 执行被加载模块中的代码
- 得到被加载模块中的
exports
导出接口对象
导出exports
- Node中是模块作用域,默认文件中所有的成员只在当前模块有效
- 对于希望可以被其他模块访问到的成员,我们需要把这些公开的成员都挂载到
exports
接口对象中就可以了
导出多个成员(必须在对象中):
exports.a = 123;
exports.b = function(){
console.log('bbb')
};
exports.c = {
foo:"bar"
};
exports.d = 'hello';
导出单个成员(拿到的就是函数,字符串):
module.exports = 'hello';
以下情况会覆盖:
module.exports = 'hello';
//后者会覆盖前者
module.exports = function add(x,y) {
return x+y;
}
也可以通过以下方法来导出多个成员:
module.exports = {
foo = 'hello',
add:function(){
return x+y;
}
};
模块原理
exports和module.exports
的一个引用:
console.log(exports === module.exports); //true
exports.foo = 'bar';
//等价于
module.exports.foo = 'bar';
当给exports重新赋值后,exports!= module.exports.
最终return的是module.exports,无论exports中的成员是什么都没用。
真正去使用的时候:
导出单个成员:exports.xxx = xxx;
导出多个成员:module.exports 或者 modeule.exports = {};
总结
一、具名的核心模块
// 用来获取机器信息的
var os = require('os');
// 用来操作路径的
var path = require('path');
// 获取当前机器的cpu信息
console.log(os.cpus());
// memory内存
console.log(os.totalmem());
// 获取扩展名
console.log(path.extname('a/s/s/s/anc.txt'));
//以及前面使用的http等
require
也就是加载执行里面的代码
node
中,没有全局作用域,只有模块作用域,也就是只在自己的文件里有用,外部访问不到内部,内部也访问不到外部,无论是变量还是函数,都不行
二、用户编写的文件模块
相对路径必须加载 `./`,否则报错
可以省略后缀名
那如何让不同的模块进行通信呢 ?
通过对象来获取另一个模块里面的函数,变量
例如:
a文件:
// a文件
// require方法有两个作用
// 1、加载文件模块并执行里面的代码
// 2、拿到被加载文件模块导出的接口对象
// 3、自定义的每个文件里都提供了一个默认空对象:exports
// 加载fs核心模块和b模块
var bExports = require('./b');
var fs = require('fs');
// 通过对象方法访问b成员及方法
console.log(bExports.temp);
console.log(bExports.add(3,8));
// fs访问内容
fs.readFile('./a.js',function(err,data){
if(err){
console.log("取读失败");
}else{
console.log("读取成功,数据是"+data.toString());
}
})
b文件:
// b文件
console.log('b,js文件被加载执行了');
var temp='牛牛';
function add (x,y){
return x+y;
}
exports.temp = temp;
// exports.add = add;//左边是成员变量,右边是模块函数
// 或者
exports.add = function(x,y){
return x+y;
}