发布NPM包时打包外部类型的行业标准实现方案咨询
针对两种类型打包场景的标准实现方案
核心思路
本质是借助TypeScript自身的类型编译能力,将依赖的类型递归提取并合并到最终的声明文件中,既避免强制用户安装冗余依赖,也解决浅层类型打包的不足。
场景A:Monorepo内部类型复用(后端→客户端)
- 给后端项目的
tsconfig.json开启declaration: true和declarationMap: true,编译后生成完整的类型声明文件和映射文件。 - 在客户端项目的
tsconfig.json里,通过compilerOptions.paths配置后端项目的源码路径,直接引用后端类型而非编译后的包。 - 使用
rollup-plugin-dts作为打包工具,配置示例:
其中// rollup.config.js import dts from 'rollup-plugin-dts'; export default { input: 'src/index.ts', output: [{ file: 'dist/index.d.ts', format: 'es' }], plugins: [dts({ respectExternal: false })], };respectExternal: false会强制把所有依赖的内部类型(包括后端的)都打包进最终的声明文件,无需将后端标记为发布依赖。
场景B:仅依赖外部包类型,无需安装源码
- 把对应包的类型包(比如
@types/xxx,若原包是TypeScript编写则直接用其自带类型)安装为devDependencies,仅用于编译阶段。 - 同样用
rollup-plugin-dts,开启respectExternal: false,打包时会自动递归提取用到的类型,最终生成的声明文件不再依赖外部类型包。 - 编译完成后,可选择移除该类型依赖(或保留,不影响用户端),用户安装你的包时无需额外安装原大型包。
替代方案
如果不想使用rollup,也可以通过api-extractor的进阶配置实现:
- 开启api-extractor配置中的
rollupDeps: true选项,它会递归处理依赖的类型,打包生成完整的声明文件。 - 需确保api-extractor能识别内部依赖路径,通过
tsconfig.json的paths配置让它找到对应类型文件。
内容的提问来源于stack exchange,提问作者jjh
相关产品推荐
相关产品推荐

