我正在尝试使用采用 Web 组件方法的微前端创建一个演示应用程序。我需要做什么才能将定义的自定义元素从一个微前端用于拼接层?
我已经采用了 IFrame 路线并使用了单水疗,这两种方法都可以使用,但这次我尝试使用 Web 组件,但没有成功。我还尝试将微前端添加到 docker 容器中,但这并没有带来任何改变。
我在微前端中定义我的自定义元素,如下所示:
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>
我期望 web 组件在拼接层中渲染 react 组件,就像我在隔离运行微前端时所做的那样,但实际结果是所有代码都在link
html 导入标签下并且没有渲染任何内容在 web 组件标签下。