百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

前端新趋势?有了Web Component,还用纠结Vue或React?

zhezhongyun 2025-01-20 18:10 42 浏览

前端新趋势?有了Web Component,还用纠结Vue或React?

什么是Web Component

Web Component 的概念最早在 2011 年被 Google 提出,并在 2018 年 V1 版本开始被主流浏览器所支持(除了 IE)。Web Component 规范正式成为 W3C 的推荐标准。与Vue和React类似,都是基于组件化思想用于构建用户界面的一种框架,不同的是Web Component是使用封装的自定义HTML元素来创建可复用的组件,与此同时,它能够完美解决Html、css、js的复用问题,做到沙箱隔离,在任何地方使用都不会受到代码冲突影响。类似于我们熟知的html的video、audio标签。

基础认知

web component 主要由三项主要技术组成

  • Custom element(自定义元素):一组 JavaScript API,允许你定义 custom elements 及其行为,然后可以在你的用户界面中按照需要使用它们。 以下是一个简单的hello word例子:


<body>
    <hello-word />
    <script>
        class HelloWord extends HTMLElement {
            constructor() {
                super();
                this.append("hello world");
            }
        }
        window.customElements.define("hello-word", HelloWord); 
    </script>
</body>

通过上述在页面上能显示hello word,实现了一个简单的自定义元素。

  • Shadow DOM(影子 DOM):一组 JavaScript API,用于将封装的“影子”DOM 树附加到元素(与主文档 DOM 分开呈现)并控制其关联的功能。通过这种方式,你可以保持元素的功能私有,这样它们就可以被脚本化和样式化,而不用担心与文档的其他部分发生冲突。 如下所示,外部的样式即使设置了 !important 也无法影响到内部样式:


<body>
    <test-item-shadow></test-item-shadow>
    <div class="container">Test item</div>
    <style>
        .container {
            color: red !important;
        }
    </style>
    <template id="tpl">
        <style>
            .container {
                color: blue;
            }
        </style>
        <div class="container">Test Item</div>
    </template>
    <script>
        class TestItemShadow extends HTMLElement {
            constructor() {
                super();
            }
            connectedCallback() {
                const content = document.getElementById("tpl").content.cloneNode(true);
                const shadow = this.attachShadow({ mode: "open" });
                shadow.append(content);
            }
        }
        window.customElements.define("test-item-shadow", TestItemShadow); </script>
</body>

通过浏览器开发者工具,可以查看html的结构,生成了一个#shadow-root(open)标签,内部包含了我们自定义的组件,不会受到外部影响。

  • HTML template(HTML 模板): <template> 和 <slot> 元素使你可以编写不在呈现页面中显示的标记模板。然后它们可以作为自定义元素结构的基础被多次重用。

熟悉vue的小伙伴对于template和slot应该不陌生,以下是一个简单的例子:

template:

<body>
    <template id="test-template">
        <p>test-template</p>
    </template>
    <script>
        let template = document.getElementById("test-template");
        let templateContent = template.content;
        document.body.appendChild(templateContent);
    </script>
</body>

slot:

<body>
    <template id="tpl-test">
        <style>
            .title {
                color: green;
            }
        </style>
        <div class="title">标题</div>
        <slot name="slot-des">默认内容</slot>
    </template>
    <test-item>
        <div slot="slot-des">不是默认内容</div>
    </test-item>
    <script>
        class TestItem extends HTMLElement {
            constructor() {
                super();
            }
            connectedCallback() {
                const content = document.getElementById("tpl-test").content.cloneNode(true);
                const shadow = this.attachShadow({ mode: "open" });
                shadow.append(content);
            }
        }
        window.customElements.define("test-item", TestItem); </script>
</body>

常用接口解析

CustomElementRegistry

CustomElementRegistry接口提供注册自定义元素和查询已注册元素的方法

define()

通过define方法可以创建一个自定义元素

  • name 自定义元素名
  • constructor 自定义元素构造器,class TestItem extends HTMLElement { ...。
  • options 控制元素如何定义。目前有一个选项支持:extends. 指定继承的已创建的元素。被用于创建自定义元素
window.customElements.define(name, constructor, options);

get()

get() 方法指定名字的自定义元素的构造函数,如果没有使用该名称的自定义元素定义,则为undefined

constructor = window.customElements.get(name);

upgrade()

upgrade() 方法将更新节点子树中所有包含阴影的自定义元素,甚至在它们连接到主文档之前也是如此。

const el = document.createElement("spider-man");
class SpiderMan extends HTMLElement {}
customElements.define("spider-man", SpiderMan);
console.assert(!(el instanceof SpiderMan)); // not yet upgraded
customElements.upgrade(el);
console.assert(el instanceof SpiderMan); // upgraded!

whenDefined()

来检测生成菜单的自定义元素何时被定义。这个菜单显示占位符内容一直到菜单内容已经准备好显示

attachShadow()

Element.attachShadow() 方法给指定的元素挂载一个 Shadow DOM,例:

const shadow = element.attachShadow({ mode: "open" });

mode参数: open: shadow root 元素通过 js 从外部访问根节点 closed:拒绝 js 从外部访问关闭的 shadow root 节点

append()

append()方法在 Element的最后一个子节点之后插入一组 Node 对象或 DOMString 对象。

shadow.append(content);  //content为dom对象

上述简单列举了几个常用的接口方法,更多使用可直接查看MDN:developer.mozilla.org/zh-CN/docs/…

最后

第一次接触web component是在使用ArcGis Js API时,发现官方使用了大量的web component,个人学习测试下来,发现与现在主流的Vue和React框架相比还是有一定的差距,少了一些生命周期方法的概念、状态管理、虚拟dom优化机制等,但在不使用框架的前提下,对于纯原生开发,这也是一个比较实用的工具,殊途同归,也许未来某一天它就成为了前端开发的新热门。


作者:叶落风尘
链接:https://juejin.cn/post/7305977418699817011

相关推荐

用豆包生成的BMI计算器(豆包的热量是多少?)

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8&#...

Android 开发中文引导-应用小部件

应用小部件是可以嵌入其它应用(例如主屏幕)并收到定期更新的微型应用视图。这些视图在用户界面中被叫做小部件,并可以用应用小部件提供者发布。可以容纳其他应用部件的应用组件叫做应用部件的宿主(1)。下面的截...

Qt推流(视频文件/视频流/摄像头/桌面转流媒体rtmp+hls+webrtc)

一、前言说明推流直播就是把采集阶段封包好的内容传输到服务器的过程。其实就是将现场的视频信号从手机端,电脑端,摄影机端打包传到服务器的过程。“推流”对网络要求比较高,如果网络不稳定,直播效果就会很差,观...

一看就会!谷歌广告转化跟踪详细设置指南来了

在出海推广业务中,投放广告最常见的目的是获取订单,但我们怎么知道有没有达成投放目的呢?谷歌转化跟踪技术就可以做到!熟悉谷歌的卖家朋友都知道,转化跟踪在最近几年变得越来越复杂了,虽然有很多选项可以自定义...

Android原生编解码接口MediaCodec详解

作者:躬行之MediaCodec是Android中的编解码器组件,用来访问底层提供的编解码器,通常与MediaExtractor、MediaSync、MediaMuxer、MediaCrypt...

手把手搭建RTSP流媒体服务器(rtsp 流媒体)

0.引言本文主要讲解如何搭建RTSP流媒体服务器的过程,使用开源项目ZLMediaKit。通过这个开源项目,推RTSP流到服务器,然后拉流端可以拉取RTSP、RTMP等流。ZLMediaKit码云链接...

MediaInfo 24.04.0 是一个关于多媒体文件的信息提供工具

MediaInfo24.04.0是一个关于多媒体文件的信息提供工具(仅当文件中包含信息时才提供):包括常规信息(标题、作者、导演、专辑、曲目编号、日期、时长等);视频信息(编解码器、画面比例、帧率...

rmvb格式视频怎么打开,rmvb转MP4认准这个方法

 一、rmvb是什么格式?  RMVB是一种视频文件格式,其中的VB指的是可变比特率。比起上一代的RM格式,RMVB  格式的画面比较清晰,因为它是降低了静态画面下的比特率。  二、制作rmvb  ①...

教你用Plex Media Server,把铁威马变成你的“私人好莱坞”!

TNAS(铁威马NAS)中可以安装多媒体服务器、影视、PlexMediaServer、EmbyServer作为个人媒体服务器使用。PlexMediaServer可以组织整理TNAS上的媒体...

你肯定用过!经典Windows软件被抛弃

Windows系统这些年持续更新的过程中,不断融入新的软件和功能的同时,一些经典的应用也渐渐成为了历史……Windows媒体播放器被抛弃Windows系统不断地推陈出新,一些老旧的组件也难免被抛弃,在...

博思得Q8标签打印全能手(博思得标签打印机安装教程)

2014-12-0905:35:00作者:宋达希【中关村在线办公打印频道原创】服装吊牌、洗涤标签、产品说明标签等都要用到标签打印机,这些标签涵盖多种尺寸的长度和宽度以及材质。另外作为一件商品或者产...

flv文件用什么播放器打开,这样做不踩雷!

FLV是FLASHVIDEO的简称,是随着FlashMX的推出发展而来的视频格式。它的出现有效地解决了视频文件导入Flash后,使导出的SWF文件体积庞大,不能在网络上很好的使用等问题。一、...

media player怎么转换格式?音频转换神器推荐!

Windowsmediaplayer怎么转换格式?WindowsMediaPlayer是微软公司出品的一款多媒体播放器,通常简称“WMP”。提供了编辑音频和视频文件的功能。用户可以使用该软件导...

视频参数检查工具更新:MediaInfo 23.10

MediaInfo提供有关视频或音频文件的技术和标签信息。信息示例包括编解码器、比特率、每秒帧数、宽度、高度、频道数、持续时间、标题、作者、字幕语言和章节名称。多种方式可以查看信息(文本、工作表、树和...

多媒体管理软件:JRiver Media Center 31.0.68 (64位)

JRiverMediaCenter64位是适用于大量库的完整媒体解决方案。它组织、播放和标记所有类型的媒体文件,并对Xbox、PS3、UPnP、DLNA和TiVo进行翻录、刻录。JRiverM...