欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaScript是如何工作

程序员文章站 2022-12-05 13:27:39
这是专门探索 javascript 及其所构建的的系列文章的第 17 篇。 如果你错过了前面的章节,可以在这里找到它们: javascript 是如何工作的:引擎,运行时和调用...

这是专门探索 javascript 及其所构建的的系列文章的第 17 篇。

如果你错过了前面的章节,可以在这里找到它们:

javascript 是如何工作的:引擎,运行时和调用堆栈的概述! javascript 是如何工作的:深入v8引擎&编写优化代码的5个技巧! javascript 是如何工作的:内存管理+如何处理4个常见的内存泄漏! javascript 是如何工作的:事件循环和异步的崛起+ 5种使用 async/await 更好地编码方式! javascript 是如何工作的:深入探索 websocket 和http/2与sse +如何选择正确的路径! javascript 是如何工作的:与 webassembly比较 及其使用场景! javascript 是如何工作的:web workers的构建块+ 5个使用他们的场景! javascript 是如何工作的:service worker 的生命周期及使用场景! javascript 是如何工作的:web 推送通知的机制! javascript是如何工作的:使用 mutationobserver 跟踪 dom 的变化! javascript是如何工作的:渲染引擎和优化其性能的技巧! javascript是如何工作的:深入网络层 + 如何优化性能和安全! javascript是如何工作的:css 和 js 动画底层原理及如何优化它们的性能! javascript的如何工作的:解析、抽象语法树(ast)+ 提升编译速度5个技巧! javascript是如何工作的:深入类和继承内部原理+babel和 typescript 之间转换! javascript是如何工作的:存储引擎+如何选择合适的存储api!概述

web components 是一套不同的技术,允许你创建可重用的定制元素,它们的功能封装在你的代码之外,你可以在 web 应用中使用它们。

web组件由四部分组成:

shadow dom(影子dom) html templates(html模板) custom elements(自定义元素) html imports(html导入)

在本文中主要讲解 shadow dom(影子dom)

shadow dom 这款工具旨在构建基于组件的应用。因此,可为网络开发中的常见问题提供解决方案:

隔离 dom:组件的 dom 是独立的(例如,document.queryselector() 不会返回组件 shadow dom 中的节点)。 作用域 css:shadow dom 内部定义的 css 在其作用域内。样式规则不会泄漏,页面样式也不会渗入。 组合:为组件设计一个声明性、基于标记的 api。 简化 css - 作用域 dom 意味着您可以使用简单的 css 选择器,更通用的 id/类名称,而无需担心命名冲突。

shadow dom

本文假设你已经熟悉 dom 及其它的 api 的概念。如果不熟悉,可以在这里关于它的详细文章—— https://developer.mozilla.org...。

阴影 dom 只是一个普通的 dom,除了两个区别:

创建/使用的方式 与页面其他部分有关的行为方式

通常,你创建 dom 节点并将其附加至其他元素作为子项。 借助于 shadow dom,您可以创建作用域 dom 树,该 dom 树附加至该元素上,但与其自身真正的子项分离开来。这一作用域子树称为影子树。被附着的元素称为影子宿主。 您在影子中添加的任何项均将成为宿主元素的本地项,包括

通常,创建 dom 节点并将它们作为子元素追加到另一个元素中。借助于 shadow dom,创建一个作用域 dom 树,附该 dom 树附加到元素上,但它与实际的子元素是分离的。这个作用域的子树称为 影子树,被附着的元素称为影子宿主。向影子树添加的任何内容都将成为宿主元素的本地元素,包括

创建 shadow dom

影子根是附加到“宿主”元素的文档片段,元素通过附加影子根来获取其 shadow dom。要为元素创建阴影 dom,调用 element.attachshadow() :

var header = document.createelement('header');
var shadowroot = header.attachshadow({mode: 'open'});
var paragraphelement = document.createelement('p');

paragraphelement.innertext = 'shadow dom';
shadowroot.appendchild(paragraphelement);

规范定义了元素列表,这些元素无法托管影子树,元素之所以在所选之列,其原因如下:

已为该元素托管其自身的内部 shadow dom(