【问题标题】:get path of the file the module is being called from?获取调用模块的文件的路径?
【发布时间】:2014-10-14 09:41:44
【问题描述】:

假设我有一个 node.js 模块

module.exports = function () {
  console.log(__filename);
}

在主文件中我称之为

var x = require('path/to/module');
x();

这给了我模块文件的路径。例如,如果我将模块存储在~/project-root/lib/mod.js 并且main.js 文件位于~/project-root/main.js,则该设置会为我提供输出:

~/project-root/lib/mod.js

我想在模块中使用一些东西来代替__filename,它可以让我找到调用它的文件的位置。 (例如,在本例中,输出将改为 ~/project-root/main.js)。

模块可以位于任何地方。因此使用path 仅针对此示例进行调整在其他情况下会失败(例如,如果模块存储在~/project-root/node_modules/ 或全局node.js 模块目录中。

我觉得这是一件相当微不足道的事情,我忽略了一些事情。但我没有从谷歌在一小时的搜索中找到任何解决方案。也许我使用了错误的关键字!

【问题讨论】:

    标签: node.js module path


    【解决方案1】:

    在您的模块中调用Module.parent 可让您访问调用它的文件的exports

    你可以把下面的函数放在你的main.js中,你可以在你的模块中调用module.parent.filename()

    module.exports.filename = function () { return __filename; }

    【讨论】:

    • 你看到模块必须是公开的,所以任何人都可以做npm install my-module。我正在寻找一种不需要用户的解决方案,即使用该模块的人必须进行任何修补才能使模块工作。 Module.parent 位很有趣。即使父级(即main.js)没有导出任何内容,有没有办法访问父级?
    • 理论上可以访问module.parent.filename
    • 一个警告是它只会返回需要当前模块的第一个父级
    • module.parent 也有 parent 属性,因此它仅限于第一个父级(在节点 v0.10.30 上测试)。所以你可以(理论上)module.parent.filenamemodule.parent.parent.filenamemodule.parent.parent.parent.filename 等...
    • @matteospampani soulcheck 的意思是,如果你有 foo.js 和 bar.js 并且它们都需要 foobar.js,那么第一个需要 foobar.js 的将是父级。因此,如果 foo.js 首先需要它,则父级将始终 foo.js。
    猜你喜欢
    • 2019-01-27
    • 2022-12-11
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    相关资源
    最近更新 更多