Node.js, Require 和 Exports
Node.js, Require 和 Exports
刚开始玩node.js的时候,有个东西一直困扰着我,很不舒服。我说的是module.exports
,很尴尬是吧!因为它是node.js非常基础的一部分,也非常简单。其实,现在想起来,也不知道当初困扰我的是什么,只记得糊里糊涂的。不只是我,可能其他人也有类似的体会,在开始理解之前需要反复琢磨。现在觉得可以写一些东西出来。
<br /> Node里面,有些东西只能在同一个文件里使用,这里指的是变量,函数,类以及类成员。那么,看一下下面这个mis.js文件:
var x = 5;
var addX = function(value) {
return value + x;
};
<br />
另一个文件不能访问x
变量或addx
函数,这和var关键字的使用没有关系。而基本的Node创建模块叫做一个module,直接映射到一个文件。所以我们可以这样说,上面的文件对应一个名字为file1
的模块,模块(或任何模块)里的所有东西都是私用的。
<br />
现在,在看如何让一个模块里的东西暴露之前,先来看加载模块。这就要用到require
了,因为它是用来加载模块的,所以它的返回值要赋值给一个变量:
var misc = require('./misc');
<br />
当然,只要我们的模块不让任何东西暴露,上面的就不会很有用。我们使用module.exports
进行暴露,然后输出我们想要的任何东西:
var x = 5;
var addX = function(value) {
return value + x;
};
module.exports.x = x;
module.exports.addX = addX;
<br /> 现在我们可以使用加载的模块了:
var misc = require('./misc');
console.log("Adding %d to 10 gives us %d", misc.x, misc.addX(10));
<br /> 在一个模块里进行暴露,还有另一种方法:
var User = function(name, email) {
this.name = name;
this.email = email;
};
module.exports = User;
<br />
区别很小,但很重要。看到了吗?我们直接输出user
,没有任何迂回。以下两者的不同:
module.exports.User = User;
//vs
module.exports = User;
<br /> 是:它们是如何被使用的:
var user = require('./user');
var u = new user.User();
//vs
var u = new user();
<br /> 这还真是个事儿:你的模块是装了输出的值,还是没有,其实你可以在同一个模块里同时放两个,但我觉得出来的API一定难看透了。
最后要考虑的是:当直接输出一个函数时会发生什么:
var powerLevel = function(level) {
return level > 9000 ? "it's over 9000!!!" : level;
};
module.exports = powerLevel;
<br /> 当你获取上面的文件时,返回的值是实际的函数。这意味着你可以这样:
require('./powerlevel')(9050);
<br /> 其实它只是下面的一个精简版本:
var powerLevel = require('./powerlevel')
powerLevel(9050);
Hope that helps!
<br />
From:http://openmymind.net/2012/2/3/Node-Require-and-Exports/
Node.js, Require 和 Exports
刚开始玩Node.js的时候,有一个概念一直困扰着我,那就是module.exports
。起初觉得它很难懂,但后来发现其实非常简单。现在回想起来,不知道当初困扰我的到底是什么,只记得当时一头雾水。不过,我相信不止是我一个人有这种感觉,很多人在一开始理解它时也需要反复琢磨。今天,我想分享一下我对这个问题的理解。
模块化
在Node.js中,有些东西只能在同一个文件里使用,比如变量、函数、类及其成员。让我们来看一个例子:
// misc.js
var x = 5;
var addX = function(value) {
return value + x;
};
在这个文件中,定义了一个变量x
和一个函数addX
。然而,另一个文件不能直接访问x
变量或addX
函数。这是因为var
关键字的作用域限制在一个文件内部。为了在Node.js中创建模块,我们通常会将这些变量和函数封装在一个名为module
的对象中。
加载模块
要加载模块,我们需要使用require
函数。require
函数用于导入其他文件中的模块,并将其返回值赋值给一个变量。例如:
// main.js
var misc = require('./misc');
上述代码将misc.js
文件作为模块导入,并将其赋值给变量misc
。此时,misc
变量包含了misc.js
文件中暴露的所有内容。
暴露模块内容
为了让模块中的内容可以被其他文件访问,我们需要使用module.exports
对象。默认情况下,module.exports
是一个空对象,但我们可以通过修改它来暴露我们需要的内容。以下是两种常见的暴露方式:
方式一:
// misc.js
var x = 5;
var addX = function(value) {
return value + x;
};
module.exports.x = x;
module.exports.addX = addX;
这种方式将x
变量和addX
函数添加到了module.exports
对象中。这样,其他文件就可以通过misc.x
和misc.addX
来访问这些内容了。
方式二:
// user.js
var User = function(name, email) {
this.name = name;
this.email = email;
};
module.exports = User;
这种方式直接将User
类赋值给了module.exports
。因此,其他文件可以直接通过new User()
来创建实例。
这两种方式的主要区别在于暴露的内容类型。第一种方式适用于暴露多个变量或函数,而第二种方式适用于暴露单一的对象或类。
直接暴露函数
有时候,我们可能希望直接暴露一个函数,而不是对象。这时,我们可以这样做:
// powerlevel.js
var powerLevel = function(level) {
return level > 9000 ? "it's over 9000!!!" : level;
};
module.exports = powerLevel;
在这种情况下,当我们从powerlevel.js
文件中加载模块时,返回的就是这个函数本身。因此,我们可以直接调用这个函数:
require('./powerlevel')(9050);
或者等价于:
var powerLevel = require('./powerlevel');
powerLevel(9050);
希望这些解释对你有所帮助!
希望这些内容能够帮助你更好地理解和使用Node.js中的require
和module.exports
。
不错不错顶一个,对新手很好理解
没错!
在Node.js中,require
和 module.exports
是非常核心的概念,用于模块化开发。它们允许你在不同的文件之间导入和导出功能。
1. 基本概念
require
: 用于从其他文件中引入模块。module.exports
: 用于将模块的功能导出,以便其他文件可以使用。
2. 导出变量和函数
假设我们有一个名为 misc.js
的文件,其中包含一些变量和函数:
// misc.js
var x = 5;
var addX = function(value) {
return value + x;
};
module.exports.x = x;
module.exports.addX = addX;
在另一个文件中,你可以这样引入并使用这些变量和函数:
// main.js
var misc = require('./misc');
console.log("Adding %d to 10 gives us %d", misc.x, misc.addX(10));
3. 导出整个对象
如果你希望导出一个类或一个对象,可以直接将该类或对象赋值给 module.exports
:
// user.js
var User = function(name, email) {
this.name = name;
this.email = email;
};
module.exports = User;
// main.js
var User = require('./user');
var u = new User('Alice', 'alice@example.com');
4. 导出一个函数
如果你希望导出一个函数,可以直接将该函数赋值给 module.exports
,这样你就可以在引入模块后直接调用这个函数:
// powerlevel.js
var powerLevel = function(level) {
return level > 9000 ? "it's over 9000!!!" : level;
};
module.exports = powerLevel;
// main.js
var powerLevel = require('./powerlevel');
console.log(powerLevel(9050)); // 输出: it's over 9000!!!
通过这种方式,你可以直接调用 require('./powerlevel')(9050)
来达到相同的效果。
希望这能帮助你更好地理解 require
和 module.exports
在Node.js中的使用。