node.js中模块的理解有以下几点:
1.作用域
一个文件就是一个模块,每个模块都有自己的作用域,我们使用var 声明的变量并不是全局变量,而是属于当前模块中的。2.模块加载系统
假如在同一目录下有两个文件:1.js和2.js,现在要在1.js中去加载2.js,我们需要用到require()方法,用法如下:在1.js中写:require("./2.js"); 注意不是:require("2.js");至于原因,下面会有讲解
3.模块加载机制
3.1 路径
绝对路径:文件在计算机中的绝对位置路径相对路径:(1). require("./2.js"); 在1.js中加载2.js模块
(2). require("2.js); 这种写法一般是加载node中的核心模块(安装nodejs时会在计算机中生成一个node-module文件夹,核心模块指的就是该文件夹下的文件)
3.2文件查找
(1).首先按照加载的模块的文件名称进行查找(2).如果没有找到,则会在模块文件名称后加上 .js 的后缀进行查找
(3).如果还没有找到,则会在模块文件名称后加上 .json 的后缀进行查找
(4).如果还是没有找到,则会在模块文件名称后加上 .node 的后缀进行查找
(5).如果还是没有找到,则会报错
按照:文件名-->.js-->.json-->.node
4.模块中变量的访问
在一个模块中通过var定义的变量,其作用域范围是当前模块,外部文件是不能够直接访问的,如果我们想一个模块(比如:1.js)能够访问另一个模块(2.js)中定义的变量,我们可以以下几种方法:
4.1把被访问的变量作为global对象的一个属性(但是不推荐这样使用)
在1.js中: require("./2.js");在2.js中: global.a=100;
4.2使用模块对象module:
保存提供和当前模块有关的一些信息,在module对象下有一个子对象(exports对象),我们可以通过这个子对象把一个模块中的局部变量对象进行提供访问,比如:
在2.js中:module.exports.a=a;
在1.jszhong :require("./2.js"); 这个方法的返回值其实就是被加载模块中的module.exports
4.3在模块作用域中,还有一个内置的模块对象erports,他其实就是module.exports
module.exports.a=a; 这样写的时候,module.exports==exports 结果为true的但是,如果这样写:module.exports=[1,2,3];或者exports=[1,2,3]; 这样就改写了module.exports或者exports的指向关系,此时,exports和module.exports的指向关系已经断开。