#302 中提到了在 monorepo 下打包错误的问题,这里我提供一个取巧的解决办法。
产生这个问题的核心原因是外部库被剔除,导致无法被打包进去,因此我尝试了将 strictOutput 设为 false,虽然可行,但是这导致插件会在根目录下产生一堆临时的 dts 文件及文件夹,例如对于下列目录:
- packages
- packageA
- packageB
我们对 packageA 打包,那么会在根目录下产生 packageB 文件夹:
最终打包完成后,packageB 将会是一个只包含空文件夹的文件夹。我想这应该是一个 bug,这些 dts 文件应该生成在对应的 packages/packageB 文件夹中,但是却生成到了根目录。所以我想如果把这个问题修复了,那么 monorepo 下打包就可以使用 strictOutput: false 来实现。
这是我的完整构建脚本可供参考:
for (const packageName of packageDirs) {
const packageDir = path.join(packages, packageName);
const output = path.join(packageDir, 'dist');
await fs.emptyDir(output);
const configFile = path.resolve('./vite.config.ts');
const config = await loadConfigFromFile(
{ command: 'build', mode: 'production' },
configFile
);
const resolved = mergeConfig(config?.config ?? {}, {
plugins: [
dts({
insertTypesEntry: true,
entryRoot: path.join(packageDir, 'src/index.ts'),
rollupTypes: true,
strictOutput: false,
copyDtsFiles: false,
})
],
build: {
lib: {
entry: path.join(packageDir, 'src/index.ts'),
name: packageName,
formats: ['es', 'cjs'],
fileName: format => `${packageName}.${format}.js`
},
outDir: output,
sourcemap: true,
emptyOutDir: true,
},
publicDir: false
} satisfies UserConfig);
await build(resolved);
console.log(`✅ Package ${packageName} built successfully.`);
}
// 最后把错误在根目录生成的文件夹删除
const dirs = await fs.readdir(packages);
for (const name of dirs) {
const dir = path.join(process.cwd(), name);
await fs.emptyDir(dir);
await fs.rmdir(dir);
}
#302 中提到了在 monorepo 下打包错误的问题,这里我提供一个取巧的解决办法。
产生这个问题的核心原因是外部库被剔除,导致无法被打包进去,因此我尝试了将
strictOutput设为false,虽然可行,但是这导致插件会在根目录下产生一堆临时的 dts 文件及文件夹,例如对于下列目录:我们对
packageA打包,那么会在根目录下产生packageB文件夹:最终打包完成后,packageB 将会是一个只包含空文件夹的文件夹。我想这应该是一个 bug,这些 dts 文件应该生成在对应的
packages/packageB文件夹中,但是却生成到了根目录。所以我想如果把这个问题修复了,那么 monorepo 下打包就可以使用strictOutput: false来实现。这是我的完整构建脚本可供参考: