【问题标题】:Project root based relative paths for NodeJS modulesNodeJS 模块的基于项目根的相对路径
【发布时间】:2019-01-19 13:07:50
【问题描述】:

在我的 NodeJS 项目中处理模块包含问题时,我总是在指定需要的项目的其他模块文件的路径方面有点困难。

我显然使用相对路径。但这意味着要执行以下操作:

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

这有一些缺点:

  1. 我总是需要考虑放置我需要另一个模块的文件的位置。

  2. 1234563移动。

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

我知道我可以使用require.resolve() 解析任何外部模块的路径,虽然我可以执行path.dirname(path.dirname(path.dirname(require.resolve('express')))) 之类的操作,但它对我来说似乎太脏了。

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

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

【问题讨论】:

    标签: node.js package relative-path


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-08
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 2017-08-31
      • 1970-01-01
      • 2014-03-05
      相关资源
      最近更新 更多