首页 > 解决方案 > TypeScript 编译器 API 的“模块解析缓存”应该如何使用?

问题描述

我注意到它ts.resolveModuleName有一个可选cache参数和一个附带的resolveModuleNameFromCache函数。我认为它们与缓存已解析的模块名称以提高性能有关,但我不清楚应该如何(以及是否)使用它们。

我很想更好地了解这些缓存,但现在我有两个具体的问题:

  1. 应该将什么传递给currentDirectory参数createModuleResolutionCache
  2. 字面resolveModuleNameFromCache意思是“仅从缓存中解决”,还是在必要时会退回到“努力工作”?

同样,我很想对这些缓存有一个更好的总体了解,但是对这些问题的回答已经是朝着正确方向迈出的一大步。

标签: typescripttypescript-compiler-api

解决方案


模块解析缓存是一种缓存先前调用解析模块名称的结果的方法。

在内部它是一个标准:

let result = cache.get(key);
if (!result) {
    result = create();
    cache.set(key, result);
}
return result;

在 rollup中可以看到一个使用它的例子。我会说它可能更适合使用,但我不知道性能影响是什么样的。

  1. 应该将什么传递给currentDirectory参数createModuleResolutionCache

如果您有编译器主机或程序,则应提供CompilerHost#getCurrentDirectory()or的结果Program#getCurrentDirectory()。如果您都没有,则使用ts.sys.getCurrentDirectory(),这是使用时的默认设置ts.createCompilerHost

  1. 字面resolveModuleNameFromCache意思是“仅从缓存中解决”,还是在必要时会退回到“努力工作”?

它不会做任何艰苦的工作,只会尝试从缓存中获取名称。这是编译器中的当前代码(.get(moduleName)is a Map#get):

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);
}

推荐阅读