Node.js npm包导入时如何省略dist目录直接引入子模块?
解决方案
方案1:使用package.json的exports字段(推荐,Node.js 12.7.0+ 支持)
这是Node.js官方标准的子路径映射方案,直接修改你的package.json即可:
{ "name": "my-lib", "version": "1.0.0", "description": "", "main": "dist/index.js", "exports": { ".": "./dist/index.js", "./foo": "./dist/foo.js", // 如果有大量子模块,可直接用通配符匹配所有子路径 "./*": "./dist/*" } }
配置完成后,使用者就可以直接通过import foo from 'my-lib/foo'引入对应模块,无需显式写dist路径。
如果你的库同时提供TypeScript类型定义,还需要补充类型映射配置,兼容TypeScript的路径解析:
- TypeScript 4.5+ 可以直接在
exports中声明类型路径:
"exports": { ".": { "types": "./dist/index.d.ts", "default": "./dist/index.js" }, "./foo": { "types": "./dist/foo.d.ts", "default": "./dist/foo.js" }, "./*": { "types": "./dist/*.d.ts", "default": "./dist/*.js" } }
- 兼容更低版本TypeScript可额外加
typesVersions配置:
"typesVersions": { "*": { "*": ["./dist/*"] } }
方案2:兼容旧版本Node.js(12以下)
如果你的库需要支持Node.js 12以下不支持exports字段的环境,可选以下两种方式:
- 在项目根目录创建和子模块同名的占位文件,比如创建
foo.js,内容为:
对应的类型文件module.exports = require('./dist/foo.js')foo.d.ts内容为:
该方式适合子模块数量较少的场景。export * from './dist/foo' - 调整编译配置,直接把打包后的js文件输出到项目根目录而非
dist文件夹,该方案会导致根目录文件混乱,不推荐。
注意事项
- 发布npm包前要确认
dist文件夹被包含在发布内容中,可在package.json的files字段显式声明:"files": ["dist/"] - 配置完成后可以通过
npm link在本地测试引入效果,确认路径映射生效。
内容的提问来源于stack exchange,提问作者Pavan Kumar
相关产品推荐
相关产品推荐

