TypeScript多rootDirs配置下如何从包根目录导入模块?
"paths": { "lib/*": ["../lib/src/*"]
}
},
"references": [
{"path": "../lib"}
]
}
### lib/tsconfig.json(原配置) ```json { ..., "compilerOptions": { "rootDir": "./src", "composite": true, "outDir": "dist" }, "include": [ "src/**/*" ] }
此时可以在App.tsx中使用import {ComponentA, someUtil} from 'lib'正常导入。但当把lib/tsconfig.json改为配置多个rootDirs(比如["./src", "./test/"]),或者将rootDir设为"."后,这种根目录导入方式就失效了——不过具体路径(比如import ... from 'lib/src/components/ComponentA')和lib/index的导入仍能正常工作。
需要解决:如何在lib的rootDir不是./src时,恢复import ... from 'lib'的根目录导入功能?
1. 明确lib包的入口配置
在packages/lib/package.json中添加main、types(可选module)字段,直接指定包的入口文件,让TypeScript和包管理工具能快速定位:
{ ..., "main": "./dist/index.js", // 编译后的JS入口 "types": "./dist/index.d.ts", // 编译后的类型声明入口 "module": "./src/index.ts" // 未编译时的ES模块入口(可选) }
2. 修改app的路径别名配置
调整packages/app/tsconfig.json的paths,将"lib"直接映射到lib的入口文件,而不是通配符src/*:
{ ..., "compilerOptions": { ..., "paths": { "lib": ["../lib/src/index.ts"] // 开发阶段指向src入口 // 生产编译后可改为:"lib": ["../lib/dist/index.js"] } }, "references": [{"path": "../lib"}] }
这种配置绕开了rootDir的限制,直接告诉TypeScriptlib对应的具体文件,不管lib的rootDir怎么设置都能正常解析根目录导入。
3. 确保composite模式的编译完整性
如果lib启用了composite: true,要保证lib/tsconfig.json的include包含了src下的index.ts,同时rootDirs的配置不会影响编译输出:
{ ..., "compilerOptions": { "rootDirs": ["./src", "./test"], "composite": true, "outDir": "dist" }, "include": ["src/**/*", "test/**/*"] }
编译后检查dist目录是否生成了index.js、index.d.ts和tsconfig.tsbuildinfo,确保类型和代码都正确导出。
4. 可选:完善monorepo workspace配置
在root目录的package.json中配置workspaces,让包管理工具(pnpm/yarn/npm)正确识别本地包依赖:
{ "workspaces": [ "packages/*" ] }
这能确保app中依赖的lib被正确软链,避免路径解析时的异常。
内容的提问来源于stack exchange,提问作者Sasgorilla

