避免Node.js中的相对需求path

我更喜欢导入依赖关系,没有像../../../foo/bar这样的相关文件系统导航。

在前端我传统上使用RequireJS来configuration一个默认的基本path,使“绝对”path,例如myapp/foo/bar

我怎样才能在Node.js中实现这一点?

你可以做的是使用require.main.require这将始终是起始文件的模块path。 请参阅https://nodejs.org/api/modules.html#modules_accessing_the_main_module

这意味着,当你跑步

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

这将需要它基于你的起始文件的基本path(这是调用, node app.js意味着app.js文件)。

其他选项包括使用process.cwd()获取应用程序的起始path,但这取决于您调用节点进程的位置,而不是文件的位置。 这意味着, 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) 

它以这种方式扩展您的require

  • 如果path从package:开始package:package:src/foo/bar )它将它转换为require('/absolute/path/to/your/app/src/foo/bar')
  • 如果它不是以package:开头的话,那么它的行为就像一个正常的require