Относительные пути проекта на основе корня для модулей NodeJS - PullRequest
0 голосов
/ 19 января 2019

Работа с включением модулей в моих проектах NodeJS Я всегда немного затрудняюсь с указанием путей к файлам других модулей проекта, которые требуются.

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

const helper = require("../../lib/util/helpers.js

Это имеет некоторые недостатки:

  1. Мне всегда нужно учитывать, где находится файл, из которого мне требуется другой модуль.

  2. По мере роста проекта мне иногда приходится перемещать некоторые файлы в другое место из-за реструктуризации проекта, поэтому мне нужно просматривать не только пути к файлам, требующим его, но также и пути всех модулей, которые требуются в файле, которым я являюсь перемещение.

Я всегда думал, что было бы намного яснее, если бы я мог указать пути относительно корня проекта вместо самого файла. Для ясности, именно здесь находится мой файл package.json (или каталог node_modules).

Я знаю, что могу определить путь к любому внешнему модулю, используя require.resolve(), и хотя я мог бы сделать что-то вроде path.dirname(path.dirname(path.dirname(require.resolve('express')))), но мне он кажется слишком грязным.

К сожалению, насколько мне известно, не существует никакого свойства require.modules_path или require.projectRoot, поэтому мне нужно полагаться на какой-то трюк, подобный тому, который я упомянул выше, или обход всего дерева до первого родительского каталога, содержащего package.json файл.

У меня вопрос: есть ли лучшее решение, которого мне не хватает?

1 Ответ

0 голосов
/ 19 января 2019

Я подошел к, даже не идеальному, приемлемому решению, используя Symbol для сохранения корневого пути проекта в качестве свойства объекта process.

Используя символ для присвоения имени этому свойству, мы избегаем любой возможности столкновение с другими process свойствами объекта, даже с будущим из них.

Я просто добавил эти две строки в мой app.js (который в проектах Express помещается в корневой каталог проекта и требуется от главной точки входа приложения bin/www, где я также гарантировал, что это первая требуемая зависимость) :

const $root = Symbol.for("projectRoot");                                         │     return new Promise(function (resolve, reject) {
process[$root] = __dirname;

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

const $root = Symbol.for("projectRoot");

... и использовать его во всех операторах . Например:

const helper = require(process[$root]+"/lib/util/helpers.js

Возможно, это далеко от совершенства, но у меня это работает ...

...