null

Ошибка "Cannot find module or its corresponding type declarations" при использовании Yarn Plug'n'Play с TypeScript

Что за Plug'n'Play?

Это стратегия установки пакетов, появившаяся в Yarn 2. С недавних пор она является стратегией по умолчанию, заменяя собой всем привычную установку в директорию node_modules. Но как она работает?

Первым делом Yarn разрешит зависимости проекта и установит их в собственный кэш, пропустив шаг с распаковкой (разархивированием) и сохранением в node_modules. Затем он создаст собственный загрузчик .pnp.cjs, содержащий всю информацию о дереве зависимостей проекта, позволяя сборщикам разрешать вызовы require и import.

Такой подход даёт ряд преимуществ, среди которых, например, более быстрая установка зависимостей и меньшее использование места на диске.

 

Проблема с TypeScript

Создавая проект или добавляя Yarn PnP в уже существующий проект с использованием TypeScript, велика вероятность, что вы столкнётесь со следующей ошибкой:

Эта ошибка обычно указывает на то, что TypeScript не может найти импортируемый модуль или объявления типов для этого модуля. Это часто происходит из-за отсутствующего node_modules, неправильных путей или отсутствующих файлов объявлений типов.

Но разве эту проблему не должен решать ранее упомянутый .pnp.cjs?

 

Решение проблемы

Как ни странно, попытка собрать проект закончилась успехом. Это навело на мысль, что проблема кроется именно в IDE (актуальная версия VSCode), и так оно и оказалось. Дело в том, что на текущий момент большинство IDE пытаются запустить TypeScript без учёта настроенного загрузчика в проекте. Для обхода этого существуют SDK, которые генерируют пакеты-посредники, которые при обращении автоматически настраивают загрузчик перед пересылкой вызовов require и import в реальные пакеты. Такие SDK существуют для многих популярных на сегодняшний день IDE.

Установка SDK выполняется в одну команду:

yarn dlx @yarnpkg/sdks <список IDE через пробел>

Например, если вы хотите установить SDK только для VSCode, то команда будет выглядеть так:

yarn dlx @yarnpkg/sdks vscode

Список всех доступных IDE, как и гайды по их настройке, можно найти в документации

После загрузки SDK, в случае с VSCode, появится уведомление о том, что текущая рабочая область содержит собственную версию TypeScript, использование которой необходимо разрешить (сделано в целях безопасности):

 Разрешаем IDE использовать её и ошибка пропадает.

 

Если планируете работать над проектом на нескольких машинах или точно знаете, какие IDE используют члены команды, можно облегчить жизнь и себе, и им, сохранив SDK и конфиги IDE в репозиторий. 

В данном случае достаточно добавить в систему контроля версий .yarn/sdks и .vscode.