Как повторно использовать определенный веб-компонент из микро-интерфейса в вышивальном слое? - PullRequest
1 голос
/ 10 мая 2019

Я пытаюсь создать демонстрационное приложение с использованием микро-интерфейсов, используя подход веб-компонентов.Что мне нужно сделать, чтобы я мог использовать определенный пользовательский элемент из одного микро-интерфейса в слой сшивания?

Я уже прошел маршрут IFrame и использую single-spa, который работает, но на этот разЯ пытаюсь использовать веб-компоненты без удачи.Я также пытался добавить микро-интерфейс в контейнер докера, но это не принесло никаких изменений.

Я определяю свой пользовательский элемент в микро-интерфейсе следующим образом:

class CommentSection extends HTMLElement {
  connectedCallback() {
    ReactDOM.render(<App />, this.attachShadow({mode: 'open'}));
  }
}
window.customElements.define('comment-section', CommentSection);

Я использую его в микро-интерфейсе index.html:

<comment-section></comment-section>

Пока все работает.Моя проблема возникает, когда я пытаюсь использовать его из слоя сшивания.

Из приложения React я создал файл server.js для передачи содержимого:

server.get('/', (req, res) => {
  const htmlPath = path.resolve(__dirname, 'build', 'index.html');

  fs.readFile(htmlPath, 'utf8', (err, html) => {
    const rootElem = '<comment-section>';
    const renderedApp = renderToString(React.createElement(App, null));

    res.send(html.replace(rootElem, rootElem + renderedApp));
  });
});

server.use(express.static('build'));

и из слоя сшивания, создавая прокси к микро-интерфейсу:

app.use(express.static(__dirname + '/public'));

const createProxy = (path, target) => {
    app.use(path, proxy({ target, changeOrigin: true, pathRewrite: {[`^${path}`]: ''} }));
}

createProxy('/react', 'http://localhost:3000');

app.get('/', (req, res) => res.render('index'));

и импортируя его так же, как в строчке index.html:

<head>
  <link href="/react" rel="import" async/>
</head>
<body>
  <comment-section></comment-section>
</body>

Я ожидаювеб-компонент для рендеринга компонента реакции в слое сшивания, как это происходит, когда я запускаю микро-интерфейс изолированно, но фактический результат заключается в том, что весь код находится под тегом link html import, и ничего не отображается подтег веб-компонента.

микро-интерфейс веб-компонента web component micro-frontend

слой сшивания веб-компонента web component stitching layer

1 Ответ

0 голосов
/ 15 мая 2019

Ваш пример выглядит слишком сложным. Веб-компонент состоит из двух частей: пользовательский элемент и сценарий, в котором он определен.

Итак, для рендеринга веб-компонента вам просто нужно добавить скрипт в целевой HTML, <script src="/static/js/xxx.js"></script> в вашем случае, и все. Докер, прокси и т. Д. Не требуются.

Другими словами: вы должны использовать веб-компонент везде, где вы его размещаете, точно так же, как в файле index.html «микро-интерфейса».

И об этом <link ref="import">: импорт HTML устарел (Chrome: https://www.chromestatus.com/feature/5144752345317376 Firefox: https://developer.mozilla.org/en-US/docs/Web/Web_Components/HTML_Imports)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...