typescript - TypeScript 编译器 API 的“模块解析缓存”应该如何使用?
问题描述
我注意到它ts.resolveModuleName
有一个可选cache
参数和一个附带的resolveModuleNameFromCache
函数。我认为它们与缓存已解析的模块名称以提高性能有关,但我不清楚应该如何(以及是否)使用它们。
我很想更好地了解这些缓存,但现在我有两个具体的问题:
- 应该将什么传递给
currentDirectory
参数createModuleResolutionCache
? - 字面
resolveModuleNameFromCache
意思是“仅从缓存中解决”,还是在必要时会退回到“努力工作”?
同样,我很想对这些缓存有一个更好的总体了解,但是对这些问题的回答已经是朝着正确方向迈出的一大步。
解决方案
模块解析缓存是一种缓存先前调用解析模块名称的结果的方法。
在内部它是一个标准:
let result = cache.get(key);
if (!result) {
result = create();
cache.set(key, result);
}
return result;
在 rollup中可以看到一个使用它的例子。我会说它可能更适合使用,但我不知道性能影响是什么样的。
- 应该将什么传递给
currentDirectory
参数createModuleResolutionCache
?
如果您有编译器主机或程序,则应提供CompilerHost#getCurrentDirectory()
or的结果Program#getCurrentDirectory()
。如果您都没有,则使用ts.sys.getCurrentDirectory()
,这是使用时的默认设置ts.createCompilerHost
。
- 字面
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);
}
推荐阅读
- java - 分组结果的方面计数
- c++ - win32 计时器是否归其调用线程所有?
- .net-core - 将 WSDL 添加到 .NET Core 项目
- javascript - 如何解决 ReferenceError: google 没有使用脚本在 Angular 中定义?
- php - 以相反的顺序显示最新的分类帖子
- mongodb - 使用sails js在mongo db中上传图像的简单方法
- redis - Vertx 3.7.0+ 使用 RedisAPI - HMSET
- r - 为 Dataframe 执行 R 代码时的因素错误
- java - 我们应该将 null 添加到列表 Collection.singletonlist 还是只使整个列表为 null?
- python - 遍历具有索引的列