我希望他们混在一起 . 更具体地说,小部件使用Semantic-UI组件,而某些主机页面使用bootstrap .

我发现了Shadow Dom并根据我的理解它应该避免使用css leaking out from my component and vice-versa

Scoped CSS:在shadow DOM中定义的CSS是作用域的 . 样式规则不会泄漏,页面样式也不会流失 .

太好了,似乎这正是我想要的 .

那么我已经将我的React根函数改为这样的:

import React from 'react';
import {render} from 'react-dom';
import {Provider} from 'react-redux';
import {Store} from 'react-chrome-redux';

import AppContainer from './components/AppContainer';
import Toolbar from './components/Toolbar';

const proxyStore = new Store({portName: 'my-extension'});

const anchor = document.createElement('div');
anchor.id = 'my-extension-anchor';
const shadowRoot = anchor.attachShadow({mode: 'open'})

const semanticUrl = chrome.runtime.getURL("styles/semantic.min.css")

document.body.appendChild(anchor)

render(
  <Provider store={proxyStore}>
      <div>
          <link id='semantic-ui' rel='stylesheet' type='text/css' href={semanticUrl} media='all' />
          <AppContainer>
              <Toolbar />
          </AppContainer>
      </div>
  </Provider>
  , shadowRoot);

我注意到的第一件事是我的小部件没有得到正确的字体 . 在一些谷歌之后,我发现this post解释我要从semantic-ui文件中取出我的font-faces并将其注入主机的头部 . 现在它似乎工作,但它仍然听起来像一个廉价的解决方案 .

无论如何,即使在这个改变之后它没有按照我的预期工作,我的小部件中的CSS也不再泄漏......但是我的小部件正受到当前页面样式表的影响 . 我尝试过其他一些修改:

  • 使用模式关闭而不是打开

  • 使用一些React库,即:ReactShadow

当我检查我的元素时,我可以看到它正在使用主页中的一些样式表,显示如下内容:

继承自div#my-extension-anchor body {bootstrap.min ....

我的小部件应该是“无引导” .

我误解了Shadow DOM的工作原理吗?有办法实现我想要的吗?