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

#node.js #typescript #npm #peer-dependencies #typescript-module-resolution

#node.js #typescript #npm #peer-dependencies #typescript-module-resolution

Вопрос:

Я написал библиотеку, опубликованную в частном репозитории npm, который используется моими приложениями. Эта библиотека содержит служебные программы и имеет зависимости от других библиотек, в качестве примера давайте выберем @aws-sdk/client-lambda .

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

Чтобы избежать того, чтобы все приложения получали множество косвенных зависимостей, которые им не нужны, я попытался объявить зависимости как peerDependencies и заставить приложения разрешать те, которые им нужны. Это хорошо работает, чтобы опубликовать пакет и использовать его из приложений , которые объявляют все peerDependencies как свои собственные локальные dependencies , но приложения, которые не могут объявить одну из зависимостей, получают ошибки сборки, когда включенные .d.ts файлы библиотеки импортируются в код приложения:

 error TS2307: Cannot find module '@aws-sdk/client-kms' or its corresponding type declarations.  

Можно ли разрешить эту ситуацию так, чтобы моя библиотека могла содержать множество различных утилит, но приложения могли «выбирать» зависимости, необходимые им для выполнения требований этих утилит во время выполнения? Нужно ли для этого использовать динамический импорт или есть другой способ?

Я попытался использовать @ts-ignore код библиотеки, и он был распространен в d.ts файл, импортированный приложениями, но это не помогло.

Установка:

моя-библиотека

пакет.json:

 peerDependencies: {  "@aws-sdk/client-lambda": "^3.27.0" }  

фу.тс:

 import {Lambda} from '@aws-sdk/client-lambda';  export function foo(lambda: Lambda): void {  ... }  

бар.ts:

 export function bar(): void {  ... }  

индекс.ts:

 export * from './foo'; export * from './bar';  

мое-приложение 1 — работает нормально

пакет.json:

 dependencies: {  "my-library": "1.0.0",  "@aws-sdk/client-lambda": "^3.27.0"  }  

test.ts:

 import {foo} from 'my-library';  foo();  

my-application2 — does not compile

package.json:

 dependencies: {  "my-library": ... }  

test:ts:

 import {bar} from 'my-library';  bar();