Node/IO.js需要从项目根目录



假设我有一个这样的项目结构:

root/
|
-- app.js
-- config.json
-- package.json
-- lib/
   |
   -- config/
      |
      -- config.js

进一步,让我们假设我想从config.js中读取根config.json(以覆盖默认配置)。我可以这样做:

const path = require('path');
let jsonConfig = {};
try {
  let moduleDir = path.dirname(process.mainModule.filename);
  jsonConfig = require(`${moduleDir}/config.json`);
} catch (e) {}

我的问题是,我应该吗?文档说明:

检索require.main的另一种方法。不同之处在于,如果主模块在运行时发生更改,则需要。在发生更改之前所需的模块中,Main可能仍然引用原始主模块。一般来说,可以安全地假设两者指向同一个模块。

我不知道什么条件会导致我的主模块在运行时发生变化。我假设这是我自己会显式地做的事情,但我对运行时的内部不够熟悉,无法确定。

编辑说明:

我知道我可以使用一个相对路径,例如require('../../config.json')。但是,这使得在以后的日期重构/移动lib/config/config.js变得更加困难,如果是我最终要做的事情。因此,我希望要求相对于基本项目目录。

这个配置也是特定于应用程序的。把它放在node_modules下的模块不是我想做的事情。我只把npm管理的依赖放在node_modules中。

我的问题更多的是关于依赖process.mainModule可能产生的潜在意外问题,而不是关于require函数。

你可以像这样硬编码

require('../../config')

或者,您可以利用Node中的node_modules查找功能,将config.json移动到node_modules/config/index.json

root/
|
-- app.js
-- node_modules
   |
   -- config
      |
       -- package.json
       -- index.json
-- package.json
-- lib/
   |
   -- config/
      |
      -- config.js

然后使用

require('config')

最新更新