TypeScript编译器API';s';模块分辨率缓存';被使用?
我注意到TypeScript编译器API';s';模块分辨率缓存';被使用?,typescript,typescript-compiler-api,Typescript,Typescript Compiler Api,我注意到ts.resolveModuleName有一个可选的cache参数和一个附带的resolveModuleNameFromCache函数。我假设它们与缓存解析的模块名称以提高性能有关,但我不清楚它们应该如何(以及是否)使用 我很想更好地了解这些缓存,但目前我有两个具体问题: 对于createModuleResolutionCache,应该将什么传递到currentDirectory参数中 resolveModuleNameFromCache的字面意思是“仅从缓存进行解析”,还是在必要时会退
ts.resolveModuleName
有一个可选的cache
参数和一个附带的resolveModuleNameFromCache
函数。我假设它们与缓存解析的模块名称以提高性能有关,但我不清楚它们应该如何(以及是否)使用
我很想更好地了解这些缓存,但目前我有两个具体问题:
createModuleResolutionCache
,应该将什么传递到currentDirectory
参数中resolveModuleNameFromCache
的字面意思是“仅从缓存进行解析”,还是在必要时会退回到“繁重的工作”上来同样,我很想对这些缓存有一个更全面的了解,但对这些问题的回答已经是朝着正确方向迈出的一大步。模块解析缓存是一种缓存以前解析模块名称调用的结果的方法 在内部,这是一个标准:
let result = cache.get(key);
if (!result) {
result = create();
cache.set(key, result);
}
return result;
可以看到一个正在使用的示例。我想说使用它可能更可取,但我不知道性能影响是什么样的
createModuleResolutionCache
,应该将什么传递到currentDirectory
参数中CompilerHost\getCurrentDirectory()
或program\getCurrentDirectory()
的结果。如果没有,请使用ts.sys.getCurrentDirectory()
,这是使用ts.createCompilerHost
时的默认设置
resolveModuleNameFromCache
的字面意思是“仅从缓存进行解析”,还是在必要时会退回到“繁重的工作”上来.get(moduleName)
是一个映射#get
):
谢谢你的详细解释!我将在自定义转换器中使用它,
ts.sys.getCurrentDirectory
是否会根据我当前所在的文件而改变,或者它是项目的“根目录”?它是进程的当前工作目录(process.cwd()
)。例如,在编译器()的程序中创建了一个模块解析缓存。您很可能会在所有文件中使用一个缓存,因此这不会因您所在的文件而异。
export function resolveModuleNameFromCache(
moduleName: string,
containingFile: string,
cache: ModuleResolutionCache
): ResolvedModuleWithFailedLookupLocations | undefined {
const containingDirectory = getDirectoryPath(containingFile);
const perFolderCache = cache && cache.getOrCreateCacheForDirectory(containingDirectory);
return perFolderCache && perFolderCache.get(moduleName);
}