如何获取任意目录中任意文件的节点包搜索路径
How to obtain node package seach paths for an arbitrary file in an arbitrary directory
假设两个文件在不同的目录 x.ts
和 'y.tsWithin the code file
x.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);
假设两个文件在不同的目录 x.ts
和 'y.tsWithin the code file
x.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);