【问题标题】:How should the TypeScript compiler API's 'module resolution cache' be used?TypeScript 编译器 API 的“模块解析缓存”应该如何使用?
【发布时间】:2020-04-04 04:09:11
【问题描述】:

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

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

  1. createModuleResolutionCachecurrentDirectory 参数应该传递什么?
  2. resolveModuleNameFromCache 的字面意思是“仅从缓存中解析”,还是会在必要时退回到“艰苦的工作”?

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

【问题讨论】:

    标签: typescript typescript-compiler-api


    【解决方案1】:

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

    在内部这是一个标准:

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

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

    1. createModuleResolutionCachecurrentDirectory 参数应该传递什么?

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

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

    它不会做任何艰苦的工作,只会尝试从缓存中获取名称。这是编译器中的当前代码(.get(moduleName)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);
    }
    

    【讨论】:

    • 感谢您的详尽解释!我将在自定义转换器中使用它,ts.sys.getCurrentDirectory 是否会根据我当前所在的文件或项目的“根目录”而改变?
    • 这是进程的当前工作目录 (process.cwd())。再举一个例子,在编译器的Program (see here) 中创建了一个模块解析缓存。您很可能会在所有文件中使用一个缓存,因此这不会根据您所在的文件而改变。
    猜你喜欢
    • 2017-05-30
    • 1970-01-01
    • 2019-12-24
    • 2016-02-21
    • 2019-09-18
    • 2022-01-05
    • 2016-12-19
    • 2017-10-17
    • 2020-03-29
    相关资源
    最近更新 更多