Как использовать «кэш разрешения модуля» API-интерфейса компилятора TypeScript? - PullRequest
2 голосов
/ 03 апреля 2020

Я заметил, что ts.resolveModuleName имеет необязательный параметр cache и сопутствующую функцию resolveModuleNameFromCache. Я предполагаю, что они как-то связаны с кэшированием разрешенных имен модулей для повышения производительности, но мне не ясно, как (и если) их следует использовать.

Мне бы хотелось получить лучшее общее представление об этих кеширует, но сейчас у меня есть два конкретных вопроса:

  1. Что следует передать в параметр currentDirectory для createModuleResolutionCache?
  2. Означает ли буквально resolveModuleNameFromCache "разрешение из просто кэш », или он при необходимости вернется к« тяжелой работе »

Опять же, я хотел бы получить лучшее общее представление об этих кэшах, но ответы на эти вопросы уже будет хорошим шагом в правильном направлении.

1 Ответ

1 голос
/ 03 апреля 2020

Кэш разрешения модуля - это способ кеширования результата предыдущих вызовов для разрешения имени модуля.

Внутренне это стандарт:

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

Пример его использования может быть замеченным здесь в свертке . Я бы сказал, что это, вероятно, предпочтительнее использовать, но я понятия не имею, на что похоже влияние на производительность.

  1. Что следует передать в параметр currentDirectory для createModuleResolutionCache?

Если у вас есть хост или программа компилятора, вы должны предоставить результат CompilerHost#getCurrentDirectory() или Program#getCurrentDirectory(). Если у вас их нет, используйте ts.sys.getCurrentDirectory(), который используется по умолчанию при использовании ts.createCompilerHost.

Означает ли 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...