主流组件库学习

news2025/1/18 0:32:35

主流组件库差异性对比

  • NutUI - 京东研发的移动端 UI 组件库,支持 Vue3、Taro 多端适配,面向电商业务场景
  • Vant - 有赞研发的移动端 UI 组件库,支持 Vue3、微信小程序、支付宝小程序
  • TDesign Mobile - 腾讯研发的移动端组件库,适合在 Vue3 技术栈项目中使用
  • Ant Design Mobile - 蚂蚁金服研发的移动端组件库,支持 React
  • Mand Mobile - 滴滴研发的面向金融场景的 UI 组件库,支持 Vue3
  • Varlet - Vue3 开发的 Material 风格移动端组件库,由社区的小伙伴开发和维护
  • element - 饿了么公司前端团队开发的一套基于VUE2.0的桌面端组件库,提供了丰富的 PC 端组件
  • iview - 一套基于 Vue.js 的开源 UI 组件库,主要服务于 PC 界面
  • ViewUIPIus - View Design 设计体系中基于 Vue.js 3 的一套 UI 组件库
  • mint-ui -
  • Material-UI - 基于 GoogleMaterial Design设计语言开发的移动端 UI 组件库,支持 React

初步了解与对比

组件库技术栈组件数量Npm下载量Github Star包管理单元测试构建工具发包
VantVue68+4,129,54720.3k
elementVue55个,分为六大类52.7k
element-pluspnpm workspace(实现了monorepo)
iviewVue43+150
View UI PlusVue80+
mint-uiVue30+16.5k
Ant Design MobileReact534,947,71482.2k
material-uiReact2,31681.9k
组件库技术栈Fork次数Github Star样式包管理单元测试构建代码风格
element-plusTypeScript、Vue SFC(Vue 单文件组件)6.5k17.4kScss、CSS varpnpm workspace(实现了monorepo)Jest、VitestRollup、esbuild、TypeScript、GulpESLint、Prettier

本文章基于 Element Plus v2.1.4。

(注:Npm 下载量统计的截止时间为:2022年6月20日)

分析的这些组件库都是基于几大前端的生态来实现的,在设计上都已经形成了自己的风格和规范,也有自己的沉淀。他们的优点是已经发展的很成熟了,基本上可以cover大多数的业务场景,缺点是组件库在跨框架迁移上的成本较大

jest*+testing-*library/react 单元测试

element-plus

Element Plus 源码分析——构建与代码风格

element-ui

Element-UI 技术揭秘(2)- 组件库的整体设计

四大优势:

  1. 丰富的 feature:丰富的组件,自定义主题,国际化。

    1. 组件共分成了 6 大类,分别是基础组件、表单类组件、数据类组件、提示类组件、导航类组件和其它类型组件。这些丰富的基础组件能很好地满足大部分 PC 端 to B 业务开发需求
  2. 文档 & demo:提供友好的文档和 demo,维护成本小,支持多语言

  3. 安装 & 引入:支持 npm 方式和 cdn 方式,并支持按需引入。

  4. 工程化:开发,测试,构建,部署,持续集成。

    • 开发阶段:

      1. 为了保证大家代码风格的一致性,使用了 ESLint,甚至专门写了 eslint-config-elemefe 作为 ESint 的扩展规则配置;
      2. 为了方便本地开发调试,借助了 webpack 并配置了 Hot Reload;
      3. 利用模块化开发的思想把组件依赖的一些公共模块放在了 src 目录,并依据功能拆分出 directives、locale、mixins、transitions、utils 等模块。
    • 测试阶段:

      1. 使用了 karma 测试框架,为每一个组件编写了单元测试,并且利用 Travis CI 集成了测试。
    • 构建方面:

      1. element-ui 编写了很多 npm scripts

        dist 这个 script 为例:

        "dist": "npm run clean && npm run build:file && npm run lint && webpack --config build/webpack.conf.js && webpack --config build/webpack.common.js && webpack --config build/webpack.component.js && npm run build:utils && npm run build:umd && npm run build:theme",
        

        它的内部会依次执行多个命令,最终生成 lib 目录和打包后的文件。

        这里介绍一下build:file这个script做的事情:

        "build:file": "node build/bin/iconInit.js & node build/bin/build-entry.js & node build/bin/i18n.js & node build/bin/version.js"
        

        依次执行 build/bin目录下的一些Node脚本,对 icon、entry、i18n、version 等做了一系列的初始化工作,它们的内容都是根据一些规则做文件的 IO,这么做的好处就是完全通过工具的手段自动化生成文件,比人工靠谱且效率更高。

    • 部署阶段

      1. 通过 pub 这个 npm script 完成。主要是通过运行一系列的 bash 脚本,实现了代码的提交、合并、版本管理、npm 发布、官网发布等,让整个发布流程自动化完成

        "pub": "npm run bootstrap && sh build/git-release.sh && sh build/release.sh && node build/bin/gen-indices.js"
        

项目引入组件库有两种方式:

1. CDN:在线方式直接在页面上引入 Element-ui 的 JS 和 CSS 文件,代码如下:
    <!-- 引入样式 --> 
    <link rel="stylesheet" 
    href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"> 
    <!-- 引入组件库 --> 
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
2. npm 安装element-ui
	npm install element-ui -S

目录结构解析

在这里插入图片描述
在这里插入图片描述

记录一下不常见的一些文件:

  • .travis.yml:持续集成(CI)的配置文件

  • CHANGELOG:更新日志,这里Element UI提供了四种不同语言的,也是很贴心了

  • components.json:标明了组件的文件路径,方便 webpack 打包时获取组件的文件路径。

  • FAQ.md:ElementUI 开发者对常见问题的解答。

  • LICENSE:开源许可证,Element UI使用的是MIT协议

  • Makefile:Makefile 是一个适用于 C/C++ 的工具,在拥有 make 环境的目录下, 如果存在一个 Makefile 文件。 那么输入 make 命令将会执行 Makefile 文件中的某个目标命令。

package.json

针对几个关键字端分析

  • main:项目的入口文件

    import Element from 'element-ui' 时候引入的就是main中的文件

    "main": "lib/element-ui.common.js"   // 是commonjs规范
    
  • files:指定npm publish发包时需要包含的文件/目录

"files": [
    "lib",
    "src",  // 存放入口文件和一些工具辅助函数
    "packages",  // 存放组件源码
    "types"  // 类型声明文件
]
  • typings:TypeScript入口文件

    "typings": "types/index.d.ts",
    
  • home:项目的线上地址

  • style:声明样式入口文件

 "style": "lib/theme-chalk/index.css",
  • scripts

    • build:theme - 处理样式相关
    "build:theme": "node build/bin/gen-cssfile && gulp build --gulpfile packages/theme-chalk/gulpfile.js && cp-cli packages/theme-chalk/lib lib/theme-chalk"
    

    1)build/bin/gen-cssfile

    这一步是根据components.json,生成package/theme-chalk/index.scss文件,把所有组件的样式都导入到index.scss

    其实是做了一个自动化导入操作,后面每次新增组件,就不用手动去引入新增组件的样式了。

​ 2)gulp build --gulpfile packages/theme-chalk/gulpfile.js

​ 我们都知道ElementUI在使用时有两种引入方式:全局引入和按需引入。针对两种引入方式,打包时对应的也有两种方案,具体如 下:

​ 将packages/theme-chalk下的所有scss文件编译为css,当你需要全局引入时,就去引入index.scss文件;当你按需引入 时,引入对应的组件scss文件即可。针对如何将packages/theme-chalk下的所有scss文件编译为css,如果采用gulp基于工作 流去处理更方便。gulp相关的处理就在packages/theme-chalk/gulpfile.js中,经过处理,最终就会打包出对应的样式文件。

  • 一些依赖

async-validator:表单异步校验库

eepmerge:一个用于深度(递归)合并Javascript对象的库

发包

elementui采用package.json下的files字段指定npm publish发包时需要包含的文件/目录
在这里插入图片描述

主题构建–构建工具(gulp+Webpack)

05.Element UI 项目工程化剖析之主题构建、自动化测试、代码质量检查、类型声明

"build:theme": "node build/bin/gen-cssfile && gulp build --gulpfile packages/theme-chalk/gulpfile.js && cp-cli packages/theme-chalk/lib lib/theme-chalk"

1)生成入口文件

build/bin/gen-cssfile 找到 components.json, 获取组件列表,找到packages/theme-chalk/src目录下对应的各组件的 component-name.scss 文件,以@import "./component-name.scss"的形式,写入packages/theme-chalk/index.scss文件-样式总入口文件。若是组件对应的样式不存在,会自动创建遗漏的样式文件。

2)构建主题

gulp是一种基于流(stream)的自动化构建工具,gulpfile.js 定义两个任务(task):

  • packages/theme-chalk/src目录下的 scss 文件转换成 css 文件,输出至packages/theme-chalk/src/lib目录下;
  • packages/theme-chalk/src/fonts目录下的字体图标文件压缩处理,输出至 packages/theme-chalk/src/lib/fonts 目录下。

3)拷贝至lib/theme-chalk下

通过cp-cli,将packages/theme-chalk/src/lib目录下文件拷贝至lib/theme-chalk目录下。

代码规范

05.Element UI 项目工程化剖析之主题构建、自动化测试、代码质量检查、类型声明

element 使用了 eslint 进行代码风格检测,辅助编码规范执行,有效控制代码质量,实现项目代码风格统一。 编写发布了 eslint 的扩展规则配置-- eslint-config-elemefe 。

eslint 所能提供的格式化功能很有限;而 prettier 在格式化代码方面具有更大优势。可以集成 prettier 负责格式限制、自动格式化,详细配置参考代码风格检查和格式化配置(ESlint & Prettier)。

eslint:

项目根目录下创建了.eslintignore 文件 。
在这里插入图片描述

项目运行后,若文件格式不符合规范,编辑器窗口有提示出现

在这里插入图片描述

光标移到问题行,会显示问题类型,可以点击快速修复选项来修复问题。
在这里插入图片描述

单元测试

05.Element UI 项目工程化剖析之主题构建、自动化测试、代码质量检查、类型声明

项目通过执行 npm run test npm run test:watch 运行单元测试,使用如下技术:

  • karma 测试执行过程管理工具(Test Runner)。
  • Mocha 是运行在 Node.js 和浏览器上的功能丰富的 JavaScript 测试框架。
  • Chai 是一个用于 Node.js 和浏览器的 BDD/TDD 断言库,可以与任何 JavaScript 测试框架便捷配对。
  • Sinon.JS 用于对 JavaScript 隔离测试 spy, stub 和 mock。适用于任何单元测试框架。

类型声明

types 目录存放组件的 TypeScript 声明文件,以 .d.ts 后缀结尾。提升typescript 项目中引入组件库的开发体验,需要在 package.json 中指定 typing 属性的值, 声明的入口文件才能生效。

{
    "typings": "types/index.d.ts",
}

样式自定义 - scss

view-ui-plus

目录结构解析

在这里插入图片描述

package.json分析

采用vue3,支持ts和js,vite和gulp构建工具构建,

uglifyjs-webpack-plugin:使用uglify-js进行js文件的压缩。

uglifyjs-webpack-plugin 中文文档_lianxun0107的博客-CSDN博客_uglifyjsplugin

urlloader将引入的文件进行编码,生成dataURL,base64形式,在将字符串打包到js。

  • 一些依赖

async-validator:表单异步校验库

eepmerge:一个用于深度(递归)合并Javascript对象的库

popper.js:是一款功能强大的JS定位引擎。最近在写tooltip弹窗时,需要用到提示框定位的问题,element和iview都在用

代码规范 - eslint.js

使用eslint,tslint进行代码规范检查。

Lint-staged,仅过滤出Git代码暂存区文件(被committed的文件),所以速度很快。

module.exports = {
    root: true,   //指定配置文件根目录:表明当前文件为eslint的根配置文件,逐层查找时无需往更上一级的文件目录中进行搜索
    env: { //此项指定环境的全局变量。每种环境都有一组特定的预定义全局变量。比如node环境下有global全局变量,browser环境下有window全局变量,jquery环境下有$全局变量,es6环境下有Set等新特性全局变量。这些环境并不是互斥的,所以你可以同时定义多个。
        node: true  // 当在node环境下使用window变量eslint会报错
    },
    globals: {  //配置全局变量
        $: true,
        'BMap': true
    },
    extends: ['plugin:vue/vue3-essential'],  //用来配置标准的js风格
    parserOptions: {   //此项是用来指定javaScript语言类型和风格
        parser: 'babel-eslint',
        ecmaVersion: 6,
        sourceType: 'module' //指定js的导入方式,module是指通过模块导入,默认值为script(表示通过script标签引入)
    },
    // 下面这些rules是用来设置从插件来的规范代码的规则,使用必须去掉前缀eslint-plugin-
    // 主要有如下的设置规则,可以设置字符串也可以设置数字,两者效果一致
    // "off" -> 0 关闭规则
    // "warn" -> 1 开启警告规则
    //"error" -> 2 开启错误规则
    rules: {
        'vue/script-setup-uses-vars': 'off'
    }
};

发包

iview采用package.json下的files字段指定npm publish发包时需要包含的文件/目录

在这里插入图片描述

同时新建了.npmignore 配置文件,表明以下文件不会被发布
在这里插入图片描述

构建工具(gulp+webpack)

单元测试

Karma+mocha+webpack自动化单元测试

Mocha测试框架,提供单侧API

chai断言库

sinon具有独立的spies, stub, mock功能,测试任何js函数,包括Ajax请求等。

文档案例

安装 - View Design (iviewui.com)

维护

bugs属性,维护是通过建立issues,提交维护代码pr

发包

在这里插入图片描述
在这里插入图片描述

代码结构组织

样式自定义 - less

antd

特性和优势

  • 🌈 提炼自企业级中后台产品的交互语言和视觉风格。
  • 📦 开箱即用的高质量 React 组件。
  • 🛡 使用 TypeScript 开发,提供完整的类型定义文件。
  • ⚙️ 全链路开发和设计工具体系。
  • 🌍 数十个国际化语言支持。
  • 🎨 深入每个细节的主题定制能力。

文档管理

  • bisheng

    • antd 自带的文档工具,几乎只有 antd 自己在使用。年头较久,维护不积极

构建

按需加载

antd 的 JS 代码默认支持基于ESmodule的tree shaking。

单元测试–jest

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis第二章_实战篇_短信登录+缓存策略+秒杀+分布式锁>>

Redis第二章_实战篇_短信登录缓存策略秒杀分布式锁>> 文章目录Redis第二章_实战篇_短信登录缓存策略秒杀分布式锁>>开篇导读1、短信登录1.1、导入黑马点评项目1.1.1 、导入SQL1.1.2、有关当前模型1.1.3、导入后端项目1.1.4、导入前端工程1.1.5 运行前端项目1.2 、基…

Spring(十一)- Spring Bean的依赖注入注解

文章目录一、Spring Bean的依赖注入注解1. 通过Value直接注入普通属性2. 通过Value注入properties文件中的属性3. Autowired注解&#xff0c;用于根据类型进行注入4. Qualifier配合Autowired可以完成根据名称注入Bean实例&#xff0c;使用Qualifier指定名称5. Resource注解既可…

三款Zookeeper可视化工具、ZooInspector、prettyZoo、ZooKeeperAssistant

三款Zookeeper可视化工具、ZooInspector、prettyZoo、ZooKeeperAssistant①Zookeeper图形化工具&#xff1a;ZooInspector1.下载完后&#xff0c;解压压缩包&#xff0c;进入zookeeper-dev-ZooInspector.jar目录后执行run jar包命令2.登录客户端&#xff1a;输入zk服务的ip和端…

XCTF1-web disabled_button weak_auth view_source cookie backup

一个不能按的按钮 题目描述 X老师今天上课讲了前端知识&#xff0c;然后给了大家一个不能按的按钮&#xff0c;小宁惊奇地发现这个按钮按不下去&#xff0c;到底怎么才能按下去呢&#xff1f; 进入场景 题目提示为前端设置的问题&#xff0c;查看网页源码&#xff0c;定位…

Django + Nginx https部署实战(第二辑)

如何使用Nginx把网站升级为Https&#xff1f; Https是Http协议的升级版&#xff0c;由于证书的引入&#xff0c;使得用户与网站之间的通讯变得更加安全。 在使用https之前&#xff0c;我们必须了解的事情 证书颁发机构 证书颁发机构是一家知名且受信任的组织&#xff0c;它对网…

基于MMDetection训练VOC格式数据集

一 环境说明 基于前述安装MMDetection&#xff0c;数据集为VOC格式&#xff0c;主要版本如下&#xff1a; Python&#xff1a;3.7.8 CUDA&#xff1a;11.3 cuDNN&#xff1a;8.4.0 torch&#xff1a;1.12.0 torchvision&#xff1a;0.13.0 mmcv-full&#xff1a;1.6.0 MMDetec…

机器学习极简入门笔记-5-无监督学习-K-means

目录 第17章 KNN算法&#xff08;有监督学习算法&#xff0c;放在此位置是为了与下一章的K-means做对比&#xff09; 17.1 KNN算法原理 17.2 KNN中的K 第18章 K-means——最简单的聚类算法 18.1 K-means算法步骤 18.2 K-means算法具体细节 18.3 启发式算法 18.4 K-mean…

介绍a股level2数据接口委托队列的作用

a股level2数据接口可以实现量化交易的准确性&#xff0c;那用户在交易的过程中会发现在“委托队列”中&#xff0c;如果出现一些有规律性的单子&#xff0c;往往是主力之间的盘口暗语。 例如排在靠前的都是大单&#xff0c;封单相当坚决&#xff0c;如果细心一点还会发现都是拖…

Spring Security 自定义拦截器Filter实现登录认证

前言 需求来源: 微信小程序获取授权码code, 通过授权码code, 获取微信用户信息(比如openid,unionId), 并记录登录状态(比如token信息的获取); 原本打算使用Spring Security中OAuth2.0的机制 实现用小程序登录&#xff0c;发现小程序再已经获取授权码code登录流程和Spring Secu…

Intellij插件之~图形界面Swing UI Designer

资料 Java Swing 介绍 JavaFX快速入门 Java Swing 图形界面开发简介 GUI Designer Basics scrcpy ScrcpyController Services&#xfeff; 创建一个Gui Form文件(类form文件) 创建一个Gui Form 此时生成两个类, 是自动关联的 鼠标可以拖入控件,每拖入一个组件,在TestForm…

领悟《信号与系统》之 信号与系统的描述-下节

信号与系统的描述-下节一、信号的基本运算1. 信号的基本运算1. 加法 、减法2. 乘法、除法3. 微分 、差分4.积分、迭分2. 关于时间&#xff08;自变量&#xff09;的运算1. 位移2. 反折3. 尺度变换二、阶跃信号与冲激信号1. 单位阶跃信号2. 单位阶跃信号的特性3. 单位冲激信号4.…

Android架构师学习必备学习宝典《Android架构开发手册》

吐槽 我想每个程序员在写代码的时候可能都有这些历程(夸张)&#xff1a; 这坨代码谁写的&#xff0c;怎么要这样写啊&#xff0c;我这个需求该怎么加代码&#xff01;(尝试在shit山上小心地走&#xff0c;并添加新代码)写的好难受&#xff0c;shit越改越chou了…算了&#xf…

协程设计原理

文章目录1、协程的背景1.1、同步与异步1.2、为什么使用协程1.3、协程的适用场景2、协程的原语操作3、协程的切换3.1、汇编实现4、协程的定义4.1、多状态集合设计4.2、调度器的定义4.2、调度策略生产者消费者模式多状态运行5、api 封装5.1、hook 机制5.2、hook 函数原型5.3、hoo…

React笔记——github案例(用到axios 和 pubsub)

案例github用上脚手架配置代理 1.完成静态页面构建 小技巧&#xff1a;先在原html页面搜索最外侧框 是否有样式存在&#xff0c;如果样式不存在则不需要剪切过去 给需求或效果分好组件&#xff0c;分别是 Search 和 List 、App 组件 class都改为 className 给图片添加上特定…

JS高级(二):继承、数组的一些api、Object.defineProperty()、call、apply、bind

JavaScript高级&#xff08;二&#xff09;一、继承1.call方法改变this指向2.构造函数中模拟类的super实现属性继承3.构造函数借助原型对象实现方法继承4.类的本质二、ES5几个新增方法1.数组forEach()2.数组filter()3.数组some()4.字符串trim()三、Object.definProperty()四、改…

基于STM32结合CubeMX学习Free-RT-OS的源码之深入学习软件定时器实现过程

概述 关于在CUBEMX上的配置 介绍 软件定时器基于硬件定时器实现。 软件定时器允许设置一段时间&#xff0c;当设置的时间到达之后就执行指定的功能函数&#xff0c;被定时器 调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期&#xff0c;…

什么是需求分析,如何进行需求分析?

目录 前言 需求分析在分析什么 如何看待产品原型设计 技术同学培养产品意识 如何应对需求变更问题 总结 重点&#xff1a;配套学习资料和视频教学 前言 这篇文章&#xff0c;我会将软件工程中关于需求分析相关的知识进行总结梳理&#xff0c;并以自己理解的方式进行阐述…

iNFTnews|风口之上,耐克推出的web3平台.SWOOSH能否引领市场?

本周一&#xff0c;著名的体育运动品牌耐克宣布&#xff0c;公司将进一步进军Web3&#xff0c;并将发布一个旨在通过旗下的数字可穿戴设备吸引用户的新平台——.SWOOSH。 耐克表示&#xff0c;.SWOOSH将成为Web3教育的资源库&#xff0c;以及购买和交易虚拟运动鞋或运动衫等数…

Oracle SQL执行计划操作(3)——物化视图相关操作

3. 物化视图相关操作 该类操作与SQL语句执行计划中访问物化视图数据的路径和方式相关,主要包括物化视图访问类相关操作。根据不同的具体SQL语句及其他相关因素,如下各操作可能会出现于相关SQL语句的执行计划。 1)MAT_VIEW ACCESS FULL 对物化视图(Materialized View)直…

培训学校的教务管理系统存在的问题有哪些?

教务管理在培训学校管理里面占据不可或缺的地位。随着计算机、网络、大数据、人工智能等技术的发展&#xff0c;国家对智慧校园的重视&#xff0c;促进了培训学校教务管理信息化与智慧化建设。然而&#xff0c;随着科技进步速度不断加快&#xff0c;教育改革步伐的不断加大&…