Как управлять несколькими файлами JS на стороне сервера с помощью Node.js

Я работаю над проектом с Node.js, а код на стороне сервера становится настолько большим, что я хотел бы разделить его на несколько файлов. Похоже, что это было сделано на стороне клиента целую вечность, разработка выполняется путем вставки тега script для каждого файла, и только для распространения это что-то вроде "Make", используемого для объединения всего. Я понимаю, что нет смысла конкатцировать весь серверный код, поэтому я не спрашиваю, как это сделать. Самая близкая вещь, которую я могу найти, - это require(), но она не очень похожа на script в браузере, поскольку файлы require'd не имеют общего пространства имен.

Посмотрев на несколько старых проектов Node.js, например Shooter, похоже, что это было когда-то не так, или я В моем коде отсутствует что-то действительно простое. Моим файлам require'd не удается получить доступ к глобальному пространству имен во время компиляции или времени выполнения. Есть ли простой способ обойти это или мы вынуждены сделать все наши требуемые JS файлы полностью автономными из области вызова?

Ответ 1

Вам не нужно распространенное пространство имен, потому что глобальные значения являются злыми. В node мы определяем модули

// someThings.js

(function() {
    var someThings = ...;

    ...

    module.exports.getSomeThings = function() {
        return someThings();
    }

}());

// main.js

var things = require("someThings");
...
doSomething(things.getSomeThings());

Вы определяете модуль, а затем публикуете публичный API для своего модуля, пишите в exports.

Лучший способ справиться с этим - инъекция зависимостей. Ваш модуль предоставляет функцию init, и вы передаете хеш-объект зависимостей в свой модуль.

Если вы действительно настаиваете на доступе к глобальной области, то вы можете получить доступ к этому через global. Каждый файл может записывать и читать объект global. Опять же, вы не хотите использовать глобальные переменные.

Ответ 2

re @Raynos answer, если файл модуля находится рядом с файлом, который включает его, он должен быть

var things = require("./someThings");

Если модуль опубликован и установлен через npm или явно помещен в папку ./node_modules/, тогда

var things = require("someThings");

является правильным.