Подтвердить что ты не робот

В node.JS, как я могу получить путь к модулю, который я загрузил через require, это * not * mine (то есть в некоторый node_module)

Мне нужен модуль, который был установлен через npm. Я хочу получить доступ к файлу .js, подчиненному этому модулю (поэтому я могу подклассифицировать в нем метод Constructor). Я не могу (ну, не хочу) изменять код модуля, поэтому не имеет места для извлечения его __dirname.

Мне известен следующий вопрос, но речь идет о том, чтобы получить путь к модулю, который имеет контроль над кодом (следовательно, __dirname является решением): В Node.js, как я могу указать путь к этому модулю?

~~~

Еще лучше было бы получить информацию о загруженном модуле модуля

4b9b3361

Ответ 1

Если я правильно понимаю ваш вопрос, вы должны использовать require.resolve():

Используйте внутреннее устройство require() для поиска местоположения модуля, но вместо загрузки модуля просто верните разрешенное имя файла.

Пример: var pathToModule = require.resolve('module');

Ответ 2

Надеюсь, я правильно понял ваши потребности: получить файл точки входа для некоторого модуля. Скажем, вы хотите получить точку входа модуля jugglingdb:

node
> require('module')._resolveFilename('jugglingdb')
'/usr/local/lib/node_modules/jugglingdb/index.js'

Как вы можете видеть, это не "официальный" способ получить такую ​​информацию о модуле, поэтому поведение этой функции может измениться с версии на версию. Я нашел его в node источнике: https://github.com/joyent/node/blob/master/lib/module.js#L280

Ответ 3

Согласно решению @anatoliy, на MacOS X я нашел пути поиска, выполняющие

require('module')._resolveLookupPaths('myModule')

поэтому я получаю разрешенные пути поиска

[ 'myModule',
  [ '/Users/admin/.node_modules',
    '/Users/admin/.node_libraries',
    '/usr/local/lib/node' ] ]

тогда как

require('module')._resolveFilename('myModule')

не разрешит модуль, который я искал в любом случае, на самом деле сумасшедшая вещь заключается в том, что _load не решит модуль:

> require('module')._load('myModule')
Error: Cannot find module 'myModule'
    at Function.Module._resolveFilename (module.js:440:15)
    at Function.Module._load (module.js:388:25)
    at repl:1:19
    at sigintHandlersWrap (vm.js:32:31)
    at sigintHandlersWrap (vm.js:96:12)
    at ContextifyScript.Script.runInContext (vm.js:31:12)
    at REPLServer.defaultEval (repl.js:308:29)
    at bound (domain.js:280:14)
    at REPLServer.runBound [as eval] (domain.js:293:12)
    at REPLServer.<anonymous> (repl.js:489:10)

а require будет:

> require('myModule')

но у меня нет этого модуля в

myProject/node_modules/
myProject/node_modules/@scope/
/usr/local/lib/node_modules/
/usr/local/lib/node_modules/@scope
/usr/local/lib/node_modules/npm/node_modules/
/usr/local/lib/node_modules/npm/node_modules/@scope
$HOME/.npm/
$HOME/.npm/@scope/

так где же этот модуль???

Сначала мне пришлось сделать $ sudo /usr/libexec/locate.updatedb Затем после некоторого кофе я сделал locate myModule или лучше locate myModule/someFile.js

et voilà, выясняется, что он был в родительской папке моего проекта, то есть вне корневой папки проекта:

$pwd
/Users/admin/Projects/Node/myProject
$ ls ../../node_modules/myModule/

поэтому вы не можете избежать rm -rf ../../node_modules/myModule/ и нового npm install.

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