避免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
。