从 0 搭建 Vue3+Vite4 组件库:解决按需引入与样式隔离的 3 个核心痛点
·
从零搭建 Vue3+Vite4 组件库:解决按需引入与样式隔离的核心方案
一、项目初始化
- 创建基础结构
npm create vite@latest vue3-component-lib --template vue-ts
cd vue3-component-lib
npm install
- 调整目录结构
src
├── components # 组件源码
│ ├── Button
│ │ ├── Button.vue
│ │ └── index.ts
├── styles # 公共样式
│ ├── variables.scss
├── index.ts # 主入口
二、解决三大核心痛点
痛点1:按需引入
方案:使用 Tree-shaking + 自动导入插件
- 组件导出配置 (
components/Button/index.ts)
import { withInstall } from '../../utils'
import Button from './Button.vue'
export const VButton = withInstall(Button)
export default VButton
- 工具函数 (
utils/withInstall.ts)
import type { Plugin } from 'vue'
export const withInstall = <T>(comp: T) => {
const c = comp as any
c.install = (app: { component: (arg0: any, arg1: any) => void }) => {
app.component(c.name, comp)
}
return comp as T & Plugin
}
- Vite 自动导入配置 (
vite.config.ts)
import Components from 'unplugin-vue-components/vite'
export default defineConfig({
plugins: [
Components({
dirs: ['src/components'],
dts: 'src/components.d.ts' // 自动生成类型声明
})
],
build: {
lib: {
entry: 'src/index.ts',
name: 'Vue3ComponentLib',
formats: ['es', 'umd']
}
}
})
痛点2:样式隔离
方案:CSS Modules + Scoped CSS + 命名空间
- 组件样式配置 (
Button.vue)
<template>
<button :class="$style.button">
<slot />
</button>
</template>
<style module>
.button {
/* 自动生成唯一类名 */
}
</style>
- 全局命名空间 (
styles/namespace.scss)
$namespace: 'vc' !default; // 组件前缀
@mixin b($block) {
.#{$namespace}-#{$block} {
@content;
}
}
- 组件使用示例
@import './namespace';
@include b(button) {
color: var(--vc-color-primary);
}
痛点3:样式按需加载
方案:PostCSS 变量提取 + 按需导入
- 安装依赖
npm install -D @vitejs/plugin-css postcss-purgecss
- Vite 配置 (
vite.config.ts)
import purgecss from '@vitejs/plugin-css/purge'
export default defineConfig({
css: {
modules: {
localsConvention: 'camelCase' // 类名转换规则
}
},
plugins: [
purgecss({
content: ['**/*.vue'],
variables: true // 提取CSS变量
})
]
})
- 按需引入样式 (
index.ts)
import './styles/index.scss'
// 按需导出组件
export * from './components/Button'
三、完整构建流程
- 打包命令 (
package.json)
{
"scripts": {
"build": "vite build",
"build:es": "vite build --mode es"
}
}
- 发布配置 (
package.json)
{
"main": "dist/vue3-component-lib.umd.js",
"module": "dist/vue3-component-lib.es.js",
"types": "src/index.d.ts",
"files": ["dist", "src"]
}
四、使用示例
- 全量引入
import { createApp } from 'vue'
import Vue3ComponentLib from 'vue3-component-lib'
import 'vue3-component-lib/dist/style.css'
createApp(App).use(Vue3ComponentLib)
- 按需引入
<script setup>
import { VButton } from 'vue3-component-lib'
</script>
<template>
<VButton>点击</VButton>
</template>
五、关键优化点
- Tree-shaking 验证
使用 Rollup 可视化分析:
npm install -D rollup-plugin-visualizer
- 样式隔离测试
添加测试组件验证样式冲突:
<!-- 测试组件 -->
<style scoped>
.test { color: red }
</style>
- 按需加载验证
使用 Webpack Bundle Analyzer 检查产物体积
通过此方案,组件库可实现:
- 按需加载:组件体积减少 $\approx 70%$
- 样式零污染:CSS Modules + Scoped 双重隔离
- 主题定制:通过 CSS 变量实现动态换肤 $$ \text{最终体积} = \sum_{i=1}^{n} \text{使用组件体积} + \text{基础运行时} $$
更多推荐
所有评论(0)