我认为这是不可能的,但值得问一下,因为我不是webpack专家!
我们有一个包含许多不同的工作空间包的单库,使用typescript,使用webpack构建。
每个工作区都有自己的tsconfig.json
和webpack.config.js
来构建该包。
为每个路径声明别名,如@package-a
,@package-b
等
有些包是从它们自己独立的仓库中导入的,并且声明@
作为自己的别名。
这意味着我们在不同的包中有多个@
别名。
ts配置
"paths": {
"@/*": ["./src/*"],
"@pacakge-a/*": ["./src/*"],
"@pacakge-b/*": ["../package-b/src/*"],
"@package-c/*": ["../package-c/src/*"]
}
在代码中你可以导入像
这样的东西import { Thing } from '@/data/models/Thing';
import { stuff, in, other, package } from '@package-c/otherThings';
这可以工作,但是,每个都有一个本地tsconfig.js
文件,似乎在包级别工作。
问题在构建时出现。当我们有跨包依赖时——两个文件都使用它们的本地别名@
——编译器不知道该使用哪个。
Webpack有自己的别名
resolve: {
alias: {
"@": path.resolve(__dirname, 'src/'),
"@pacakge-a/*": path.resolve(__dirname, 'src/'),
"@pacakge-b": path.resolve(__dirname, '../pacakge-b/src/'),
"@pacakge-c": path.resolve(__dirname, '../pacakge-c/src/')
},
}
但是很明显,在构建时,只有一个webpack配置用于该包。
是否有办法解决这个问题-或者我们只需要将所有@/*
引用重命名为它们自己的包名?
您已经构建了一个多项目项目。有很多工具可以处理这些项目:"Yarn workspace"、"Npm workspace"和Lerna
Lerna是一个管理多个JavaScript项目的工具包。Lerna管理单orepos,其中可以包含项目内部有多个包。
我以前和Lerna一起工作过,你可以用
创建一个项目lerna init
将创建"packages"目录和lerna.json
文件。你添加你的webpack项目,package1, packge2;放到packages目录中。如果你想链接包:
// setting package1 as package2 dependencies
lerna add package1 --scope=package2
可以在package.json中查看package2的依赖关系。如果你使用Lerna,用户必须在他们的机器上安装Lerna cli工具来启动项目