【问题标题】:Using bootstrap in web components shadowDOM在 web 组件 shadowDOM 中使用引导程序
【发布时间】:2021-05-19 21:00:48
【问题描述】:

在使用 LitElement 的 Web 组件/shadowDOM 应用程序中使用大型 css 库(如引导程序)的最简单方法是什么?
尝试了以下方法:

  1. 在组件中使用链接标签。有效,但会创建 FOUC(无样式内容的闪存)。
  2. 将所有内容渲染到 Light DOM(我正在使用 LitElement,它们有一个 createRenderRoot() 覆盖。也可以,但随着应用程序变得越来越复杂,维护组件文档隔离会很好。

寻找在此设置中使用 boostrap 的最简单方法。

【问题讨论】:

    标签: css bootstrap-4 web-component shadow-dom lit-element


    【解决方案1】:

    LitElement 推荐的向组件添加样式的方法是通过styles 属性。以这种方式加载外部.css 文件并不简单,但有一些解决方案。

    import 方式

    如果您对“最简单方式”的定义包括使用转译器或模块捆绑器,那么您可以使用非 js 内联导入来完成以下操作:

    import bootstrap from './path/to/bootstrap.css';
    // ...
    
    class MyElement extends LitElement {
    
      static styles = bootstrap; // If your build system already converted
                                 // the stylesheet to a CSSResult
    
      static styles = unsafeCss(bootstrap); // If bootstrap is plain text
    
    }
    

    有许多专门用于此的插件:例如参见babel-plugin-inline-importrollup-plugin-lit-cssrollup-plugin-postcss-litwebpack-lit-loader

    包装方式

    如果您想保持(几乎)无构建,您可以编写一个简单的postinstall 脚本,该脚本会生成一个导出点亮样式的.js 文件:

    // bootstrap.css.js
    import {css} from 'lit-element';
    
    export const bootstrap = css`
    <bootstrap here>
    `;
    
    // my-element.js
    import {bootstrap} from './bootstrap.css.js';
    
    class MyElement extends LitElement {
      static styles = bootstrap;
    }
    

    关于 Shadow DOM

    如果您想使用 Shadow DOM,您必须在需要使用它的每个 组件中导入该库,甚至是嵌套组件。多亏了Constructable Stylesheets,这并不像看起来那么繁琐,Lit 在后台使用了它;将其视为组件加入样式上下文的一种方式,而不是复制相同的样式表。此外,为了让事情井井有条,您可以创建一个“基础”组件来导入引导程序并在需要的地方扩展它:

    import bootstrap from 'path/to/bootstrap.css';
    
    export class BaseElement extends LitElement {
      static styles = bootstrap;
    }
    
    class MyElement extends BaseElement {
      render() {
        // Bootstrap is ready to use here!
        return html``;
      }
    }
    

    【讨论】:

    • 太棒了-谢谢!我已经在使用 webpack 并且还有一个基类,所以基类 + 捆绑器看起来是一个不错的方法。将尝试一些捆绑程序并从那里开始。
    • 很高兴我能帮上忙! :)
    • 太棒了!似乎有一个缺点——如果你的整个网站不是在 webcomponents 中构建的,那么任何一种方法都将涉及两次加载 css 文件——一次在你的网站 html 的样式标签中,一次在 webpack 内容中。尽管如此,还是比“Flash of Unstyled Content”问题要好得多。
    • @MichaelScottCuthbert 你是对的。您可以重用组件的相同构造样式表并将其应用于document,但请参阅here
    • 虽然这对 bootstrap 非常有效,但对于我网站的自定义 css 来说效果不佳,因为 @import 在 CSSResult 中不可用,它导入了 webfont。但它给出了很多好的方向。
    猜你喜欢
    • 2012-08-17
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多