В node.JS, как я могу получить путь к модулю, который я загрузил через require, это * not * mine (то есть в некоторый node_module)
Мне нужен модуль, который был установлен через npm. Я хочу получить доступ к файлу .js, подчиненному этому модулю (поэтому я могу подклассифицировать в нем метод Constructor). Я не могу (ну, не хочу) изменять код модуля, поэтому не имеет места для извлечения его __dirname.
Мне известен следующий вопрос, но речь идет о том, чтобы получить путь к модулю, который имеет контроль над кодом (следовательно, __dirname является решением):
В Node.js, как я могу указать путь к этому модулю?
~~~
Еще лучше было бы получить информацию о загруженном модуле модуля
Ответы
Ответ 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
сканировать мой компьютер в поисках модулей в другом месте, кроме корневой папки проекта, где он должен был запускаться или в пути поиска по умолчанию.