Nodejs获取`required`模块的目录

时间:2013-02-28 19:10:35

标签: javascript node.js require

是否可以确定required脚本来自哪个目录?

我的最终目标是......

// return the directory where `mysql` module is found
var mysqldir = requiredir('mysql')
if(fs.existsSync(mysqldir+"/README.md")){
  console.log(fs.readFileSync(mysqldir+"/README.md").toString())
}

因此,我可以为所有这些模块提供方便的参考,并且希望未来开明的人们将包含旨在以这种方式访问​​的模块文档/备忘单

3 个答案:

答案 0 :(得分:3)

required.resolve(...)可能是您正在寻找的内容:

function requiredir(id) {
    return path.dirname(require.resolve(id));
}

但是,这将遵循main设置:

> requiredir('grunt')
.../node_modules/grunt/lib/

更新 :API的文档不再可用,因此可能不支持其使用。)另一个选项可能是使用npm的{​​{1}},但这仅限于已注册的软件包:

view

答案 1 :(得分:2)

如果要确定模块的绝对路径,可以使用require.resolve('module')

http://nodejs.org/api/globals.html#globals_require_resolve

您可以通过正则表达式

提取文件夹路径

答案 2 :(得分:1)

如果您想以编程方式了解nodejs正在使用的模块主目录,则可以正常使用

require.resolve('module_name').replace(/(.*node_modules.)(.*?)(\/)(.*)/, `$1$2`)

实施例

例如,如果您想知道您在nodejs代码中使用的模块jquery的模块主目录的位置,那么第一部分

require.resolve('jquery') 

返回(在我的情况下)

/home/jfolpf/autocosts/node_modules/jquery/dist/jquery.js

注意jquery.js未存储在模块主目录中;尽管如此

require.resolve('jquery').replace(/(.*node_modules.)(.*?)(\/)(.*)/, `$1$2`)

返回

/home/jfolpf/autocosts/node_modules/jquery

这考虑到要解析模块的路径,节点总是递归寻找名为node_modules的文件夹,如documentation中所示。