узел модуль модулей несколько направлений вызова

Хорошо, фактическая конечная причина этого состоит в том, чтобы иметь папку с хорошо упорядоченными модулями (в данном случае функциями). Структура папки должна быть примерно такой:

  • /app.js
  • /node_modules/
    • /mainfunction.js
    • /functions/
      • /func1.js
      • /func2.js
      • /func3.js
      • /func4.js
      • /...

mainfunction.js:

exports.func1 = require("./functions/func1");
exports.func2 = require("./functions/func2");
exports.func3 = require("./functions/func3");
exports.func4 = require("./functions/func4");

Итак, из app.js или любой другой части приложения я могу использовать эти функции, просто реализуя mainfunction.js следующим образом:

var f = require("mainfunction"); //And also require the others cores module 'path, fs,..."
//then you can call the module directly.
f.func1(input)
//Or store it in a variable
var area = (new) f.func3(width)  //sometimes **new** is needed when there is no input.

Эта информация доступна в API Node.js.

Проблемы начинаются сейчас.

Некоторые модули требуют, чтобы другие работали, есть много взаимосвязей, подобных этим примерам:

  1. Func2 требует ответа Func1
  2. Func3 требует ответа Func2, а помимо него Func1 (поэтому Func1 требуется дважды)
  3. Для Func4 требуется основной модуль (fs, path, ...) и другие функции.

Нужно ли повторно объявлять все переменные, которые нужны каждой функции (независимым модулям)?

пример Func5.js:

var answer;
var func2 = require("./func2");            //redeclare modules needed
var fs = require("fs");                    //redeclare core modules needed

module.exports = function(input) {         //do some stuff
    fs.exist("x.html", function (exist) {
        if(exist){
            answer = func2(input);
        }
     }
     return answer;
}

Я не хочу повторно объявлять модуль необходимым, я просто хочу использовать «f.funcX (ввод)», чтобы использовать функцию в любой области, даже внутри модуля. Это возможно?

Любое предложение хорошо принимается. Спасибо.

Еще один предполагаемый вариант (отредактировано)

Хорошо, автономные модули выигрывают, но как насчет этого? (я даже не знаю, работает ли это).

Та же структура папок и файлов. Но mainfunction.js имеет:

module.exports = {
    require("./functions/func1"),
    require("./functions/func2"),
    require("./functions/func3"),
    require("./functions/func4"),
    ...
}

И каждый файл функции имеет то же самое, но без переобъявленных модулей, вместо этого имеет «exports.functX», и для вызова других модулей используется имя этой функции (модуля).

Это может не сработать, это просто идея.


person Ignacio Bustos    schedule 16.07.2014    source источник
comment
Должен ли я повторно объявлять все переменные, которые нужны каждой функции (независимым модулям)? Возможно, вы каким-то образом сможете использовать глобальные переменные, но хорошей практикой является require все, что нужно модулю. Это делает модуль автономным и упрощает его рассмотрение. Представьте, что вы проектируете модуль А так, чтобы он зависел от глобальной переменной foo. Каждый модуль, которому требуется A, теперь должен гарантировать, что foo существует в глобальной области видимости, т. е. ему нужны знания о внутренностях A. Не беспокойтесь о том, что модули требуются несколько раз, они все равно оцениваются только один раз.   -  person Felix Kling    schedule 16.07.2014
comment
Думаю, я сделаю то, что вы сказали, но взгляните на отредактированную часть в конце, возможно, это правильный выбор.   -  person Ignacio Bustos    schedule 16.07.2014


Ответы (1)


Func3 требует ответа Func2, а помимо него Func1 (поэтому Func1 требуется дважды)

Как оказалось, в этой ситуации система загрузки модулей Node не требует Func1 дважды. Процесс кэширует экспорт Func1 и, когда требуется во второй раз, просто возвращает исходный момент Func1.

Должен ли я повторно объявлять все переменные, которые нужны каждой функции (независимым модулям)?

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

Однако технически возможна универсальная загрузка. Одной из возможных конфигураций может быть загрузка каждого модуля в глобальное пространство имен (process), но, по словам Дуглас Крокфорд, "Глобалы - зло". Модуль будет доступен в любом месте процесса Node, даже в модулях, которые не имеют ничего общего с вашим. По сути, шаблон require, который вы видите повсюду, на самом деле является лучшим способом загрузки зависимостей в node.

Хорошо, автономные модули выигрывают, но как насчет этого? (я даже не знаю, работает ли это). [...]

Я думаю, вы имеете в виду это?

module.exports = {
    func1: require("./functions/func1"),
    func2: require("./functions/func2"),
    func3: require("./functions/func3"),
    func4: require("./functions/func4"),
    ...
}

Как правило, это хороший шаблон, если у вас есть модуль с множеством независимых подмодулей, которые можно открыть для всего, что требуется; однако было бы невозможно использовать такой шаблон, чтобы разрешить пространство имен на уровне проекта, потому что для Func1 потребуется mainfunction.js потребуется Func1, и так далее до бесконечности. (Это известно как циклическая зависимость.)

Короче говоря, не беспокойтесь о повторяющихся требованиях к модулям. В конце концов, стандартный шаблон не повторяется, потому что каждый модуль будет иметь разные требования и зависимости, а также не позволяет модулю запускаться более одного раза, как объяснялось выше.

Удачи в ваших начинаниях с Node.js!

person Casey Chow    schedule 16.07.2014
comment
Идеальный ответ. Спасибо, моя цель, кстати, заключалась не в том, чтобы иметь глобальную (или, по крайней мере, это не намерение), а в том, чтобы иметь всего одну строку кода, вызывающую все, что я создал, и использовать ее при необходимости. Как-то так, как Include в PHP, и с ним все ваши файлы будут упорядочены и их будет легче искать. - person Ignacio Bustos; 16.07.2014