В узлах.JS как я могу получить путь к модулю, который я загрузил через require, который *не * мой (т. е. в каком-то узловом модуле)


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

Я знаю о следующем вопросе, но речь идет о получении пути модуля, над которым есть контроль кода (следовательно, __dirname-это решение): в узлах.js как я могу сказать путь `это` модуль?

~~~

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

6 64

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 модуль:

node
> require('module')._resolveFilename('jugglingdb')
'/usr/local/lib/node_modules/jugglingdb/index.js'
https://github.com/joyent/node/blob/master/lib/module.js#L280

согласно решению @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 для сканирования моего компьютера в поисках модулей в другом месте, чем мой корневая папка проекта, в которой он должен был выполняться, или в пути поиска модулей по умолчанию.

Это может быть то, что вы ищете, проверить:

требуют.главный.имя файла

к вашему сведению,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 чтобы решить путь к файлу (узел)