[英]Node.js require a file relative to the root of the package
在 Node.js 中,有没有办法在不使用相对路径的情况下要求来自同一个 package 的文件? 例如,这是ESLint的一段代码。
const rule = require("../../../lib/rules/accessor-pairs"),
{ RuleTester } = require("../../../lib/rule-tester");
事实上,我们必须一直走上树../../../
才能到达根部,这不仅令人讨厌。 它也很脆弱,因为我无法在不更新所有依赖项引用的情况下移动代码。
然而不知何故,Node.js 开发人员似乎在过去 10 年里一直在忍受它。 除了名为require-self的第三方依赖项之外,我在文档或 Stack Overflow 中找不到任何解决此问题的内容。 我也无法找到一个明确的声明,即使用相对路径是文件要求同一模块中的另一个文件的唯一非hacky方式。
如果有一种方法可以指定相对于 ECMAScript 模块 (ESM) 中的 package 根目录而不是 CommonJS (CJS) 的路径,反之亦然,我也想知道这一点。
需要明确的是,我认为没有解决问题的方法。 如果有大。 否则,我正在寻找权威参考的确认。
不一定是相同的package - 如果您正在编写库,这将没有用,但如果您正在编写“最终应用程序” - 实际运行的东西:
一种选择:
如果 NODE_PATH 环境变量设置为以冒号分隔的绝对路径列表,则 Node.js 将在这些路径中搜索模块(如果在其他地方找不到它们)。
因此,您可以执行以下任何操作:
1.
export NODE_PATH=.
node app.js
NODE_PATH=. node app.js
// app.js (or whatever your entry point is) before *any* require() calls
process.env.NODE_PATH = __dirname;
require('module').Module._initPaths();
或者,另一种方式:
模块 object 代表 Node.js 进程启动时加载的入口脚本。
https://nodejs.org/api/modules.html#modules_require_main
所以你可以这样做:
const rule = require.main.require("./lib/rules/accessor-pairs")
任何时候您希望它相对于根(假设您的项目结构是这样的)。
您可以使用 package 名称本身作为 package 根的“符号链接”。
示例 - foo
package 导入相对于foo
package 根的bar
脚本。
package.json
{
"dependencies": {
"foo": "file:./foo"
}
}
index.js
const foo = require('foo');
console.log(foo.bar); // prints "hello"
foo/index.js
const bar = require('foo/bar'); // import relative to the package root
module.exports = {
bar: bar
}
foo/bar.js
module.exports = 'hello';
如果您使用 vscode,那么您很幸运 -.,,, jsconfig,json 在项目根目录中为 commonjs、es6、amd、umd 等巧妙地处理了这个
jsconfig.json 文件指定 JavaScript 语言服务提供的功能的根文件和选项。
jsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"baseUrl": ".",
"paths": {
"@rules/*": ["path/to/lib/rules/"]
}
}
}
然后使用别名:
const rule = require('@rules/accessor-pairs'),
{ RuleTester } = require('@rules/rule-tester');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.