Node.js 模块系统

Node.js使用基于模块系统的文件。每个文件就是它自己的模块。每个文件都可以使用 module 变量访问当前模块定义。当前模块的导出由 module.exports 变量确定。要导入模块,请使用全局变量的require函数。

例子

以下代码在文件 myData.js 中创建一个函数,以便在应用程序的各个部分重复使用。要从位于c:/intro/base/myData.js中的文件导出函数,我们只需将其分配给module.exports。

  1. module.exports = function () {
  2. console.log("a function in file myData");
  3. };

为了从文件c:/intro/base/myValue.js使用此函数,使用全局 require 函数导入myData,并将返回的值存储在局部变量中。

  1. var myData = require("./myData");
  2. myData(); // logs out : "a function in file myData"

module.export

Node.js中的每个文件都是一个模块。要从模块导出的项目应该附加到module.exports变量。module.exports被定义为每个文件中的一个新的空对象。module.exports = {}是隐式存在。

默认情况下,每个模块导出一个空对象, {}

  1. console.log(module.exports); // {}

导出别名

我们可以从模块中导出多个变量。实现这一点的一种方法是创建一个新的对象字面量并将其分配给module.exports。在c:/intro/exports/myData1.js我们有:

  1. var a = function () {
  2. console.log("a called");
  3. };
  4. var b = function () {
  5. console.log("b called");
  6. };
  7. module.exports = {
  8. a: a,
  9. b: b
  10. };

在c:/intro/exports/myData2.js我们有:

  1. module.exports.a = function () {
  2. console.log("a called");
  3. };
  4. module.exports.b = function () {
  5. console.log("b called");
  6. };

Node.js帮助我们为module.export创建一个名为exports的别名,而不是每次都键入module.exports.something,你可以简单地使用exports.something。

在c:/intro/exports/myData3.js我们有

  1. exports.a = function () {
  2. console.log("a called");
  3. };
  4. exports.b = function () {
  5. console.log("b called");
  6. };

exports 就像任何其他的JavaScript变量一样。Node.js只是export = module.exports。如果我们添加一些东西,例如,添加myData到exports,也就是exports.myData = 123,因为JavaScript变量是引用,我们可以有效地实现module.exports.myData = 123。以下代码显示,所有这些方法从消费(导入)角度来看是等效的。

在c:/intro/exports/app.js我们有

  1. var myData1 = require("./myData1");
  2. myData1.a();
  3. myData1.b();
  4. var myData2 = require("./myData2");
  5. myData2.a();
  6. myData2.b();
  7. var myData3 = require("./myData3");
  8. myData3.a();
  9. myData3.b();

模块的最佳实践

不要使用.js扩展名

最好是做require('./myData')而不是require('./myData.js'),即使两者对Node.js都很好。

相对路径

当使用基于文件的模块时,你需要使用相对路径(换句话说,做require('./myData')而不是require('myData'))。

利用exports

当你想要导出多个事物时,尝试并使用exports alias。

以下代码显示如何创建本地变量并导出

  1. var myData = exports.myData = /* whatever you want to export as `myData` from this module */ ;

导出整个文件夹

如果有太多你持续导入到其他文件的模块在一起,尽量避免重复导入。

  1. var myData = require("../something/myData");
  2. var myValue = require("../something/myValue");
  3. var another = require("../something/another");
  4. var third = require("../something/third");

相反,在something文件夹中创建一个单独的index.js。在index.js中,导入所有模块一次,然后从此模块导出它们。

在c:/yourFolder/index.js我们有

  1. exports.myData = require("./myData");
  2. exports.myValue = require("./myValue");
  3. exports.another = require("./another");
  4. exports.third = require("./third");

现在你可以在每当你需要所有这些时简单地导入这个index.js:

  1. var something = require("../something/index");