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