Модуль NodeJS не доступен в других модулях

Я немного новичок в NodeJS. Возможно, это так, как это работает, но, чтобы быть уверенным:

My '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

Как я читал, "решение" для этого - "потребовать" fs-модуль в app.js. Теперь я понимаю, что fs-модуль кэшируется (любой модуль, но с использованием примера), поэтому Node будет по-прежнему очень быстрым. То, что я на самом деле не получаю, это: "Если fs-модуль кэшируется, так что на самом деле он все равно доступен, почему мне все еще нужно" требовать "модуль?

Буду честным; это просто понять, почему.

Ответ 1

Каждый файл должен содержать ссылки на модули

index.js

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

// you can now use `fs`

otherfile.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 он не "повторно требует" его столько, сколько вы просто объявляете переменную, указывающую на кешированный модуль.


Дополнительный пример:

В этом ответе Я подробно расскажу о том, как структурировать простое приложение, которое позволяет избежать использования глобальных символов.

Ответ 2

Seomtiems мы можем его забыть, но это фундаментально, чтобы объявить это:

var fs = require('fs');