nodejs-模块

在开发一个复杂的应用程序的时候,我们需要把各个功能拆分、封装到不同的文件,在需要的时候引用该文件。没人会写一个几万行代码的文件,这样在可读性、复用性和维护性上都很差,几乎所有的编程语言都有自己的模块组织方式,比如Java中的包、C#中的程序集等,node.js使用模块和包来组织,其机制实现参照了CommonJS标准,虽未完全遵守,但差距不大,使用起来非常简单。

 

模块在node.js中的概念很简单,看看如何创建一个我们自己的模块供开发复用。

在node.js中创建模块非常简单,一个文件就是一个模块,所以我们创建一个module_1.js文件就创建了一个模块

console.log("load moudle_1.js");
var name='';
function setName(n){
    name=n;
} 
function printName(){
    console.log(name);
}
exports.setName=setName;
exports.printName=printName;

 问题是怎么使外部访问这个module,我们知道客户端的JavaScript使用script标签引入JavaScript文件就可以访问其内容了,但这样带了的弊端很多,最大的就是作用域相同,产生冲突问题,以至于前端大师们想出了立即执行函数等方式,利用闭包解决。node.js使用exports和require对象来解决对外提供接口和引用模块的问题。我们可以把模块中希望被外界访问的内容定义到exports对象中,例如

var m = require("./moudle_1.js");
m.setName("thd");
m.printName();
var m2 = require("./moudle_1.js");
m2.setName("thirdteendevil");
m2.printName();
m.printName();

我们可以把module_1.js中的exports看做是一个对象,在app_1.js中第一行require("./moudle_1.js");返回的就是moudle_1.js中的exports对象。(不晓得是不是真的这样啊,仅仅是个人猜测)


再看一种情况

moudle_2.js:

console.log(" load moudle_2.js ");
var Student  = function(name){
	this.name = name;
} 
Student.prototype = {

	getName : function(){
		return this.name;
	},
	setName : function(name){
		this.name = name;
	}
}
exports.Student=Student;

app_2.js
var Student = require("./moudle_2.js").Student;

var s1 = new Student("thd");
console.log(s1.getName()+"|||");


var s2 = new Student("thirdteendevil");
console.log(s2.getName()+"|||");
console.log(s1.getName()+"|||");

事实的情况是这样的,其实module.exports才是模块公开的接口,每个模块都会自动创建一个module对象,对象有一个exports的属性,初始值是个空对象{},module的公开接口就是这个属性——module.exports。既然如此那和exports对象有毛线关系啊!为什么我们也可以通过exports对象来公开接口呢? 
为了方便,模块中会有一个exports对象,和module.exports指向同一个变量,所以我们修改exports对象的时候也会修改module.exports对象,这样我们就明白网上盛传的module.exports对象不为空的时候exports对象就自动忽略是怎么回事儿了,因为module.exports通过赋值方式已经和exports对象指向的变量不同了,exports对象怎么改和module.exports对象没关系了。 
大概就是这么过程


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值