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