Совет по использованию одноранговых зависимостей в TypeScript

Недавно я столкнулся с этой проблемой и почувствовал себя довольно глупо, когда понял, какую простую ошибку я совершил, поэтому позвольте мне поделиться с вами в надежде, что это сэкономит время кому-нибудь еще…

Когда вы разрабатываете пакет NPM, который использует зависимость, также используемую основным приложением, вы можете подумать о том, чтобы указать ее как зависимость от сверстника.

Возьмем этот пример, где мы переносим React из «dependencies» в «peerDependencies»:

-  "dependencies": {
-    "react": "^16.8.4 || ^17.0.0"
-  },
   "devDependencies": {
     "@docusaurus/theme-classic": "^2.0.1",
     "@types/react": "^18.0.17"
+  },
+  "peerDependencies": {
+    "react": "^16.8.4 || ^17.0.0"
   }
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь React является одноранговой зависимостью, что означает, что основное приложение должно включить его в список своих зависимостей. Кроме того, мы можем продолжать разработку этого пакета без проблем с TypeScript (видите, почему?).

Теперь обратите внимание на другой пакет, @docusaurus/theme-classic. Я хотел сделать его зависимым от других пакетов, что я и сделал:

   "devDependencies": {
-    "@docusaurus/theme-classic": "^2.0.1",
     "@types/react": "^18.0.17"
   },
   "peerDependencies": {
+    "@docusaurus/theme-classic": "^2.0.1",
     "react": "^16.8.4 || ^17.0.0"
   }
 }
Войти в полноэкранный режим Выйти из полноэкранного режима

Но после того, как я сделал это изменение, TypeScript был недоволен. Когда я попытался импортировать из этого модуля, я получил типичную ошибку «Cannot find module or its corresponding type declarations». Я довольно долго ломал голову, пытаясь понять зависимости от сверстников. Я знал, что CLI менеджера пакетов не устанавливают автоматически одноранговые зависимости, но я не мог понять, почему другие пакеты, такие как React, работают, а этот нет.

И вот здесь я почувствовал себя глупо, когда понял это: пакет @docusaurus/theme-classic поставлял свои собственные объявления типов, поэтому перевод его на одноранговые зависимости полностью устранял его типы.

Чтобы решить эту проблему, самым простым решением, которое я нашел, является дублирование этой зависимости в «devDependencies». Это гарантирует, что она будет установлена локально во время разработки пакета, но при этом сохранит статус одноранговой зависимости, когда основное приложение будет ее потреблять.

   "devDependencies": {
+    "@docusaurus/theme-classic": "^2.0.1",
     "@types/react": "^18.0.17"
   },
   "peerDependencies": {
Вход в полноэкранный режим Выход из полноэкранного режима

Я также пробовал играть с пакетом install-peers, который утверждает, что устанавливает все ваши peer-зависимости как dev-зависимости, но не имел с ним большого успеха.

Если у вас есть собственное решение этой проблемы, я буду рад его услышать!

Оцените статью
devanswers.ru
Добавить комментарий