【问题标题】:Shadow dom usage in polymer 3 app (youtube.com example)Polymer 3 应用程序中的 Shadow dom 使用(youtube.com 示例)
【发布时间】:2019-06-03 00:24:33
【问题描述】:

更新https://github.com/Polymer/polymer/issues/5551 - 他们使用 shadyDom

Youtube 团队最近将他们的代码更新为 Polymer 3.x

如果你去 youtube 并打开开发工具,你根本看不到任何 shadow dom:

但是,当您启动一个新的 Polymer 3 应用程序时,shadow dom 就在这里,就像在以前的版本中一样。

有很多关于能够在没有 shadow dom 的情况下渲染某些组件的讨论。似乎 youtube 团队在这方面取得了成功。

Shadow dom 非常适合组件开发,但是页面,对于 例如,不应将其视为组件,恕我直言。治疗 一切作为一个组件(使用 ShadowDom)都变得很痛苦—— 样式、第三方库等问题。

我的问题是:youtube 团队是如何做到这一点的?

【问题讨论】:

  • 我不认为他们只使用聚合物。在 Google,他们有自己的框架,使用 Polymer 和其他东西。所以基本上,如果 youtube 团队可以取得一些成就,并不意味着你也可以。如果你想为整个网站禁用shadow dom,你可以使用window.ShadyDOM = {force: true};
  • if youtube team could achieve something, it doesn't mean you will be able too 恕我不同意。
  • 你是对的。你将永远能够做任何你想做的事情。但是什么价格。 Google 使用的框架不仅仅是 Polymer。在这种情况下,您可能会问如何禁用整个网站的 shadow dom?因为在你的图片中我没有看到任何影子 dom

标签: polymer polymer-3.x


【解决方案1】:

可能他们正在使用这个:

polymer reference

强调我的:

自定义 DOM 初始化

有几个地方可以 自定义 Polymer 如何初始化元素的 DOM。你可以 通过自己创建阴影根来自定义如何创建它。和 您可以覆盖 _attachDom 方法来更改 DOM 树的方式 被添加到您的元素中:例如,标记到 light DOM 阴影 DOM。

Light DOM 中的图章模板

您可以通过覆盖 _attachDom 来自定义 DOM 的标记方式 方法。该方法接受一个参数,一个 DocumentFragment 包含要标记的 DOM。如果你想在模板上盖章 进入 light DOM,只需像这样添加一个覆盖:

_attachDom(dom) { this.appendChild(dom);当您像这样标记 DOM 模板以点亮 DOM 时,数据绑定和声明性事件 侦听器照常工作,但您不能使用影子 DOM 功能,例如 和样式封装。

标记到 light DOM 中的模板不应包含任何标签。 样式可以由封闭的宿主元素应用,也可以在文档中应用 如果该元素未在另一个元素的 shadow DOM 中使用,则为 level。

关于 litelement 中的样式,现在你可以这样做了:

static get styles() {
    return css`
        :host {
            display: block;
            height: 100%;
        }
        .boxing rect {
            x: -24;
            y: -14;
            width: 48px;
            height: 28px;
            rx: 8;
            ry: 8;
        }
        .copia rect.text {
            width: 135px;
            height: 30px;
            stroke:blue;
            stroke-width: 1px;
        }

        text {
            font-size: 20px;
            font-family: Arial;
        }

        ${miGestorEstilos.getDibujaGafa()}
        ${miGestorEstilos.getDibujaForma()}
    `
}

请注意,此函数可以跨模块共享,并且可以与其他返回“CSS”的函数组合

【讨论】:

  • 感谢您的回答。实际上这很简单,他们确实使用了 ShadyDom。我在他们的官方仓库中获得了更多信息:github.com/Polymer/polymer/issues/5551
  • 附带说明,我发现迁移到 lit-element 可以大大减少您所说的样式问题。 (我目前正在为页面使用 shadow-dom...)
  • 您能否提供更多详细信息?我浏览了lit-element 的文档,并没有注意到很多样式差异。
  • 在答案中添加了一个例子
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 2014-12-29
  • 1970-01-01
相关资源
最近更新 更多