Vite库模式需正确配置build.lib入口与formats(如['es','cjs']),搭配exports字段、类型声明和package.json元信息,确保ESM/CJS兼容、Tree-shaking支持与类型提示。

用 Vite 构建库(Library Mode)输出符合规范的包,核心是正确配置 build.lib 选项,并搭配合理的入口、导出与类型声明。它不是简单改个 mode 就能发布到 npm,需兼顾 ESM/CJS 兼容性、Tree-shaking 支持、类型提示和包元信息。
配置 build.lib 入口与格式
Vite 库模式通过 build.lib 指定入口文件和构建目标格式。推荐显式指定 formats,避免默认只输出 esm:
-
entry:指向一个纯导出的模块(如src/index.ts),不包含 HTML 或副作用逻辑 -
formats:至少包含['es', 'cjs'];es供现代 bundler(如 Vite、Webpack)原生导入,cjs兼容 Node.js 和旧版工具链 -
fileName:可按格式自定义输出名(如package.json中的"main"对应cjs,"module"或"exports"对应es)
示例 vite.config.ts:
export default defineConfig({
build: {
lib: {
entry: resolve(__dirname, 'src/index.ts'),
name: 'MyLib',
formats: ['es', 'cjs'],
fileName: (format) => `index.${format === 'es' ? 'mjs' : 'cjs'}`
}
}
})
导出方式要适配多种消费场景
库的 package.json 导出字段决定使用者如何 import。推荐使用 "exports" 字段(Node.js 12.20+ / npm 12+),比 "main" + "module" 更精确且安全:
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
"exports": { ".": { "import": "./dist/index.mjs", "require": "./dist/index.cjs" } }- 若需支持子路径导入(如
import { util } from 'mylib/util'),在exports中添加对应条目,并确保src/util.ts有独立构建或通过条件导出处理 - 避免在入口文件中直接
console.log或执行副作用代码——库应“纯净”,只做导出
生成并内联 TypeScript 类型声明
Vite 默认不生成 .d.ts,需借助 rollup-plugin-dts 或更推荐的方式:用 vue-tsc(非 Vue 项目也可用)或 tsc --emitDeclarationOnly 单独生成类型文件,再复制进 dist:
- 在
tsconfig.json中设置"declaration": true、"outDir": "dist"、"rootDir": "src" - 运行
tsc --emitDeclarationOnly --declarationMap false生成dist/index.d.ts - 在
package.json中声明"types": "dist/index.d.ts",确保 IDE 和消费者能自动加载类型
注意:不要把 node_modules 或未导出的内部模块类型暴露出去,可通过 "skipLibCheck": true 和精细的 include/exclude 控制。
补全包元信息与发布准备
一个可发布的包还需几个关键字段:
-
"type": "module":若主入口是 ESM(.mjs或exports.import指向.mjs),必须加此字段,否则 Node.js 会以 CJS 解析 -
"files":明确列出要发布到 npm 的目录/文件(如["dist", "package.json", "README.md"]),防止源码或锁文件被误发 -
"sideEffects": false或数组形式:告知 Webpack 等工具该包无副作用,支持安全的 Tree-shaking - 测试构建产物:用
npm pack生成 tarball,解压检查dist结构、类型文件是否存在、exports是否指向正确路径
不复杂但容易忽略。

















