把内部组件库从 webpack 迁到 Vite 的库模式,记录配置要点和踩过的坑。

build.lib 基础配置

export default defineConfig({
  build: {
    lib: {
      entry: 'src/index.ts',
      formats: ['es', 'umd'],
      fileName: (format) => `widget.${format}.js`
    }
  }
})

库模式下 Vite 只做打包不做 HTML 注入,产物是纯 JS。UMG 格式注意 name 配置,它决定全局变量名。

external:别把依赖打进去

react、react-dom 这类 peerDependencies 必须 external,否则依赖会被打进产物:体积膨胀是小事,多实例导致 hooks 报错是大事。

build: {
  rollupOptions: {
    external: ['react', 'react-dom'],
    output: { globals: { react: 'React', 'react-dom': 'ReactDOM' } }
  }
}

体积优化

  • 按需引入:package.json 加 sideEffects: false,保持命名导出;
  • sourcemap 只保留在内部版本,对外发布关闭;
  • 用 rollup-plugin-visualizer 看 gzip 前后的体积构成,优先砍大依赖。

CSS 怎么办

库模式下 CSS 默认被注入进 JS,运行时动态创建 style 标签。更好的做法是提供一个独立样式入口 style.css,让使用者二选一,避免样式重复注入。

小结

库模式本身配置不多,真正花时间的是产物策略:external 边界、按需能力和 CSS 注入方式,这些决定了使用方接入的体验。