如何获取任意目录中任意文件的节点包搜索路径

How to obtain node package seach paths for an arbitrary file in an arbitrary directory

假设两个文件在不同的目录 x.ts 和 'y.tsWithin the code filex.ts` 我可以写这段代码来按顺序输出节点搜索路径:

console.log(JSON.stringify(require.resolve.paths(''),null,2))

它给出了一些像

这样的输出
[
  "/mnt/common/github/tscapi/tmp/node_modules",
  "/mnt/common/github/tscapi/node_modules",
  "/mnt/common/github/node_modules",
  "/mnt/common/node_modules",
  "/mnt/node_modules",
  "/node_modules",
  "/home/craig/.node_modules",
  "/home/craig/.node_libraries",
  "/home/craig/.nvm/versions/node/v14.15.1/lib/node"
]

我想做的是获取 y.ts 的相应路径,但是从 x.ts.

中的代码生成它们

我在 requirejs 包中找不到任何允许这样做的东西,我找不到任何可用的包,我也找不到任何相关问题。

一种策略是根据节点规范“手动”编写它,and/or 适当地修改 x.ts 的路径以使其正确用于 y.ts。可能容易出错。

另一种策略是将 x.ts 内容复制到 y.ts 目录中的文件中,执行它并捕获输出。但这真的很残酷。

最好是找到现有的解决方案。任何指针将不胜感激。

您可以通过使用 createRequire 获取相关模块的 require 函数来执行此操作。

由于这是用 typescript-compiler-api 标记的,您还可以要求 TS 解析模块路径,这将为您提供更多路径,因为它还会检查 TS 特定的文件扩展名。

const { resolve } = require("path");
const { createRequire } = require("module");
const ts = require("typescript");

const yPath = resolve("./path/to/y.js");
const testRequire = createRequire(yPath);

console.log(testRequire.resolve.paths(""));

const resolved = ts.resolveModuleName("", yPath, {}, ts.sys);
console.log(resolved.failedLookupLocations);