一.什么是模块:
在node中,文件和模块是一一对应的,也就是说一个文件就是一个模块;
每个模块都有自己的作用域;
我们通过var声明的变量并非全局而是该模块作用域下的。
var a = 100;
global.a=200;
console.log(a);//100
console.log(global.a)//200
二.加载机制
路径问题:现在1.js和2.js都在F:/mynode路径下,1.js想要加载2.js
绝对路径:require('F:/mynode/2.js');必须加上单引号。
相对路径:require('./2.js');尽管在同一个文件夹下,也要加上./
如果写成 require('2.js');就会加载node中的核心模块或者node_modules。
查找问题:
如果写成require('./2');
1.首先按照加载的模块的文件名称进行查找,例如:
现在1.js、2.js和2文件都在F:/mynode路径下,require('./2');会加载2,不会加载2.js文件
2.如果没有找到,则会在模块文件名称后加上.js的后缀进行查找,例如:
现在1.js和2.js都在F:/mynode路径下,require('./2');会先找文件名称为2的文件,没有找到,
在文件名称后面加上后缀.js,就会加载2.js文件
3.如果没有找到,则会在模块文件名称后加上.json的后缀进行查找
4.如果没有找到,则会在模块文件名称后加上.node的后缀进行查找
三.模块module和exports
在一个模块中通过var定义的变量,其作用域范围是当前模块,外部不能够直接访问
如果我们想一个模块访问另一个模块中定义的变量,可以:
1.把变量作为global对象的一个属性,但是这样的做法是不推荐的
2.使用模块对象module(保存提供和当前模块有关的一些信息)
Module {
id: '.',
exports: {},
parent: null,
filename: 'F:\\mynode\\1.js',
loaded: false,
children: [],
paths: [ 'F:\\mynode\\node_modules', 'F:\\node_modules' ] }
1.js文件
require('./2.js');//返回加载模块的module.exports
var m5 = require('./2.js');//返回加载模块的module.exports
console.log(m5.a);
2.js文件
var a = 100;
module.exports.a = a;
在模块作用域内,还有一个内置的模块对象,exports,他其实就是module.exportsconsole.log(module.exports === exports);//true
因此2.js文件可以这样写:
var a = 100;
exports.a = a;
注意:
在使用module.exports和exports不要修改他们的指向,只是通过添加属性来操作,否则会切断两者之间的联系。
当向外暴露一个类(构造函数)时,module.export = 构造函数名;
People.js
function People(name,sex,age){
this.name = name;
this.sex = sex;
this.age = age;
}
People.prototype = {
sayHello : function(){
console.log(this.name +' is ' + this.age);
}
};
module.exports = People;
a.js
var People = require('./People.js');
var Jack = new People('Jack','male','18');
Jack.sayHello();
People.js和a.js在同一路径下,当执行node a.js命令时,输出结果:Jack is 18如果通过exports.People = People;这种方式向外暴露构造函数People,则a.js要写成下列方式:
var Jack = new People.People('Jack','male','18');这是不推荐的,规定不能这样写。
var People = require('./People.js');
var Jack = new People.People('Jack','male','18');
Jack.sayHello();
总之,向外暴露类(构造函数)时,使用module.export = 构造函数名;再说一下this的问题:
function People(){
}
People.sex = 'male';
People.foo = function(name,sex){
this.name = name;
this.sex = sex;
console.log(this.sex);
}
var Lucy = new People.foo('Lucy','female');//female
console.log(People.sex);//male
console.log(Lucy.sex);//female
当执行new操作符时,改变了this指向,指向Lucy对象