回想起我一开始使用node.js的时候,有一样东西经常让我感到不舒服。说来惭愧,我所说的是module.exports
。我之所以说‘惭愧’是因为这是nodejs基本组成部分之一而且十分地简单。事实上,回想起来,我对于到底是哪一方面困扰我毫无头绪,只是记得我对它了解的不是很清楚。我估计不止我一个人要经过很长时间才能对它完全理解,所以我想我可以写一点东西。
在Node中,只有在同一个文件中那些东西才能相互可见。我所说的‘东西’是指变量,函数,类与类成员。所以,假设有一个叫misc.js
的文件,有如下内容
//file misc.js
var x = 5;
var addX = function(value){
return value + x;
};
别的文件无法使用变量x
和函数addX
。这和关键词var
的使用无关。当然啦,Node基础构建模块被称作单元(module
),它可以直接指出一个文件的路径。所以我们可以说上述的文件相当于一个叫misc
的模块,这个单元(或者所有的单元)中所有的东西都是私有(private
)的。
现在,这我们关注于如何将单元内的东西展现出来之前,让我们学习一下如何载入一个单元。这就是requires
出现的原因。requires
使用来载入一个模块的,这就是为什么我们将它的返回值赋给一个特定的变量。
var misc = require('./misc');
当然啦,只要我们的单元没有显示任何它内部的东西,上述的语句是起不到什么作用的。我们可以使用module.exports
来输出一个模块中我们希望输出的任何内容:
//file misc.js
var x = 5;
var addX = function(value){
return value + x;
};
module.exports.x = x;
module.exports.addX = addX;
现在,我们可是使用我们的载入单元了
var misc = require('./misc');//(译者注:两个文件在同一级目录中)
console.log("Adding %d to 10 gives us %d", misc.x,misc.addX(10));
//output: Adding 5 to 10 gives us 15
还有另一种方式输出一个模块中的内容:
//file user.js
var User = function(name, email){
this.name = name;
this.email = email;
};
module.exports = User;
这个区别是细小但是重要的不是吗。看到了吧?我们直接将user
输出了, 没有任何的间接手段。对于以下两个用法的区别
//file user.js
module.exports.User = User;
//vs
module.exports = User;
全都在于在引用时的使用方法
var user = require('./user');
var u = new user.User();
//vs
var u = new user();
重点在于你的单元是否是需要输出数据的容器(container)。你完全可以在同一个单元中同时使用这两种输出方式,但我相信这会导致一个十分丑陋的用户接口(API)。
最后一件需要关注的东西是如果你以如下方式输出一个函数
//file powerLevel.js
var powerLevel = function(level){
return level > 9000 ? "it's over 9000!!!" : level;
};
module.exports = powerLevel;
当你引入上述文件,那么返回值就是这个文件中的函数。这就意味着你可以这么做
require('./powerLevel')(9050);//output:9050
这就是以下版本的压缩版
var powerLevel = require('./powerLevel');
powerLevel(9050); //output: 9050
希望对你有所帮助!