NodeJS所需的模块在其他模块中不可用

Pet*_*nee 20 module require node.js

我对NodeJS有点新意.也许它只是它的工作方式,但要确定:

我的'index.js':

var fs = require('fs');
// do something with fs here
var app = require('./app.js');
Run Code Online (Sandbox Code Playgroud)

'app.js'

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

然后我收到一个错误:

ReferenceError: fs is not defined
Run Code Online (Sandbox Code Playgroud)

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

我会说实话; 这只是为了理解原因.

Tha*_*you 36

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

index.js

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

// you can now use `fs`
Run Code Online (Sandbox Code Playgroud)

otherfile.js

var fs = require("fs");

// you can now use `fs` here
Run Code Online (Sandbox Code Playgroud)

关于这一点的最好的部分之一是你没有被锁定在任何给定文件中以某种方式命名变量.每个文件都与lib中的所有其他文件完全隔离,这是一件非常好的事情.

还要知道,如果您愿意,您可以只包含一个模块

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

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

说明:

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

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


附加示例:

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