如何排除Vite构建的React+Firebase库中的@firebase依赖?
问题描述
我正在开发一款基于React和Firebase的Hook+组件库,目前库已具备一定稳定性,核心目标是尽可能压缩打包体积。我编写了如下vite.config.ts配置:
import peerDepsExternal from "rollup-plugin-peer-deps-external"; import { defineConfig } from "vite"; import dts from "vite-plugin-dts"; import { peerDependencies } from "./package.json"; export default defineConfig({ build: { lib: { entry: "./src/index.ts", // 指定库构建的入口文件 name: "firereact", // 设置生成的库名称 fileName: (format) => `index.${format}.js`, // 根据格式生成输出文件名 formats: ["cjs", "es"], // 指定输出格式(CommonJS和ES模块) }, rollupOptions: { external: [...Object.keys(peerDependencies)], // 定义Rollup打包的外部依赖 }, sourcemap: true, // 生成用于调试的源映射文件 emptyOutDir: true, // 构建前清空输出目录 }, plugins: [dts(), peerDepsExternal()], // 使用vite-plugin-dts生成TypeScript声明文件(d.ts) });
按预期,build.lib.rollupOptions.external会从package.json中读取peer依赖,peerDepsExternal插件用于避免打包peer依赖的嵌套依赖。但通过npx vite-bundle-visualizer分析后发现,@firebase相关代码被包含在最终库中,用less dist/index.es.js也能看到混淆后的@firebase痕迹。Firebase是我声明的peer依赖,理论上不应被打包进库,请问如何彻底将@firebase从打包产物中排除?
已尝试的排查方法
- 在
vite.config.ts的build.lib.rollupOptions.external中手动添加@firebase - 调整
tsconfig.json中的相关设置
解决方法
1. 用正则匹配所有@firebase子包
Rollup的external选项默认只匹配精确包名,若代码中导入的是@firebase/app、@firebase/firestore这类子包,仅写@firebase无法覆盖所有相关依赖。需添加正则表达式匹配所有@firebase/*开头的包:
修改vite.config.ts中的rollupOptions.external部分:
rollupOptions: { external: [ ...Object.keys(peerDependencies), /^@firebase\/.+$/ // 匹配所有@firebase子包 ], },
2. 确保peerDependencies声明准确
检查package.json,若代码直接使用@firebase子包,需在peerDependencies中明确列出:
"peerDependencies": { "react": "^18.0.0", "react-dom": "^18.0.0", "@firebase/app": "^10.0.0", "@firebase/firestore": "^10.0.0" // 其他你用到的@firebase子包 }
若依赖完整的firebase包,直接声明"firebase": "^10.0.0"即可。
3. 清理缓存后重新构建
执行以下命令清空缓存和旧产物,避免缓存导致配置不生效:
rm -rf dist node_modules/.vite npm run build
内容的提问来源于stack exchange,提问作者Eray Erdin
相关产品推荐
相关产品推荐

