作为一名前端开发者,开发一个自己的Vue 3组件库不仅能提升技术能力,还能为社区贡献力量。本文将带你从零开始,基于Vue
3和Vite,开发一个简单的UI组件库(包含一个按钮组件),并打包发布到NPM。文章涵盖项目搭建、组件开发、按需加载支持、测试与发布的全流程,适合想进阶Vue
3开发的你!欢迎关注我的博客和公众号(微信搜索:小贺前端笔记),更多干货和实战项目等你来发现!
我们使用Vite作为构建工具,因为它对Vue 3支持优秀,速度快且配置简单。
npm create vite@latest my-vue3-ui --template vue
cd my-vue3-ui
npm install
组件库需要支持样式封装和按需加载,安装以下依赖:
npm install -D vite-plugin-dts @vitejs/plugin-vue sass
vite-plugin-dts
:生成TypeScript类型声明文件。@vitejs/plugin-vue
:支持Vue单文件组件。sass
:用于编写组件样式。创建一个清晰的目录结构,便于维护:
my-vue3-ui/
├── src/
│ ├── components/ # 组件目录
│ │ └── Button.vue # 示例按钮组件
│ ├── index.ts # 组件库入口
│ └── styles/ # 全局样式
│ └── index.scss # 全局样式入口(可选)
├── vite.config.ts # Vite配置文件
├── package.json
└── README.md
我们以一个简单的Button
组件为例,支持type
(primary/success)和disabled
属性。
在src/components/Button.vue
中编写组件代码:
scoped
属性,确保样式可以被 Vite 提取到全局 CSS 文件(dist/style.css
)。
简化代码。type
和 disabled
属性,样式用 SCSS 实现主题化和 hover 效果。在src/index.ts
中导出组件并提供install
方法,支持全局注册:
import { App } from 'vue';
import Button from './components/Button.vue';
const components = [Button];
const install = (app: App) => {
components.forEach((component) => {
app.component(component.name || 'MyButton', component);
});
};
export { Button };
export default { install };
component.name || 'MyButton'
,防止组件未定义 name
属性时注册失败。为了让组件库支持按需加载和TypeScript,我们需要配置Vite。
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import dts from 'vite-plugin-dts';
import { resolve } from 'path';
export default defineConfig({
plugins: [
vue(),
dts({ insertTypesEntry: true }),
],
build: {
lib: {
entry: resolve(__dirname, 'src/index.ts'),
name: 'MyVue3UI',
fileName: 'my-vue3-ui',
cssFileName: 'style', // 确保CSS文件名为style.css
},
rollupOptions: {
external: ['vue'],
output: {
globals: {
vue: 'Vue',
},
},
},
cssCodeSplit: false, // 合并所有CSS到一个文件
},
});
build.lib.cssFileName: 'style'
:确保 CSS 输出为 dist/style.css
。cssCodeSplit: false
:将所有 CSS 合并到单一文件。external: ['vue']
:将 Vue 设为外部依赖,避免打包到组件库中。修改package.json
,添加入口和类型声明:
{
"name": "my-vue3-ui",
"version": "0.1.0",
"main": "./dist/my-vue3-ui.umd.js",
"module": "./dist/my-vue3-ui.es.js",
"types": "./dist/index.d.ts",
"exports": {
".": {
"import": "./dist/my-vue3-ui.es.js",
"require": "./dist/my-vue3-ui.umd.js"
},
"./dist/style.css": "./dist/style.css"
},
"files": ["dist"],
"scripts": {
"build": "vite build",
"publish": "npm publish --access public"
},
"peerDependencies": {
"vue": "^3.0.0"
},
"devDependencies": {
"@vitejs/plugin-vue": "^5.0.0",
"sass": "^1.70.0",
"vite": "^5.0.0",
"vite-plugin-dts": "^3.7.0"
}
}
devDependencies
,明确依赖版本,确保环境一致。exports
:确保 CSS 文件可通过 import 'my-vue3-ui/dist/style.css'
引入。在src/styles/index.scss
中定义全局样式(当前为空,因为样式已内联在组件中):
/* src/styles/index.scss */
/* 暂时为空,未来可添加全局样式 */
在src/index.ts
中导入样式(可选):
import './styles/index.scss';
Button.vue
中定义,index.scss
当前为空。如果未来需要全局样式,可以在此添加。Button.vue
中的非 scoped
样式到 dist/style.css
。在本地测试组件库是否正常工作。
在src/App.vue
中测试Button
组件:
Primary Button
Success Button
运行 npm run dev
,检查按钮的样式和功能是否正常(蓝色主按钮、绿色成功按钮、灰色禁用状态)。
使用 npm link
测试组件库:
在组件库目录运行:
npm run build
npm link
创建一个新的 Vue 3 测试项目(如果没有):
npm create vite@latest test-project --template vue
cd test-project
npm install
在测试项目中运行:
npm link my-vue3-ui
在测试项目的 src/main.ts
中导入并使用:
import { createApp } from 'vue';
import App from './App.vue';
import MyVue3UI from 'my-vue3-ui';
import 'my-vue3-ui/dist/style.css';
const app = createApp(App);
app.use(MyVue3UI);
app.mount('#app');
在测试项目的 src/App.vue
中使用组件:
主按钮
成功按钮
运行测试项目:
npm run dev
验证按钮是否显示正确样式。
确保你有NPM账号,运行:
npm login
npm run build
npm publish --access public
package.json
中的 name
唯一(建议改为 @yourname/my-vue3-ui
)。npm run build
,检查 dist
目录是否包含 my-vue3-ui.es.js
、my-vue3-ui.umd.js
、style.css
和 index.d.ts
。npm version patch
)后重新发布。你在开发Vue组件库时遇到过哪些问题?欢迎在评论区分享你的经验!
想深入学习Vue 3和前端开发?以下是几篇值得一读的文章:
Vue 3 中的新特性:Suspense和Teleport
从初级到高级前端:如何写出高质量代码,迈向职业新高度