Как управлять несколькими JS-файлами на стороне сервера с Node.js - PullRequest
40 голосов
/ 18 апреля 2011

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

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

Ответы [ 2 ]

59 голосов
/ 18 апреля 2011

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

// 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. Опять вы не хотите использовать глобалы.

34 голосов
/ 28 июля 2011

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

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

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

var things = require("someThings");

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

...