我需要一个通过npm安装的模块。我想访问该模块的一个.js文件(这样我就可以在其中子类化一个Constructor方法)。我不能(嗯,不想)修改模块的代码,所以没有地方提取它的__dirname。
我知道下面的问题,但它是关于获得一个代码控制的模块的路径(因此,__dirname是解决方案):In Node.js how can I tell the path of this
module?
更好的方法是获取模块的已加载模块信息
我需要一个通过npm安装的模块。我想访问该模块的一个.js文件(这样我就可以在其中子类化一个Constructor方法)。我不能(嗯,不想)修改模块的代码,所以没有地方提取它的__dirname。
我知道下面的问题,但它是关于获得一个代码控制的模块的路径(因此,__dirname是解决方案):In Node.js how can I tell the path of this
module?
更好的方法是获取模块的已加载模块信息
8条答案
按热度按时间wrrgggsh1#
如果我正确理解了您的问题,您应该使用require.resolve():
使用内部的require()机制来查找模块的位置,但不是加载模块,而是返回解析后的文件名。
示例:
var pathToModule = require.resolve('module');
bz4sfanl2#
require.resolve()是一个部分的答案。被接受的答案可能对许多节点模块都有效,但不会对所有节点模块都有效。
require.resolve("moduleName")
没有给予模块的安装目录;它给出了在模块的package.json
中的main
属性中定义的文件的位置。这可能是 *
moduleName/index.js
*,也可能是 *moduleName/lib/moduleName.js
。在后一种情况下,path.dirname(require.resolve("moduleName"))
将返回您可能不需要或不期望的目录: 一米六纳一x *获取特定模块的完整路径的正确方法是解析文件名:
如果你只需要模块的目录(也许你会做很多
path.join()
调用),那么解析package.json
-它必须总是在项目的根目录下-并传递给path.dirname()
:ctrmrzij3#
仅供参考,
require.resolve
根据CommonJS返回模块标识符。在node.js中,这是文件名。在webpack中,这是一个数字。在webpack情况下,下面是我找出模块路径的解决方案:
然后从
__webpack_modules__[pathToModule]
我得到了这样的信息:原来我需要以前的dll构建文件中的旧脚本(为了更快的构建速度),所以我更新的模块文件没有像我预期的那样工作。最后我重建了dll文件,解决了我的问题。
参考:Using
require.resolve
to get resolved file path (node)ccrfmcuu4#
Jason的答案是最好的答案,直到Node.js ESM和
exports
字段出来。既然Node支持带有
exports
字段的包,默认情况下,该字段将 * 阻止像package.json
这样的文件被解析 *,除非包作者明确决定公开它们,那么对于没有明确公开package.json
的包,Jason答案中的技巧将失败。有一个名为
resolve-package-path
的软件包可以做到这一点。使用方法如下:
它将输出类似于
而不管包的
exports
字段包含什么。pepwfjgg5#
我希望我能正确理解您的需求:来获取某个模块的入口点文件。假设你想获取
jugglingdb
模块的入口点:正如您所看到,这不是获取模块信息的“官方”方式,因此该函数的行为可能会因版本而异。https://github.com/joyent/node/blob/master/lib/module.js#L280
jckbn6z76#
根据@anatoliy解决方案,在MacOS X上,我找到了查找路径
这样我就得到了解析后的查找路径
而
无论如何都不会解析我正在寻找的模块,事实上疯狂的是
_load
不会解析模块:而
require
将:但我没有这个模块
那么这个模块在哪里?
首先,我必须做一个
$ sudo /usr/libexec/locate.updatedb
,然后在一些咖啡后,我做了locate myModule
或更好的locate myModule/someFile.js
瞧,它出来,它是在我的项目的父文件夹,即.我的项目根文件夹之外:
因此您无法避免
rm -rf ../../node_modules/myModule/
和一个新npm install
。我可以争辩说,没有人指示
npm
扫描我的计算机,在我的项目根文件夹以外的地方搜索模块,在那里它应该运行或在默认的模块搜索路径。kyvafyod7#
这也许就是你要找的,检查:
require.main.filename
snvhrwxg8#
下面是一个以平台无关方式返回模块目录的解决方案。该解决方案不使用任何第三方库,并成功找到带有
"type": "module"
的ESM模块和通过npm link
安装的模块。**注意:**如果特定模块是指向另一个位置(例如
npm link
)的符号链接,则需要使用fs.realpath
来获取目标目录的位置:紧急支援模块
普通JS