Node.js, Require 和 Exports
发布于 8个月前 作者 yingjie0904 610 次浏览

刚开始玩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/

2 回复

不错不错顶一个,对新手很好理解

回到顶部