繁体   English   中英

Node.js 需要一个相对于 package 根目录的文件

[英]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');

阅读更多: https://code.visualstudio.com/docs/languages/jsconfig

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM