开发Cloudflare Worker工具包时,如何复用firebase-admin的类型定义且不引入生产依赖
开发Cloudflare Worker工具包时,如何复用firebase-admin的类型定义且不引入生产依赖
我之前也碰到过几乎一模一样的问题——想复用firebase-admin的类型但又不想让它成为生产依赖,毕竟Cloudflare Worker的内存限制太严苛了。你的思路用dev依赖装firebase-admin然后导出类型是完全正确的,但tsup默认生成的d.ts会保留对原模块的引用,这就导致使用你包的用户可能需要额外装firebase-admin才能拿到类型(虽然运行时不需要,但类型依赖还是甩不掉)。
下面给你两个可行的解决方案,都是我实际试过的:
方案一:用dts-bundle-generator把依赖类型内联到自己的d.ts里
这是最省心的自动化方案,能把firebase-admin的类型直接合并到你的包的类型文件中,不需要手动复制。
步骤:
- 先安装dts-bundle-generator作为dev依赖:
npm install --save-dev dts-bundle-generator
- 修改你的tsup配置,关闭自带的dts生成,然后在构建完成后用dts-bundle-generator生成合并后的类型文件:
import { defineConfig } from "tsup"; import { execSync } from "child_process"; export default defineConfig({ entry: ["src/index.ts"], format: ["esm"], dts: false, // 关掉tsup自带的dts生成 sourcemap: true, clean: true, target: "esnext", minify: false, onSuccess: () => { // 运行dts-bundle-generator,把所有依赖类型内联进来 execSync( "dts-bundle-generator src/index.ts --out-file dist/index.d.ts --no-check --external-imports none" ); }, });
这里的--external-imports none是关键,它会告诉工具不要保留任何外部类型的引用,直接把firebase-admin的类型定义复制到你的index.d.ts里。
- 最后在tsconfig.json里加上
skipLibCheck: true,避免firebase-admin的类型依赖带来的检查错误:
{ "compilerOptions": { "skipLibCheck": true, // 你的其他配置... } }
运行tsup后,打开dist/index.d.ts看看,应该能看到DecodedIdToken、UserRecord这些类型的完整定义已经内联在里面了,再也没有对firebase-admin的引用。
方案二:手动复制firebase-admin的类型定义
如果不想加额外的工具依赖,也可以手动把需要的类型从firebase-admin的包中复制出来。
步骤:
- 找到
node_modules/firebase-admin/auth/index.d.ts文件,里面包含了你需要的所有类型定义。 - 把
DecodedIdToken、UserRecord等你用到的类型的完整定义复制到你的src/types.ts文件中,替换原来的导入和导出。 - 这样你的包就完全没有任何firebase-admin的类型引用了,类型定义都在本地。
这个方案的优点是完全自主,没有额外工具依赖,但缺点也很明显——如果firebase-admin更新了类型,你需要手动同步,比较繁琐,适合对依赖控制极其严格的场景。
最后验证
不管用哪个方案,都建议在一个测试项目中安装你的包,测试一下:
- 不需要安装firebase-admin就能正常导入你的类型。
- 编译测试项目时没有类型错误。
- 运行时完全不依赖firebase-admin(可以把firebase-admin从测试项目中删掉试试)。
内容来源于stack exchange
相关产品推荐
相关产品推荐

