Vite 打包组件库之多版本库构建
背景
由于业务开发中,某一个业务组件的第一版本设计没考虑周全,在实际业务中的体验以及性能不是很乐观。
所以需要实现一个 v2
版本来满足咱们新的重构,至于怎么重构,一些实现细节,本文就不阐述了,会有些偏题了。
目标
- 实现多版本组件共存
- 满足多个场景下的渐进式升级
实现
我们需要准备两个维度的配置:
- 打包维度 ------ 确保多入口可以打包
OK
package.json
的配置 ------ 确保外部可以引入正确的声明文件
打包配置
// vite.config.js
import { defineConfig, loadEnv } from 'vite'
import path from 'path';
import dts from 'vite-plugin-dts'
export default defineConfig(({ command, mode }) => {
return {
build: {
target: "es2015",
lib: {
entry: {
v1: path.join('./src/v1'),
v2: path.join('./src/v2'),
},
formats: ['es', 'cjs'],
fileName(format, entryName, ...rest) {
return `index.${format}.${entryName}.${format === 'es' ? 'js' : 'mjs'}`;
}
},
outDir: "lib",
},
plugins: [dts({
outDir: 'types'
})]
}
});
咱们只需要配置多入口,配置打包产物的输出文件名命名,以及 type
类型的输出(如果有)。
Package.jon
{
"name": "rollup-stylex",
"version": "1.0.0",
"description": "",
"type": "module",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "vite build"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@rollup/plugin-swc": "^0.3.0",
"@swc/cli": "^0.1.63",
"@swc/core": "^1.3.102",
"rollup": "^4.9.2",
"typescript": "^5.3.3",
"vite": "^5.1.5",
"vite-plugin-dts": "^3.7.3"
},
"files": ["lib", "types"],
"typesVersions": {
"*": {
"*": ["./types/v1/index.d.ts"],
"v2": ["./types/v2/index.d.ts"]
}
},
"exports": {
"./package.json": "./package.json",
".":{
"import": "./lib/index.es.v1.js",
"require": "./lib/index.cjs.v1.mjs"
},
"./v2":{
"import": "./lib/index.es.v2.js",
"require": "./lib/index.cjs.v2.mjs"
}
}
}
我们可以重点关注下 exports
、typesVersions
两个字段的配置:
exports
保证了不同路径下的引用区分import
和require
的路径正确性typesVersions
可以保证不同typescript
版本,不同的文件路径下的声明文件引入
如图所示,完美地保证了类型以及不同入口的对象引入与导出。
小结
顺带一提的是,在 vite
中,我们一般还需要处理 css
的引入问题, 而多入口打包如果不配置,则会有一些异常表现。
借助:https://github.com/marco-prontera/vite-plugin-css-injected-by-js,配置relativeCSSInjection
为true
即可。
以上便是一次在生产业务中的一次组件库多版本打包的实践,希望对你有帮助。
我是不换,我们下次再会!