common.js规范
nodejs由许多模块组成,每个模块就是一个文件,node模块采用了commonjs规范。
根据commonjs规范,一个单独的文件就是一个模块,每一个模块都是单独的作用域也就是说,在一个文件定义的变量,都是private的,对其他文件是不可见的。
var x = 5;
var add = function(value){return value + x;}
上面代码中,变量x和函数add,是当前文件private的,其他文件不可见。
如果想在多个文件中分享变量,必须定义为global的属性。
global.a = a;
上面的a变量,可以被所有的文件读取,当然,这样的写法是不推荐的。
commonjs规定,每个文件的对外接口是module.exports对象,这个对象的所有属性和方法,都可以被其他文件导入。
module对象
每一个模块内部,都有一个module对象,代表当前模块,它有以下属性:
- module.id 模块的识别符 通常是带有绝对路径的模块文件名
- module.filename 模块的文件名, 值为此模块的绝对路径
- module.loaded 返回一个布尔值,表示本模块是否已经加载完成
- module.parent 返回一个对象,表示调用该模块的模块
- module.children 返回一个数组,代表该模块要用到的其他模块

模块的加载规则

查找文件的规则

如何判断模块是直接被执行还是被调用?
if(require.main === module){
console.log("直接执行")
}else{
console.log("调用执行");
}
网友评论