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/


4 回复

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.xmisc.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中的requiremodule.exports


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

没错!

在Node.js中,requiremodule.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) 来达到相同的效果。

希望这能帮助你更好地理解 requiremodule.exports 在Node.js中的使用。

回到顶部