20

我对 NodeJS 有点陌生。也许这只是它的工作方式,但可以肯定的是:

我的'index.js':

var fs = require('fs');
// do something with fs here
var app = require('./app.js');

'app.js'

fs.readFile('/somedir/somefile.txt', 'utf8', function (err,data) {
  if (err) {
    return console.log(err);
  }
  console.log(data);
});

然后我得到一个错误:

ReferenceError: fs is not defined

正如我所读到的,对此的“解决方案”是“重新要求”app.js 中的 fs 模块。现在我所理解的是 fs-module 被缓存(任何模块,但使用示例),因此 Node 仍然会非常快。我真正没有得到的是:“如果 fs-module 被缓存了,那么实际上它还是有点可用的,为什么我仍然必须'重新要求'该模块?

我会诚实的;这只是为了理解为什么。

4

2 回答 2

36

每个文件都必须包含对模块的引用

index.js

var fs    = require("fs"),
    other = require("./otherfile"); 

// you can now use `fs`

其他文件.js

var fs = require("fs");

// you can now use `fs` here

关于这一点的最好的部分之一是您不会被锁定在任何给定文件中以某种方式命名变量。每个文件都与您的库中的所有其他文件几乎隔离,这是一件非常好的事情。

还知道如果您愿意,您可以只包含模块的一部分

var read = require("fs").readFile;

read("myfile.txt", function(err, data) {
  if (error) {
    return throw error;
  }
  console.log(data);
};

解释:

Node.js 不鼓励使用全局变量;因此,您不应该尝试实现依赖于全局变量的东西。

当您再次调用fs模块时,它并不是真正“重新要求”它,因为您只是声明了一个指向缓存模块的变量。


附加示例:

这个答案中,我将详细介绍如何构建一个避免使用全局变量的简单应用程序。

于 2013-08-27T16:17:08.407 回答
4

有时我们可以忘记它,但声明它是基本的:

var fs = require('fs');
于 2017-03-05T08:49:30.530 回答