#node.js
#node.js
Вопрос:
У меня есть следующая структура проекта
|server
|- module1.js
|- module2.js
|app.js
module1.js выглядит следующим образом
module.exports = {
f1 : function(){ ... },
...
fN : function(){ ... }
};
module2.js выглядит следующим образом
module.exports = {
t1 : function(){ ... },
...
tN : function(){ ... }
};
В app.js Я использую оба этих модуля
var M1 = require('./module1.js');
var M2 = require('./module2.js');
Итак, прямо сейчас я могу использовать M1.f1()
, M2.t1()
. Проблема в том, что в module2 я должен использовать функции из module1. Если я определяю t1 как function(){ M2.f1(); …. }, это генерирует ошибку, сообщающую, что M2 не определен.
Как я могу это исправить? (Я знаю, что могу потребовать module2 в module1, но это просто не кажется правильным)
Ответ №1:
1) Требовать M1
в M2
. Не уверен, почему вы считаете, что это «неправильно», но это законный способ справиться с этим.
2) После объявления M1 - require('./module1.js');
передайте M1
в M2
, чтобы ее можно было использовать в M2
. Это даст вам доступ к находящимся там свойствам. В итоге вы получите что-то похожее var M2 = require('./module2.js')(M1)
. На мой взгляд, это начинает усложнять ситуацию больше, чем требуется в # 1…
3) Если вы хотите использовать одну и ту же функцию в обоих…тогда, возможно, вам нужен третий модуль. Этот третий модуль экспортировал бы функции, которые оба M1
и M2
будут представлены как методы.
Этот третий способ, вероятно, является лучшим, если вы сталкиваетесь с кучей часто используемых функций, которые не тесно связаны с тем или иным объектом. Создание служебного модуля, который экспортирует эти общие функции (примерами являются функции файла или базы данных) для повторного использования в других, является распространенным подходом.
Обратите внимание, что в конечном итоге вам потребуется этот третий модуль в обоих исходных двух … что, я думаю, разумно, учитывая способ организации кода, так что вам требовалась «библиотека утилит», которая используется двумя другими модулями.
Ответ №2:
Другим вариантом (помимо требования module1 в module2) было бы передать функции в module2:
// module2.js
module.exports = function(mod1) {
// use mod1.f1, ..., mod1.fN anywhere in here
return {
t1 : function(){ ... },
tN : function(){ ... }
};
};
// main.js
var M1 = require('./module1.js');
var M2 = require('./module2.js')(M1);