Vue 3 用 Vite 库模式打包组件并发布到 npm:类型声明、tree-shaking 与产物校验

test12026-10-033 次阅读

为什么走库模式而不是应用构建

当你想把一组 Vue 组件或组合式函数交付给别的团队、或开源出去,最干净的方式是打成一个 npm 包,而不是一个整站。Vite 的“库模式”专门为此设计:它不生成带 HTML 入口的应用,而是直接把你的模块编译成可被 import 的 ES 与 CJS 产物。

配置 vite.config.ts

核心是 build.lib 字段。多入口时用对象形式,并且要把 vue 标记为外部依赖,避免把整个 Vue 打进包里。

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import { resolve } from "path";

export default defineConfig({
  plugins: [vue()],
  build: {
    lib: {
      entry: resolve(__dirname, "src/index.ts"),
      name: "MyUi",
      fileName: "my-ui",
      formats: ["es", "cjs"],
    },
    rollupOptions: {
      external: ["vue"],
      output: {
        globals: { vue: "Vue" },
        exports: "named",
      },
    },
  },
});

导出入口与样式

在 src/index.ts 里统一导出组件、类型与样式,保持对外 API 简洁。

import MyButton from "./components/MyButton.vue";
import MyModal from "./components/MyModal.vue";

export { MyButton, MyModal };
export type { ButtonProps } from "./types";

import "./style.css";

生成类型声明

Vite 本身不产出 .d.ts,需要配合 vue-tsc。在 package.json 里把脚本串起来。

{
  "scripts": {
    "build": "vue-tsc --declaration --emitDeclarationOnly && vite build",
    "prepublishOnly": "npm run build"
  },
  "files": ["dist"],
  "main": "./dist/my-ui.cjs",
  "module": "./dist/my-ui.js",
  "types": "./dist/index.d.ts",
  "exports": {
    ".": {
      "import": "./dist/my-ui.js",
      "require": "./dist/my-ui.cjs"
    }
  }
}

发布前检查清单

  • external 必须包含 vue 及所有想让使用方自己提供的依赖,否则产物会重复打包、tree-shaking 也失效。
  • exports 字段比 main/module 更现代,使用方用 ESM 或 CJS 都能正确解析。
  • 在副作用样式上谨慎:如果样式靠副作用引入,使用方可能需要显式导入,文档里要写清楚。
  • 本地先用 npm pack 生成 tgz,再 npm install 到测试项目验证,最后才 npm publish。

这样打出来的包体积小、类型完整,别人用 npm i 装上就能直接 import 你的 Vue 组件。

T

test1

文章作者

为什么走库模式而不是应用构建 当你想把一组 Vue 组件或组合式函数交付给别的团队、或开源出去,最干净的方式是打成一个...

分类
技术
发布时间
2026-10-03
字数
约 1631 字
阅读
3 次