Javascript 避免Node.js中的相对require路径

Javascript 避免Node.js中的相对require路径,javascript,node.js,Javascript,Node.js,我更喜欢在导入依赖项时不使用大量相关的文件系统导航,如。/../../foo/bar 在前端,我传统上使用RequireJS来配置默认的基本路径,该路径启用“绝对”路径,例如myapp/foo/bar 如何在Node.js中实现这一点?您可以使用require.main.require,它始终是起始文件的模块路径。看 这意味着,当你跑步的时候 const x=require.main.require('some/file/path/y') 它需要基于起始文件的基本路径(即被调用的,node ap

我更喜欢在导入依赖项时不使用大量相关的文件系统导航,如
。/../../foo/bar

在前端,我传统上使用RequireJS来配置默认的基本路径,该路径启用“绝对”路径,例如
myapp/foo/bar


如何在Node.js中实现这一点?

您可以使用
require.main.require
,它始终是起始文件的模块路径。看

这意味着,当你跑步的时候

const x=require.main.require('some/file/path/y')

它需要基于起始文件的基本路径(即被调用的,
node app.js
表示app.js文件)使用它


其他选项包括使用
process.cwd()
获取应用程序的起始路径,但这取决于调用节点进程的位置,而不是文件的位置。这意味着,
node-app.js
将不同于您将其启动一个级别,
node-src/app.js

为了补充另一个答案,您可以在主文件中添加以下几行:

(function (module) {
  let path = require('path')
  let __require = module.constructor.prototype.require
  let __cpath = __dirname

  module.constructor.prototype.require = function (str) {
    if (str.startsWith('package:')) {
      let package = str.substr(8)
      let p = path.resolve(__dirname, package)

      return __require(p)
    } else {
      return __require(str)
    }
  }
})(module)
它以以下方式扩展了您的
要求

  • 如果路径以
    package:
    (即
    package:src/foo/bar
    )开头,则将其转换为
    require('/absolute/path/to/your/app/src/foo/bar')
  • 如果它不是以
    package:
    开头,那么它的行为就像正常的
    require
    一样

在索引文件中创建自己的
所需的
包装器难道不管用吗?是的,这可能管用-好主意!但我想知道是否有内置的解决方案(例如配置选项)。据我所知-没有。我从未在任何地方见过它。我发现了这一点-有多种解决方案,不幸的是,没有一种是“内置的”。非常感谢。我发现相对路径很容易出错,在前端很难维护(我发现很难解析大量的
。/
。您如何避免后端出现此类问题?或者这对您来说不是问题吗?老实说,从来没有真正遇到过问题。除非您移动文件,否则node.js中的相对路径是静态的,因为它们总是相对于调用
require
的文件。不确定requireJS如何在web上下文中加载文件,但脚本标记始终与当前HTML文档相关,因此,如果您正在注入脚本标记以加载js文件,它将不会与执行注入的js文件相关。也许这就是您的问题的根源?虽然我有过require.main.require的用例,但这实际上是from是一个节点模块,它希望从应用程序根文件夹中查找配置,这是一个非常特定的用例(可能大多数情况下不鼓励这样做)。在应用程序开发的初始阶段,我发现移动文件是一个非常常见的要求。如果文件引入了共享依赖项,如
。/../../../shared/utils/foo
,那么如果嵌套位置发生变化,则每个文件都会中断。如果路径改为“绝对”那么这个问题就不会发生了。我想这就是我正在考虑的用例…@BenAston是的,当然,但是任何不太体面的IDE通常都会在重构过程中解决这个问题,所以我个人从来没有遇到过这个问题。