基于项目根的NodeJS模块相对路径

时间:2019-01-19 13:07:51

标签: node.js package relative-path

在我的NodeJS项目中包含模块的情况下,我总是在指定所需项目的其他模块文件的路径方面有些挣扎。

我显然使用相对路径。但这意味着要做类似的事情:

const helper = require("../../lib/util/helpers.js

这有一些缺点:

  1. 我始终需要考虑将我需要其他模块的文件放在何处。

  2. 随着项目的增长,由于项目重组,我有时需要将一些文件移至另一个位置,因此,我不仅需要检查需要它的文件的路径,还需要检查我所需要的所有模块的路径移动。

我一直认为,如果可以指定相对于项目根目录的路径而不是文件本身,这将更加清晰。需要明确的是,这是我的package.json文件(或node_modules目录)所在的位置。

我知道我可以使用require.resolve()来解析任何外部模块的路径,尽管我可以做类似path.dirname(path.dirname(path.dirname(require.resolve('express'))))的事情,但对我来说似乎太脏了。

不幸的是,据我所知,没有任何require.modules_pathrequire.projectRoot属性,所以我需要依靠上面提到的技巧或遍历整个树直到第一个包含package.json文件的父目录。

我的问题是:我还缺少更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我通过使用运行时符号将项目的根路径存储为process对象的属性,从而找到了一种甚至可以接受的解决方案。

  

使用符号命名该属性,可以避免出现以下情况   与另一个process对象属性发生冲突,即使将来发生冲突   一个。

我所做的只是将这两行添加到我的app.js中(在Express项目中,这两行放置在项目根目录中,并且从主应用程序入口点bin/www开始是必需的,在此我还确保它是首先需要的依赖项):

const $root = Symbol.for("projectRoot");                                         │     return new Promise(function (resolve, reject) {
process[$root] = __dirname;

在那之后,我在所有其他模块中唯一需要做的就是在开始时重复第一行:

const $root = Symbol.for("projectRoot");

...并在所有 require 语句中使用它。例如:

const helper = require(process[$root]+"/lib/util/helpers.js

也许它远非完美,但对我有用...