刚开始玩node.js的时候,有个东西一直困扰着我,很不舒服。我说的是module.exports
,很尴尬是吧!因为它是node.js非常基础的一部分,也非常简单。其实,现在想起来,也不知道当初困扰我的是什么,只记得糊里糊涂的。不只是我,可能其他人也有类似的体会,在开始理解之前需要反复琢磨。现在觉得可以写一些东西出来。
Node里面,有些东西只能在同一个文件里使用,这里指的是变量,函数,类以及类成员。那么,看一下下面这个mis.js文件:
var x = 5;
var addX = function(value) {
return value + x;
};
另一个文件不能访问x
变量或addx
函数,这和var关键字的使用没有关系。而基本的Node创建模块叫做一个module,直接映射到一个文件。所以我们可以这样说,上面的文件对应一个名字为file1
的模块,模块(或任何模块)里的所有东西都是私用的。
现在,在看如何让一个模块里的东西暴露之前,先来看加载模块。这就要用到require
了,因为它是用来加载模块的,所以它的返回值要赋值给一个变量:
var misc = require('./misc');
当然,只要我们的模块不让任何东西暴露,上面的就不会很有用。我们使用module.exports
进行暴露,然后输出我们想要的任何东西:
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));
在一个模块里进行暴露,还有另一种方法:
var User = function(name, email) {
this.name = name;
this.email = email;
};
module.exports = User;
区别很小,但很重要。看到了吗?我们直接输出user
,没有任何迂回。以下两者的不同:
module.exports.User = User;
//vs
module.exports = User;
是:它们是如何被使用的:
var user = require('./user');
var u = new user.User();
//vs
var u = new user();
这还真是个事儿:你的模块是装了输出的值,还是没有,其实你可以在同一个模块里同时放两个,但我觉得出来的API一定难看透了。
最后要考虑的是:当直接输出一个函数时会发生什么:
var powerLevel = function(level) {
return level > 9000 ? "it's over 9000!!!" : level;
};
module.exports = powerLevel;
当你获取上面的文件时,返回的值是实际的函数。这意味着你可以这样:
require('./powerlevel')(9050);
其实它只是下面的一个精简版本:
var powerLevel = require('./powerlevel')
powerLevel(9050);
Hope that helps!
From:http://openmymind.net/2012/2/3/Node-Require-and-Exports/