【发布时间】:2022-07-11 14:28:23
【问题描述】:
我编写了一个发布到我的应用程序使用的私有 npm 存储库的库。
该库包含实用程序并依赖于其他库,例如我们选择@aws-sdk/client-lambda。
我的一些应用程序只使用一些实用程序,不需要外部库的依赖项,而一些应用程序使用所有实用程序。
为避免所有应用程序获得大量它们不需要的间接依赖项,我尝试将依赖项声明为 peerDependencies 并让应用程序解析它们需要的依赖项。它可以很好地发布包,并从将 all 的 peerDependencies 声明为他们自己的本地 dependencies 的应用程序中使用它,但是未能声明其中一个依赖项的应用程序在以下情况下会出现构建错误库中包含的.d.ts 文件被导入到应用程序代码中:
error TS2307: Cannot find module '@aws-sdk/client-kms' or its corresponding type declarations.
是否有可能解决这种情况,以便我的库可以包含许多不同的实用程序,但应用程序可能会“挑选”它们在运行时满足这些实用程序要求所需的依赖项? 我必须使用动态导入来执行此操作还是有其他方法?
我尝试在库代码中使用@ts-ignore,它被传播到应用程序导入的d.ts文件,但没有帮助。
设置:
我的图书馆
package.json:
peerDependencies: {
"@aws-sdk/client-lambda": "^3.27.0"
}
foo.ts:
import {Lambda} from '@aws-sdk/client-lambda';
export function foo(lambda: Lambda): void {
...
}
bar.ts:
export function bar(): void {
...
}
index.ts:
export * from './foo';
export * from './bar';
my-application1 - 工作正常
package.json:
dependencies: {
"my-library": "1.0.0",
"@aws-sdk/client-lambda": "^3.27.0"
}
test.ts:
import {foo} from 'my-library';
foo();
my-application2 - 无法编译
package.json:
dependencies: {
"my-library": ...
}
测试:ts:
import {bar} from 'my-library';
bar();
【问题讨论】:
-
你找到解决这个问题的方法了吗?
-
@Vinay 是的,我做到了。请让我尽快抽出时间写出我的解决方案。
-
没有完整的文章@JHH,我们可以快速评论一下您找到的解决方案的机制吗?
-
@James 抱歉耽搁了,我写得很快
标签: node.js typescript npm peer-dependencies typescript-module-resolution