Rollup构建React库时重新导出依赖的interfaces、enums等内容无法访问问题求助
跨库重新导出内容无法访问的解决方案
你的问题核心是运行时的enum值没有被正确包含在library-B的构建产物中,或者构建产物的依赖引用路径错误,类型丢失则是因为类型声明文件生成逻辑有问题,按以下步骤调整即可:
第一步:修复上游公共库library-A配置
- 确认library-A的
package.json配置完整,包含三个必填字段,指向对应构建产物:{ "main": "./dist/index.cjs.js", // cjs格式入口 "module": "./dist/index.esm.js", // esm格式入口 "types": "./dist/index.d.ts" // 类型声明入口 } - 检查library-A的tsconfig配置,确保开启了类型生成和enum保留规则:
{ "compilerOptions": { "declaration": true, // 生成d.ts类型文件 "declarationMap": true, // 生成类型映射 "preserveConstEnums": true // 避免const enum编译后被抹除 } } - 确认library-A入口文件已正确导出所有需要对外暴露的interface、enum、常量,无遗漏。
第二步:调整组件库library-B的依赖与构建配置
- 首先明确依赖规则二选一:
- 方案1(推荐,无需主项目额外安装依赖):将library-A放在library-B的
dependencies依赖项中,Rollup构建时会自动把library-A的导出内容打包进library-B的产物 - 方案2(版本共享):将library-A放在library-B的
peerDependencies中,同时在devDependencies中加入library-A用于本地开发,该方案要求主项目必须自行安装library-A才能正常使用
- 方案1(推荐,无需主项目额外安装依赖):将library-A放在library-B的
- 调整Rollup配置逻辑:
你当前使用的peerDepsExternal()插件只会将peerDependencies中的包标记为外置不打包,如果选择上面的方案1,不需要额外修改Rollup配置;如果选择方案2,要确保主项目安装library-B时同步安装对应版本的library-A - 检查library-B的
tsconfig-rollup.json配置,同样开启declaration: true,确保rollup-plugin-typescript2可以正确生成包含重新导出内容的类型声明文件 - 你当前的重新导出写法无需修改:运行时的enum用普通
export导出,纯类型的interface用export type导出符合TypeScript规范。
第三步:构建产物验证
library-B构建完成后,检查dist目录下的产物:
- 打开cjs/esm格式的js产物,搜索
GENDER关键字,确认要么包含对应的enum编译后代码(方案1),要么有正确的require('library-A')/import from 'library-A'引用语句(方案2) - 打开d.ts类型声明文件,确认包含
export declare enum GENDER以及对应的interface导出内容,没有丢失。
第四步:主项目验证
重新安装调整后的library-B,如果选择peer依赖方案,要在主项目手动安装library-A,之后即可正常访问重新导出的所有内容:
import { GENDER } from "library-B" console.log(GENDER.male) // 可正常访问
内容的提问来源于stack exchange,提问作者Sheeper
相关产品推荐
相关产品推荐

