如何从0开始搭建 Vue 组件库
作者:京东零售 陈艳春
前言:
组件设计是通过对功能及视觉表达中元素的拆解、归纳、重组,并基于可被复用的目的,形成规范化的组件,通过多维度组合来构建整个设计方案,將这些组件整理在一起,便形成组件库。本文我们主要讲述基于Vant CLI的自建组件库。Vant CLI 是一个基于 Vite 实现的 Vue 组件库构建工具,通过 Vant CLI 可以快速搭建一套功能完备的 Vue 组件库。
建立组件库的意义
首先组件库可以给我们降本提效,其次可以保持视觉风格统一以及交互一致,可以帮助我们快速构建使用场景,便于多个项目后续迭代升级 。
视觉风格统一以及交互的一致性,可以减少用户学习成本培养用户习惯,让产品拥有良好的用户体验。比如一个四级地址的选择组件,在整个产品中应该就一种交互方式,如果一会是滚动选择,一会是点击选择,会让用户操作起来比较烦躁,统一交互可以减少用户学习成本。
新产品上线后,还需要不断的去完善,在迭代过程中可能会新增其他功能,这时候我们就可以只修改组件库一套代码,所有不同项目相同组件就可以达到了迭代升级的效果。
如何创建组件库
一、梳理组件清单
首先梳理出项目中样式相同的模块,和产品讨论未来会有哪些规划,现有的组件是否能够满足需求,是否需要补充设计方案,清单整理完毕后,将每一个组件建成一个独立任务,像日常需求那样,方便随时更新使用。
二、场景整合
把自己变成产品的深度用户,把现有线上产品完整体验一遍,绘制用户行为路径,并和需求方沟通了解后续计划,将组件的所有的当前/潜在应用场景总结出来,尽可能不遗漏场景。
三、组件库框架选型
看了开源的 Vue3 组件库,总结了一些前端目前流行的趋势,列出来多个版本和框架的,本文只讨论 Vue3 版本。
1.element-plus - 经典中的经典,全面支持 Vue 3
2.tdesign-vue-next - 鹅厂优质 UI 组件,配套工具完满,设计工整,文档清晰
3.arco-design-vue- 字节跳动开源 UI 组件库,大厂逻辑,设计文档完美
4.ant-design-vue - 蚂蚁前端 UI 库,面向企业级中后台
5.naive-ui - 宝藏 Vue UI 库,Vue UI 新星,从 Vue 3 起步
6.vant - 有赞团队开源移动 UI 组件库,全面支持 Vue 3
7.nutui - 京东出品,移动端友好,面向电商业务场景
8.vuetify - 老牌 Vue UI ,基于谷歌的 Material Design 样式开发
9.varlet - Varlet 是一个基于 Vue3 开发的 Material 风格移动端组件库,全面拥抱 Vue3 生态,由社区建立起来的组件库团队进行维护。
四、组件库搭建
我们以Vant CLI为例来详细剖析具体搭建过程:
(1)首先确保本地node版本^12.13.0 || ^14.15.0 || >=16.0.0
(2)执行以下命令可以快速创建一个基于 Vant CLI 的项目
yarn create vant-cli-app
(3)手动安装
# 通过 npm
npm i @vant/cli -D
# 通过 yarn
yarn add @vant/cli -D
# 通过 pnpm
pnpm add @vant/cli -D
(4)手动配置
{
"scripts": {
"dev": "vant-cli dev",
"test": "vant-cli test",
"lint": "vant-cli lint",
"build": "vant-cli build",
"prepare": "husky install",
"release": "vant-cli release",
"build-site": "vant-cli build-site"
},
"nano-staged": {
"*.md": "prettier --write",
"*.{ts,tsx,js,vue,less,scss}": "prettier --write",
"*.{ts,tsx,js,vue}": "eslint --fix"
},
"eslintConfig": {
"root": true,
"extends": ["@vant"]
},
"prettier": {
"singleQuote": true
},
"browserslist": ["Chrome >= 51", "iOS >= 10"]
}
(5)本地启动
npm run dev启动项目,页面如下:
注:介绍、快速上手、定制主题、编码规范、开发指南是根据自己组内的规范编写。
(6)如何开发组件库
目录结构
•仓库的组件代码位于 src 下,每个组件一个文件夹
•docs 目录下是文档网站的代码,本地开发时可以在目录下运行 npm run dev 开启文档网站
项目主要目录如下:
m-tetris
├─ build # 构建
├─ docs # 文档
├─ es # 打包
├─ lib # 打包
├─ site # 静态站点资源
├─ src # 组件
├─ test # 单测
└─ static # 图片等资源
添加新组件
添加新组件时,请按照下面的目录结构组织文件,并在 vant.config.js 中配置组件名称。
src
└─ button
├─ demo # 示例代码
├─ test # 单元测试
├─ index.vue # 组件入口
├─ index.less # 组件样式
└─ README.md # 组件文档说明
本地测试
# 打包,生成lib es文件夹
npm run build
# 生成压缩包
npm pack
# 在项目中安装测试包
npm install 压缩包的绝对路径(例如:/Users/用户名/work/XXX/XXX.0.tgz)
五、如何发布到公司npm私服或者npm官网
所有公司内网用户都能够发布包到 jnpm 库。
如果你之前没有发布包的经验,请先查看 npm 官方文档 npm publish 。
# 拉取最新的master
# 构建npm包
npm run build
# 登录(如已登录,请忽略)
npm login
# 发布
# 如果是公司私服、请保证源是公司源
npm publish
六、如何在项目中使用组件
方式一. 自动按需引入组件 (推荐)
babel-plugin-import 是一款 babel 插件,它会在编译过程中将 import 的写法自动转换为按需引入的方式。
# 安装插件
npm i babel-plugin-import -D
// 在.babelrc 中添加配置
// 注意:webpack 1 无需设置 libraryDirectory
{
"plugins": [
["import", {
"libraryName": "xxx-vant",
"libraryDirectory": "es",
"style": true
}]
]
}
// 对于使用 babel7 的用户,可以在 babel.config.js 中配置
module.exports = {
plugins: [
['import', {
libraryName: 'xxx-vant',
libraryDirectory: 'es',
style: true
}, 'xxx-vant']
]
};
// 接着你可以在代码中直接引入 xxx-vant 组件
// 插件会自动将代码转化为方式二中的按需引入形式
import { IndexBar } from 'xxx-vant';
方式二. 手动按需引入组件
在不使用插件的情况下,可以手动引入需要的组件。
import Button from 'xxx-vant/lib/index-bar';
import 'xxx-vant/lib/index-bar/style';
方式三. 导入所有组件
xxx-vant 支持一次性导入所有组件,引入所有组件会增加代码包体积,因此不推荐这种做法。
import Vue from 'vue';
import Jdxxx from 'xxx-vant';
import 'xxx-vant/lib/index.css';
Vue.use(Jdxxx);
参考资料:vant-cli官网:https://github.com/youzan/vant/blob/HEAD/packages/vant-cli/README.zh-CN.md
如何从0开始搭建 Vue 组件库的更多相关文章
- 从零开始搭建Vue组件库——VV-UI
前言: 前端组件化是当今热议的话题之一,也是我们在开发单页应用经常会碰到的一个问题,现在我们有了功能非常完善的Element-UI.各个大厂也相继宣布开源XXX-UI.但是也会存在一些问题,比如每个公 ...
- 从零开始搭建Vue组件库 VV-UI
前言: 前端组件化是当今热议的话题之一,也是我们在开发单页应用经常会碰到的一个问题,现在我们有了功能非常完善的Element-UI.各个大厂也相继宣布开源XXX-UI.但是也会存在一些问题,比如每个公 ...
- 如何从0开发一个Vue组件库并发布到npm
1.新建文件夹在终端打开执行 npm init -y 生成package.json如下,注意如果要发布到npm,name不能有下划线,大写字母等 { "name": "v ...
- 使用VitePress搭建及部署vue组件库文档
每个组件库都有它们自己的文档.所以当我们开发完成我们自己的组件库必须也需要一个组件库文档.如果你还不了解如何搭建自己的组件库可以看这里->从零搭建Vue3组件库.看完这篇文章你就会发现原来搭建和 ...
- 从0搭建Vue3组件库(二):Monorepo项目搭建
本篇文章是从0搭建Vue3组件库系列文章第二篇,本篇文章将带领大家使用pnpm搭建一个简单的Monorepo项目,并完成包的关联与测试 什么是 Monorepo 其实很简单,就是一个代码库里包含很多的 ...
- ElementUI 不维护了?供我们选择的 Vue 组件库还有很多!
前文回顾:Vue+Spring Boot 前后端分离的商城项目开源啦! Vue 组件千千万,只要不行咱就换. ElementUI 近况 根据我最近的观察,得知一些关于 ElementUI 维护人员都退 ...
- Vue组件库的那些事儿,你都知道吗?
前段时间一直在研究Vue组件库,终于在组内派上了用场.来给大家贡献一篇关于Vue组件库的相关知识.经验不多,如果有不合理的地方还请多多指出哦--- 回想一下,在你们公司或者你们小组是否有一个以上的项目 ...
- 在vue2.0中引用element-ui组件库
element-ui是由饿了么团队开发的一套基于 Vue 2.0 的桌面端组件库. 官网:http://element.eleme.io/ 安装 npm i element-ui -S 引用完整的el ...
- 从0开始搭建vue+webpack脚手架(二)
接着从0开始搭建vue+webpack脚手架(一) 三.配置webpack-dev-server 1. webpack-dev-server自带一个node的服务器, 项目在服务端运行的同时可以实现热 ...
- 仿ElementUI构建自己的Vue组件库用babel-plugin-component按需加载组件及自定义SASS主题
最近使用ElementUI做项目的时候用Babel的插件babel-plugin-component做按需加载,使得组件打包的JS和CSS包体积大大缩小,加载速度也大大提升,所有想模仿做一个组件库也来 ...
随机推荐
- 全文手敲代码,教你用Java实现扫雷小游戏
摘要:本程序共封装了五个类,分别是主类GameWin类,绘制底层地图和绘制顶层地图的类MapBottom类和MapTop类,绘制底层数字的类BottomNum类,以及初始化地雷的BottomRay类和 ...
- Windows Service 服务中,不能访问挂载目录(网络映射盘)
SpringBoot Windows 自启动 - 通过 Windows Service 服务实现 Windows Service 服务中,不能访问挂载目录(网络映射盘) 在Windows操作系统中,系 ...
- Unable to open debugger port (127.0.0.1:53471): java.net.SocketException "Socket closed"
21:59 Error running 'Vipsoft': Cannot run program "/Users/jimmy/Java/apache-tomcat-9.0.14/bin/c ...
- docker中安装的mysql无法远程连接问题解决
背景: 在ubuntu1804的docker中安装了mysql,版本是5.7.34.因为有复杂的数据要插入到数据库中,所以从宿主机通过pycharm和DBeaver连接,但是一直报错: Can not ...
- 不使用kvm的qemu虚拟化
本文记录的是在某些机器上并不支持kvm虚拟化,单纯使用qemu来完成虚拟机的创建和管理. 系统版本:centos 7 qemu版本:4.2 首先说明一下qemu和kvm的关系: qemu 是一个模拟器 ...
- 低风险稳健策略:BTC套利策略
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 币安零手续费带来的机会 从7月8日的20点开始,币安推出了BTC现货交易零手续费的优惠活动,不论是Mak ...
- SuperSocket 简单示例
这是一个SuperSocket 简单示例,包括服务端和客户端. 一.首先使用NuGet安装SuperSocket和SuperSocket.Engine 二.实现IRequestInfo(数据包): 数 ...
- Socket | 大小端问题和网络字节序转换函数
不同 CPU 中,4 字节整数 1 在内存空间的存储方式是不同的.4 字节整数 1 可用 2 进制表示如下: 00000000 00000000 00000000 00000001 有些 CPU 以上 ...
- java获取年月日、时间与区间、Sql获取年月日区间
SQL 获取时.日.周.月日期 因工作上常用到统计分析,需要用到具体的时间,故写于此 24小时: SELECT 0 AS hour UNION ALL SELECT 1 AS hour UNION A ...
- 师爷,翻译翻译什么叫AOP
张麻子:汤师爷,翻译翻译,什么叫AOP? 汤师爷:这还用翻译. 张麻子:我让你翻译给我听,什么叫AOP? 汤师爷:不用翻译,切面编程就是AOP啊. 黄四郎:难道你听不懂什么叫AOP? 张麻子:我就想让 ...