如何要求相对于requirer的文件?

时间:2017-03-01 01:49:20

标签: node.js configuration configuration-files

我正在开发一个库,其中我想加载一个或多个相对于requirer的文件。为了更好地说明这一点:

// ~/app.js
import { horn } from 'unicorn'
horn.load()

// ~/node_modules/unicorn/horn.js
export default {
  load() {
    require('./user.config.js') // Here I would like to load the user config
                                // relative to "~/app.js"
  }
}

我尝试检查全局require及其parent属性,但它只给我一个没有更多上下文的文件名。

1 个答案:

答案 0 :(得分:1)

这里有你所拥有的:

module.parent

这是加载此模块的第一个模块的模块句柄。因为模块句柄是缓存的,所以这只会反映加载你的第一个模块。

module.filename

这是模块的完全限定文件名。因此,如果您想要父模块的完全限定文件名,可以使用:

module.parent.filename

如果您只想要父模块的路径以便可以从该目录加载某些内容,那么您可以从文件名中拆分路径以使用path模块获取路径。

path.dirname(module.parent.filename)

如果要从该目录加载文件,可以执行以下操作:

let fileToLoad = path.join(path.dirname(module.parent.filename), "user.config.js");
let config = require(fileToLoad);

你必须记住上面的警告module.parent只返回第一个加载你的模块,因为之后模块被缓存,只返回原始模块句柄(它没有重新加载)。