已发布的NPM包能否使用tsconfig配置的path路径别名供引入方使用?
NPM 包保留内部路径别名导入结构的解决方案
tsconfig.json中的paths配置仅作用于当前项目的本地编译阶段,不会跟随 NPM 包发布后对外生效,要保留目标导入结构,可通过以下两个主流方案实现:
方案1:使用 package.json 标准 exports 字段(推荐,兼容所有现代构建工具)
这是 Node.js 以及 webpack5、vite、rollup 等现代构建工具原生支持的标准导出规则,只需在包的 package.json 中添加对应配置即可,示例如下:
{ "name": "@myApp/infra", "version": "1.0.0", "main": "./dist/index.js", "types": "./dist/index.d.ts", "exports": { ".": "./dist/index.js", "./comm": "./dist/comm/index.js", "./i18n": "./dist/i18n/index.js" }, "typesVersions": { "*": { "comm": ["./dist/comm/index.d.ts"], "i18n": ["./dist/i18n/index.d.ts"] } } }
配置完成后,使用方安装包后可直接通过 import xxx from '@myApp/infra/comm'、import xxx from '@myApp/infra/i18n' 导入对应模块,与你内部使用的别名路径完全一致。
方案2:物理子目录镜像(兼容 webpack4 等老旧构建工具)
如果你的包需要适配不支持 exports 字段的老旧构建工具,可以在打包输出的产物根目录下创建对应别名的子目录,每个子目录内新增一个指向对应产物的 package.json 文件即可。
以 comm 模块为例,在产物目录的 comm 文件夹下新增 package.json:
{ "main": "../comm/index.js", "module": "../comm/index.esm.js", "types": "../comm/index.d.ts" }
发布时将这些子目录一并上传到 NPM 即可,老旧构建工具会自动识别子目录下的 package.json 完成模块解析。
注意事项
- 本地开发的
paths别名配置可以保留,只需保证别名路径和对外暴露的导入路径完全对齐,无需修改现有内部业务代码 - TypeScript 项目必须同步配置
typesVersions字段,否则使用方导入子路径时会缺失类型提示 - 不建议要求使用方在自己项目内配置
paths适配你的包,会大幅提升接入成本
内容的提问来源于stack exchange,提问作者Yoav Moran
相关产品推荐
相关产品推荐

