В узлах.JS как я могу получить путь к модулю, который я загрузил через require, который *не * мой (т. е. в каком-то узловом модуле)
Мне нужен модуль, который был установлен через npm. Я хочу получить доступ к .файл JS, в подчинении которого модуль (так я могу подкласс метод конструктора в нем). Я не могу (ну, не хочу) изменить код модуля, поэтому у меня нет места для извлечения его __dirname.
Я знаю о следующем вопросе, но речь идет о получении пути модуля, над которым есть контроль кода (следовательно, __dirname-это решение): в узлах.js как я могу сказать путь `это` модуль?
~~~
еще лучше было бы получить информацию о загруженном модуле модуля
6 ответов:
Если я правильно понял ваш вопрос, вы должны использовать требуют.resolve ():
используйте внутреннее оборудование require () для поиска местоположения модуля, но вместо загрузки модуля просто верните разрешенное имя файла.
пример:
var pathToModule = require.resolve('module');
требуют.resolve () это правильный ответ, но только если вы используете правильные аргументы. Верхний ответ работает для многих модулей узлов, но не будет работать для всех из них.
require.resolve("moduleName")не дает вам каталог, в котором установлен модуль. Это дает вам расположение файла, определенного в атрибуте 'main' в пакете.формат JSON. Это может быть moduleName / index.js или moduleName / lib / moduleName.js. В последнем случае,path.dirname(require.resolve("moduleName")вернет неверный каталог:node_modules/moduleName / libправильный способ найти moduleName/README. md - это вызвать:
let readmePath = require.resolve("moduleName/README.md");если вы просто хотите каталог для модуля (может быть, вы собираетесь сделать много
path.join()вызовы), затем пакет.JSON всегда должен быть в корне проекта:let packagePath = path.dirname(require.resolve("moduleName/package.json"));
надеюсь, я правильно понимаю ваши потребности: получить файл точки входа какого-либо модуля. Допустим, вы хотите получить точку входа
jugglingdbмодуль:https://github.com/joyent/node/blob/master/lib/module.js#L280node > require('module')._resolveFilename('jugglingdb') '/usr/local/lib/node_modules/jugglingdb/index.js'
согласно решению @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.jset voilà, выходит, что он был в родительской папке моего проекта, т. е. вне моей корневой папки проекта:
$pwd /Users/admin/Projects/Node/myProject $ ls ../../node_modules/myModule/так что вы не можете избежать
rm -rf ../../node_modules/myModule/свежийnpm install.я могу утверждать, что никто не поручал
npmдля сканирования моего компьютера в поисках модулей в другом месте, чем мой корневая папка проекта, в которой он должен был выполняться, или в пути поиска модулей по умолчанию.
к вашему сведению,
require.resolveвозвращает идентификатор модуля в соответствии с CommonJS. В узлах.js это имя файла. В webpack это количество.на webpack ситуация, вот мое решение, чтобы узнать путь модуля:
const pathToModule = require.resolve('module/to/require'); console.log('pathToModule is', pathToModule); // a number, eg. 8 console.log('__webpack_modules__[pathToModule] is', __webpack_modules__[pathToModule]);затем с
__webpack_modules__[pathToModule]я получил такую информацию:(function(module, exports, __webpack_require__) { eval("module.exports = (__webpack_require__(6))(85);\n\n//////////////////\n// WEBPACK FOOTER\n// delegated ./node_modules/echarts/lib/echarts.js from dll-reference vendor_da75d351571a5de37e2e\n// module id = 8\n// module chunks = 0\n\n//# sourceURL=webpack:///delegated_./node_modules/echarts/lib/echarts.js_from_dll-reference_vendor_da75d351571a5de37e2e?"); /***/ })оказалось, что мне нужны старые скрипты из предыдущего файла сборки dll (для более быстрой скорости сборки), так что мой обновленный файл модуля не работал, как я ожидаемый. Наконец, я восстановил свой dll-файл и решил свою проблему.
Ref:используя
require.resolveчтобы решить путь к файлу (узел)