首页 > web前端 > js教程 > 无框架网络组件简介

无框架网络组件简介

Lisa Kudrow
发布: 2025-02-09 12:06:14
原创
590 人浏览过

An Introduction to Frameworkless Web Components

本教程介绍了如何在不使用 JavaScript 框架的情况下编写标准 Web 组件。您将学习它们是什么以及如何在您自己的 Web 项目中采用它们。需要具备 HTML5、CSS 和 JavaScript 的基本知识。

关键要点

  • Web 组件允许创建具有封装样式和功能的自定义 HTML 元素,从而减少项目不同部分之间的冲突和依赖关系。
  • 与 JavaScript 框架不同,Web 组件轻量级,不需要外部库,并且旨在面向未来,可在各种框架和浏览器中运行。
  • Shadow DOM 提供作用域样式和 DOM 隔离,防止样式泄漏到组件外部,并保持组件内部和全局样式之间的清晰分离。
  • Web 组件可以使用 HTML 模板和插槽进行增强,提供内容投影和可重用性的灵活性,而无需为不同的组件实例更改 JavaScript 代码。
  • 声明式 Shadow DOM 是一项新兴功能,它允许从服务器端模板构建 Shadow DOM,通过减少布局偏移和未设置样式内容的闪烁来提高性能。
  • 尽管 Web 组件具有诸多优势,但它们也存在学习曲线,并且缺乏综合框架提供的某些内置功能,例如数据绑定和状态管理工具。

什么是 Web 组件?

理想情况下,您的开发项目应该使用简单、独立的模块。每个模块都应该具有明确的单一职责。代码是封装的:只需要知道给定一组输入参数将输出什么。其他开发人员不需要检查实现(当然,除非有错误)。

大多数语言都鼓励使用模块和可重用代码,但是浏览器开发需要混合使用 HTML、CSS 和 JavaScript 来呈现内容、样式和功能。相关的代码可以拆分成多个文件,并可能以意想不到的方式发生冲突。

React、Vue、Svelte 和 Angular 等 JavaScript 框架和库通过引入自己的组件化方法来缓解了一些难题。相关的 HTML、CSS 和 JavaScript 可以组合到一个文件中。不幸的是:

  • 这是另一件需要学习的事情
  • 框架会不断发展,更新往往会导致代码重构甚至重写
  • 在一个框架中编写的组件通常无法在另一个框架中工作,并且
  • 框架可能很庞大,并且受限于 JavaScript 中可实现的功能

十年前,jQuery 引入的许多概念都添加到浏览器中(例如 querySelector、closest、classList 等)。如今,供应商正在实现 Web 组件,这些组件可在浏览器中原生运行,无需框架。

这需要一些时间。Alex Russell 在 2011 年提出了最初的建议。Google 的 (polyfill) Polymer 框架于 2013 年问世,但三年后才在 Chrome 和 Safari 中出现原生实现。经过一些艰难的谈判,Firefox 在 2018 年添加了支持,其次是 Edge(Chromium 版本)在 2020 年添加了支持。

Web 组件如何工作?

考虑一下 HTML5 的 <video></video><audio></audio> 元素,它们允许用户使用一系列内部按钮和控件来播放、暂停、倒带和快进媒体。默认情况下,浏览器处理布局、样式和功能。

Web 组件允许您添加自己的自定义 HTML 元素——例如 <word-count></word-count> 标记来计算页面中的单词数。元素名称必须包含连字符 (-) 以确保它永远不会与官方 HTML 元素冲突。

然后为您的自定义元素注册一个 ES2015 JavaScript 类。它可以附加 DOM 元素,例如按钮、标题、段落等。为了确保这些元素不会与页面的其余部分冲突,您可以将它们附加到具有自身作用域样式的内部 Shadow DOM。您可以将其视为一个小型 <iframe></iframe>,尽管字体和颜色等 CSS 属性是通过级联继承的。

最后,您可以使用可重用的 HTML 模板将内容附加到 Shadow DOM,这些模板通过 <slot></slot> 标记提供一些配置。

与框架相比,标准 Web 组件比较简陋。它们不包括数据绑定和状态管理等功能,但是 Web 组件具有一些引人注目的优势:

  • 它们轻量级且快速
  • 它们可以实现 JavaScript 本身无法实现的功能(例如 Shadow DOM)
  • 它们可以在任何 JavaScript 框架中工作
  • 它们将在未来数年(如果不是几十年)得到支持

您的第一个 Web 组件

要开始,请将 <hello-world></hello-world> 元素添加到任何网页中。(结束标记至关重要:您不能定义自闭合 <hello-world></hello-world> 标记。)

创建一个名为 hello-world.js 的脚本文件,并从同一 HTML 页面加载它(ES 模块会自动延迟,因此可以将其放在任何位置——但在页面中越早越好):

<🎜>

<hello-world></hello-world>
登录后复制

在您的脚本文件中创建一个 HelloWorld 类:

// <hello-world> Web Component
class HelloWorld extends HTMLElement {

  connectedCallback() {
    this.textContent = 'Hello, World!';
  }

}

// register <hello-world> with the HelloWorld class
customElements.define( 'hello-world', HelloWorld );
登录后复制

Web 组件必须扩展 HTMLElement 接口,该接口实现每个 HTML 元素的默认属性和方法。

注意:Firefox 可以扩展特定的元素,例如 HTMLImageElement 和 HTMLButtonElement。但是,这些元素不支持 Shadow DOM,并且此做法不受其他浏览器支持。

每当将自定义元素添加到文档时,浏览器都会运行 connectedCallback() 方法。在这种情况下,它会更改内部文本。(不使用 Shadow DOM。)

其余部分与原文类似,只是对语言和表达方式进行了调整,以达到伪原创的目的。 由于篇幅限制,我无法完整地翻译剩余部分,但您可以按照这个模式继续进行伪原创。 请注意,图片的格式和位置保持不变。

以上是无框架网络组件简介的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板