在我的NodeJS项目中包含模块的情况下,我总是在指定所需项目的其他模块文件的路径方面有些挣扎。
我显然使用相对路径。但这意味着要做类似的事情:
const helper = require("../../lib/util/helpers.js
这有一些缺点:
我始终需要考虑将我需要其他模块的文件放在何处。
随着项目的增长,由于项目重组,我有时需要将一些文件移至另一个位置,因此,我不仅需要检查需要它的文件的路径,还需要检查我所需要的所有模块的路径移动。
我一直认为,如果可以指定相对于项目根目录的路径而不是文件本身,这将更加清晰。需要明确的是,这是我的package.json
文件(或node_modules
目录)所在的位置。
我知道我可以使用require.resolve()
来解析任何外部模块的路径,尽管我可以做类似path.dirname(path.dirname(path.dirname(require.resolve('express'))))
的事情,但对我来说似乎太脏了。
不幸的是,据我所知,没有任何require.modules_path
或require.projectRoot
属性,所以我需要依靠上面提到的技巧或遍历整个树直到第一个包含package.json
文件的父目录。
我的问题是:我还缺少更好的解决方案吗?
答案 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
也许它远非完美,但对我有用...