写在前面

最近致力于研究 Web components(以下简称WC),并且也初有成效的拿到了一定的结果,但今天想回过头来重新审视一下 WC。

WC 到底是什么?

简单的讲,Web Component 就是把组件封装成 html 标签的形式,并且在使用时不需要写额外的 js 代码。

组件是前端的发展方向,抛开周边技术生态,单纯看 React 和 Vue 都是组件框架。因此,WC 可以视为原生标签的拓展/延伸,说到底,它依旧是一个标签!

类似 <video></video> 标签,相比于原生标签,它多了更为丰富的样式和可操作属性。

谷歌公司由于掌握了 Chrome 浏览器,一直在推动浏览器的原生组件,即 Web Components API。

相比第三方框架,原生组件简单直接,符合直觉,不用加载任何外部模块,代码量小。貌似一切完美,似乎大有可以用来替换React、Vue之类的趋势。

目前存在的缺陷

与其它 web 框架一起使用存在一些小问题,会给开发体验上造成一些困扰。

1、组件内部事件的回调

比如,一个弹窗组件(<my-dialog></my-dialog>)中的确定按钮,那么它的事件是如何触发的呢?

class myDialog extends HTMLElement {// ...connectedCallback() {const shadowRoot = this.attachShadow({ mode: 'open' });shadowRoot.innerHTML = `<div class="dialog"><div class="dialog-content"><div class="dialog-body">弹窗内容</div><button id="okBtn">确定</button></div></div>`;shadowRoot.querySelector('#okBtn').addEventListener('click', () => {// 组件内部定义事件this.dispatchEvent(new CustomEvent('okBtnFn'));});}
}customElements.define('my-dialog', myDialog);

现在方案是 custom element 内部自定义事件 new CustomEvent(),外部用 addEventListener监听。这样的写法是很丑陋的,仿佛又回到了原生 JS 写应用的时代。

<my-dialog></my-dialog><script>export default {created() {document.addEventListener('okBtnFn', function(){// 点击弹窗按钮,触发回调事件});}}
</script>

2、组件样式覆盖

对于开发者来说,难免会遇到需要调整组件内部样式的时候。无论你是使用antdvant还是使用其它组件库,但 WC 的 CSS 防污染机制导致你很难修改内部样式。这需要你付出一些代价来变相的修改内部样式

3、组件内部资源相对路径问题

就目前来说,任何直接基于 Custom Element v1, Template 和 HTML Import 的组件都无法做到完全资源独立 —— 在不知道使用方环境且不给使用方增加额外限制的情况下使用内部封装的任何资源文件。比如如果你有一个自定义 icon 组件:

class MyIcon extends HTMLElement {static get observedAttributes() { return ['name','size','color'] }constructor() {super();const shadowRoot = this.attachShadow({ mode: 'open' });shadowRoot.innerHTML = `<svg class="icon" id="icon" aria-hidden="true" viewBox="0 0 1024 1024"><use id="use"></use></svg>`}attributeChangedCallback (name, oldValue, newValue) {if( name == 'name' && this.shadowRoot){// 如果使用的项目中,根目录没有 icon.svg 文件,那就 ggthis.use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', `./icon.svg#icon-${newValue}`);}}
}customElements.define('my-icon', MyIcon);

如果使用的项目中,根目录没有 icon.svg 文件,那就 gg。如果你在这里使用 cdn 路径,就会出现跨域问题。

4、form表单类组件 value 获取问题

Shadow DOM 中包含有 <input>、<textarea> 或 <select> 等标签的 value 不会在 form 表单中自动关联。

示例代码:

// web component
class InputAge extends HTMLElement {constructor() {super();}// connect componentconnectedCallback() {const shadow = this.attachShadow({ mode: 'closed' });shadow.innerHTML = `<input type="number" placeholder="age" min="18" max="120" />`;}
}// register component
customElements.define( 'input-age', InputAge );

WC 组件被使用后

<form id="myform"><input type="text" name="your-name" placeholder="name" /><input-age name="your-age"></input-age><button>submit</button>
</form><script>const form = document.getElementById('myform');form.addEventListener('submit', e => {e.preventDefault();console.log('Submitted data:');const data = new FormData(form);for (let nv of data.entries()) {console.log(`  ${ nv[0] }: ${ nv[1] }`);}});
</script>

提交的时候无法获取 input-age 的 value。当然会有解决方案,但会很复杂。

5、其它

此外,缺少数据绑定和状态管理也是 WC 存在的缺陷,此处不再赘述。

写在后面

  • WC 指在丰富 HTML 的 DOM 特性,让 HTML 拥有更强大的复用能力
  • WC 可以直接当做原生标签,在任何前端框架和无框架中运行
  • 结合当下的主流技术栈来说,WC 当前主要问题在于复杂的组件中,数据通信和事件传递存在一定使用成本
  • 兼容问题,比如可以覆盖内部样式的 :part 方法

如果你想开发小程序或者了解更多小程序的内容,可以通过专业开发公司,来帮助你实现开发需求:厦门在乎科技-专注厦门小程序开发公司、APP开发、网站开发、H5小游戏开发

浅析Web components的痛点相关推荐

  1. 【译】Web Components简介

    本文翻译自:css-tricks.com/an-introduc- 前端开发正在以惊人的速度发展.曾经的前端开发,技术栈都是很简单的,如今却越来越复杂.这一点从无数的文章.教程和Twitter上就可以 ...

  2. Web Components 简述

    要说最近几年来,前端开发最火的一个趋势或最火的前端开发框架是什么,第一想到的是,组件及推崇组件化开发的React框架.本文将介绍Web Components规范并就组件的几大特性进行讨论. 前言 在开 ...

  3. 在ASP.NET中使用Office Web Components (OWC)创建统计图

    图形和图表是Web上数据表现的很好的形式,在ASP.NET,可以使用Office Web Components (OWC)来创建统计图.Office Web Component (OWC)是包含在Mi ...

  4. 【译】 Web Components 的高级工具

    原文地址:Advanced Tooling for Web Components 原文作者:Caleb Williams 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold ...

  5. Fiori Fundamentals和SAP UI5 Web Components

    这周有位同事邀请我给团队讲一讲SAP技术的演进历史,所以我准备了下面几个主题来介绍. 其中SAP的技术回顾和演进,我的思路就是从前后台两方面分别介绍. 我画了一张非常简单的图: 去年5月我写过一篇文章 ...

  6. Web Components 上手指南

    现在的前端开发基本离不开 React.Vue 这两个框架的支撑,而这两个框架下面又衍生出了许多的自定义组件库: Element(Vue) Ant Design(React) 这些组件库的出现,让我们可 ...

  7. Firefox UI已迁移至Web Components

    这不是一项一蹴而就的工程,Mozilla 开发者表示团队花费了大约两年的时间,采用"增量更新"的方式才逐渐将 Firefox UI 迁移至使用 Web Components 构建. ...

  8. Programming MS Office 2000 Web Components第二章第一节(第二部分)

    排序和过滤 阅读本节时,如果您打开随书光盘Samples\Chap02目录下的SortFilterExample.htm文件.您会发现这个例子很有用.本节展示的代码和描述的特定环境来自这个文件. 电子 ...

  9. [转载]Programming MS Office 2000 Web Components第二章第三节

    第二章第三节 编程模型要点 现在总结一下我们对电子表格组件的介绍,我将讲述(电子表格)控件编程模型的各个要点,以便您了解如何运用这个控件,以及当您需要编写脚本来实现不同的功能时该如何去做.本节不是编程 ...

最新文章

  1. linux wget返回值_Linux中wget用法
  2. oracle正则判断身份证号,Oracle中查询使用正则表达式函数REGEXP
  3. 微信小程序开发者工具升级自动预览功能,福利啊
  4. GMM_example(3)
  5. CentOS7下安装tomcat8
  6. 【thymeleaf】【SpringBoot】在HTML中调用Spring Bean
  7. process credentials(二)
  8. MouseColor | 颜色获取及转换工具
  9. Tensor:Pytorch神经网络界的Numpy
  10. 【SKILLS】About the phonetics
  11. php里边的join,thinkphp中join用法
  12. jq的each方法之退出循环与继续循环
  13. 存储图片到第三方云服务器
  14. 怎么安装winubuntu双系统_U盘安装ubuntu双系统及如何恢复Windows MBR教程
  15. 网络工程师经常会面对服务器性能,下半网络工程师试卷(下午).doc
  16. POI导出Excel设置单元格格式
  17. 基于FPGA的EMAC模块和FIFO模块
  18. 何学林:房价为什么降不下来?房价上涨的刚性是由强大的利益共同体共同作用的结果(原创首发,深度好文)——何学林房地产大策划之十四
  19. Qt XXXr.obj : error LNK2001: 无法解析的外部符号 3 个无法解析的外部命令问题
  20. <Android开发> Android vold - 第二篇 vold 的main()函数简介

热门文章

  1. 成功的 Git 分支模型
  2. 笔记本计算机打开任务管理器,笔记本电脑按哪个键打开任务管理器
  3. GNU/Linux智能Makefile模板(多目录,多文件)
  4. python中英文字频率_python实现统计文本中单词出现的频率详解
  5. 用一个文件,实现迷你 Web 框架(建议收藏)
  6. JS中script标签defer和async属性的区别
  7. LeetCode每日一题-495.提莫攻击
  8. python多个strip_python 中strip方法
  9. 目前使用ORACLE EBS的公司列表
  10. 软件开发中,站立会议的必要性