使用web-component搭建企业级组件库
组件库的现状
前端目前比较主流的框架有react,vuejs,angular等。
我们通常去搭建组件库的时候都是基于某一种框架去搭建,
比如ant-design是基于react搭建的UI组件库,而elementUI则是基于vuejs搭建的组件库。
虽然目前社区有相关工具,提供框架之间的转化服务,比如讲vuejs组件转化为react组件。
但是毕竟是不同的框架,有不同的标准。因此框架api发生变动,那么你就需要重写转化逻辑,
显然是不灵活的,因此我们暂不讨论这种情况。
作为公司而言,就需要为不同的框架写不同的组件库,尽管逻辑都是一样的。
另外如果框架升级,比如从1.x升级到2.x,那么对应组件库就需要升级,如果公司的组件库有很多(vuejs,react,angular等),
那么这种升级的概率就会更大。
什么是web-component?
那么有没有更好的方案,一次编写,到处使用呢?
答案就是借助web component。
Web Components 是一系列加入w3c的HTML和DOM的特性,使得开发者可以创建可复用的组件。
由于web components是由w3c组织去推动的,因此它很有可能在不久的将来成为浏览器的一个标配。
Web Components 主要由以下四个部分组成:
- Custom Elements – 定义新html元素的api
- Shadow DOM – Encapsulated DOM and styling, with composition
- HTML Imports – Declarative methods of importing HTML documents into other documents
- HTML Templates – The
<template>element, which allows documents to contain inert chunks of DOM
web-component有什么优点
使用web components搭建组件库能够带来什么好处呢?
前面说了,web components 是w3c推动的一系列的规范,它是一个标准。
如果我们使用web components的api 开发一个组件,这个组件是脱离框架存在的,也就是说
你可以在任何框架中使用它,当然也可以直接在原生js中使用。
我们无须为不同的框架编写不同的组件库。
使用web components编写的组件库的基本使用方法大概是这样的:
<script src="/build/duiba.js"></script>
<!-- 运营位组件 -->
<operation-list></operation-list>
毫不夸张地说, web components 就是未来。
但是web components的api还是相对复杂的,因此用原生的api开发web components还是
相对比较复杂的,就好像你直接用原生canvas api去开发游戏一样。
下面我们介绍下用于简化web components开发的库。
polymer
polymer是我接触的第一个web componment开发库,那已经是很多年前的往事了。
Build modern apps using web components
更多介绍polymer
stencil
stencil是在polymer之后出现的一个库。
第一次接触时在Polymer Summit 2017的分享上,这里贴下地址Using Web Components in Ionic - Polymer Summit 2017。
Stencil is a tool developers use to create Web Components with some powerful features baked in, but it gets out of the way at runtime.
那么powerful features具体指的是什么?
Virtual DOM
Async rendering (inspired by React Fiber)
Reactive data-binding
TypeScript
JSX
它也是一个用于生成web compoennt的tool。 不同的是她提供了更多的特性(Reactive data-binding,TypeScript,JSX, virtual dom)以及更强的性能(virtual dom, Async rendering).
细心的人可能已经发现了,我将Virtual DOM既归为特性,又归为性能,没错! Virtual DOM提供了一种到真实dom的映射,使得开发者不必关心真实dom,从这个层面讲它是特性。
从虚拟dom之间的diff,并将diff info patch到real dom(调和)的过程来看,它是性能。
用stencil开发web components体验大概是这样的:
import { Component, Prop, State } from '@stencil/core';
@Component({
tag: 'my-component',
styleUrl: 'my-component.scss'
})
export class MyComponent {
// Indicate that name should be a property on our new component
@Prop() first: string;
@Prop() last: string;
@State() isVisible: boolean = true;
render() {
return (
<p>
Hello, my name is {this.first} {this.last}
</p>
);
}
}
Demo
这是我基于stenciljs + storybook写的一个小例子。大家可以clone,并运行查看效果。
通过这样搭建的企业级组件库,就可以轻松地为不同业务线提供基础组件库,而不必担心使用者(各个业务方)的技术栈。
将来业务方的框架升级(比如vue1升级到vue2),我们的组件库照样可以使用。
可以想象,如果es标准发展地够好,web components 等规范也足够普及,无框架时代将会到来。
无框架,不代表不使用库。
只需要借助工具库就可以开发足够通用的组件,也不需要babel这样的转换器,更不需要各种polyfill。
那么开发者大概会非常幸福吧,可惜这样的日子不可能存在,但是离这个目标足够近也是极好的。
来源:https://segmentfault.com/a/1190000015766801
使用web-component搭建企业级组件库的更多相关文章
- 从0搭建vue3组件库:自动化发布、管理版本号、生成 changelog、tag
今天看到一篇文章中提到了一个好用的工具release-it.刚好可以用在我正在开发的vue3组件库.纸上得来终觉浅,绝知此事要躬行,说干就干,下面就介绍如何将release-it应用到实际项目中,让组 ...
- 从0搭建vue3组件库:Shake抖动组件
先看下效果 其实就是个抖动效果组件,实现起来也非常简单.之所以做这样一个组件是为了后面写Form表单的时候会用到它做一个规则校验,比如下面一个简单的登录页面,当点击登录会提示用户哪个信息没输入,当然这 ...
- 从零开始搭建Vue组件库——VV-UI
前言: 前端组件化是当今热议的话题之一,也是我们在开发单页应用经常会碰到的一个问题,现在我们有了功能非常完善的Element-UI.各个大厂也相继宣布开源XXX-UI.但是也会存在一些问题,比如每个公 ...
- 从零开始搭建Vue组件库 VV-UI
前言: 前端组件化是当今热议的话题之一,也是我们在开发单页应用经常会碰到的一个问题,现在我们有了功能非常完善的Element-UI.各个大厂也相继宣布开源XXX-UI.但是也会存在一些问题,比如每个公 ...
- 从0搭建vue3组件库: 如何完整搭建一个前端脚手架?
相信大家在前端开发中都使用过很多前端脚手架,如vue-cli,create-vite,create-vue等:本篇文章将会为大家详细介绍这些前端脚手架是如何实现的,并且从零实现一个create-kit ...
- 从0搭建Vue3组件库:button组件
button组件几乎是每个组件库都有的:其实实现一个button组件是很简单的.本篇文章将带你一步一步的实现一个button组件.如果你想了解完整的组件库搭建,你可以先看使用Vite和TypeScri ...
- 从0搭建vue3组件库: Input组件
本篇文章将为我们的组件库添加一个新成员:Input组件.其中Input组件要实现的功能有: 基础用法 禁用状态 尺寸大小 输入长度 可清空 密码框 带Icon的输入框 文本域 自适应文本高度的文本域 ...
- vuepress搭建UI组件库文档踩坑篇
为了实现组件效果预览及代码展示可折叠功能,使用了插件vuepress-plugin-demo-container 相关配置可参考官网说明文档 第一步 安装插件 npm i - D vuepress-p ...
- Vitepress搭建组件库文档(下)—— 组件 Demo
上文 <Vitepress搭建组件库文档(上)-- 基本配置>已经讨论了 vitepress 搭建组件库文档的基本配置,包括站点 Logo.名称.首页 home 布局.顶部导航.左侧导航等 ...
随机推荐
- shell下时间日期的加减乘除运算
首先我们先来说说什么是shell下的时间戳: 自1970年1月1日(00:00:00 UTC/GMT)以来的秒数.它也被称为Unix时间戳(Unix Timestam.Unix epoch.POSIX ...
- Luogu P3007 [USACO11JAN]大陆议会The Continental Cowngress
P3007 [USACO11JAN]大陆议会The Continental Cowngress 题意 题意翻译 简述:给出\(n\)个法案,\(m\)头牛的意见,每头牛有两个表决格式为"支持 ...
- Leetcode300. Longest Increasing Subsequence最长上升子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4. 说 ...
- 前缀数组O(n^3)做法
前缀数组O(n^3)做法 s.substr()的应用非常方便 令string s = "; ); //只有一个数字5表示从下标为5开始一直到结尾:sub1 = "56789&quo ...
- poj 1958
传送门 四塔汉诺塔问题,转移方程非常玄学,f[i]=min(f[j]*2+d[i-j]) (1 <=j < i),d表示三塔下的汉诺塔问题,这个方程的意思是将j个在四塔模式下有A挪到B,然 ...
- SPSS分析技术:CMH检验(分层卡方检验);辛普森悖论,数据分析的谬误
SPSS分析技术:CMH检验(分层卡方检验):辛普森悖论,数据分析的谬误 只涉及两个分类变量的卡方检验有些时候是很局限的,因为混杂因素总是存在,如果不考虑混杂因素,得出的分析结论很可能是谬误的,这就是 ...
- Ubuntu为什么远程连接不上
因为没有安装ssh,输入以下命令, sudo apt-get install openssh-server openssh-client执行完再用xshell就可以连接上了
- css背景属性整理
背景颜色 {background-color:red}/*常用十六进制颜色#fff*/ 图片 {background-image:url();} /*插入图片路径*/ 重复 {background-r ...
- mysql不创建表 <property name="hbm2ddl.auto">update</property> 无效
netbeans win10 mysql8 hibernate 4.3.11 dakai mysql的general_log发现并没有创建表的语句 未完待续 今天又遇到不创建表的问题 但是问题比较奇怪 ...
- 关于UML类图的一点理解(转)
首先我们定义一个非常简单的Person类,代码如下: public class Person { private String name; private int age =1; public Str ...