Единственное другое решение, о котором я могу подумать, - это сделать необходимые классы глобальными, чтение в Интернете кажется плохой практикой.
Вы правы, создание глобальных переменных должностарайтесь избегать как можно большего, поскольку это способствует хрупкому и трудному отладке кода.
Каждый файл можно рассматривать как модуль.Мне лично нравится хранить по одному файлу на класс, поэтому я могу рассматривать сам класс как модуль.В каждом модуле вы должны require
каждый класс, от которого вы зависите.
Поэтому я буду использовать классический пример Animal / Cat / Dog:
//Animal.js
module.exports = class Animal { ... }
//Cat.js
const Animal = require('./Animal');
class Cat extends Animal { ... }
//Dog
const Animal = require('./Dog');
class Dog extends Animal { ... }
В NodeJS, хотяоба Cat
& Dog
требуют Animal
, Animal.js выполняется только один раз.Таким образом, каждый модуль, которому требуется Animal
, получит тот же класс Animal
.
Я мог бы просто включить необходимые классы в конструктор класса, который их требует.
Я бы тоже этого не делал.Использование require
в конструкторе, даже если файл require
будет выполнять файл только в первый раз, когда он был необходим, он все равно проходит через алгоритм разрешения файла узла, который является дорогостоящим процессом и может вызвать узкие места в производительности.Обычно лучше, чтобы ваши операторы require
находились вне конструкторов или функций.Держите их в верхней части файла, где все требования будут запускаться один раз при загрузке приложения.
Как вы теперь можете видеть внутри TagRepository, для него требуются два класса, класс Tag и TagCollection.Я пойду по этому поводу?
Внутри TagRepository.js вам просто нужно просто иметь 2 оператора include, по одному для каждого файла, см. Ниже.
const Tag = require('./Tag');
const TagCollection = require('./TagCollection.js');
// Both Tag and TagCollection is now usable
class TagRepository { ... }
Дополнительная информация о модулях NodeJSможно найти здесь
https://nodejs.org/dist/latest-v10.x/docs/api/modules.html#modules_modules