代码之家  ›  专栏  ›  技术社区  ›  bitifet

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

  •  0
  • bitifet  · 技术社区  · 6 年前

    处理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_path require.projectRoot 属性,因此我需要依赖上面提到的一些技巧,或者遍历整个树直到包含 包装袋 文件。

    我的问题是:有没有更好的解决方案我错过了?

    1 回复  |  直到 6 年前
        1
  •  0
  •   bitifet    6 年前

    我通过使用运行时符号将项目的根路径存储为 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");
    

    …并且全部使用它 要求 声明。例如:

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

    也许它远不是完美的,但它对我有用…