gpt4 book ai didi

javascript - 如何在拼接层中重用微前端定义的 Web 组件?

转载 作者:太空宇宙 更新时间:2023-11-04 01:31:04 25 4
gpt4 key购买 nike

我正在尝试使用微前端采用 Web 组件方法创建一个演示应用程序。我需要做什么才能将定义的自定义元素从一个微前端使用到拼接层?

我已经采取了 IFrame 路线并使用 single-spa,两者都可以工作,但这次我尝试使用 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 import 标签下,而 Web 组件标签下没有渲染任何内容。

Web组件微前端 web component micro-frontend

web组件拼接层 web component stitching layer

最佳答案

你的例子看起来过于复杂。 Web 组件由两部分组成:自定义元素和定义它的脚本。

因此,要渲染 Web 组件,您只需将脚本添加到目标 html 中,<script src="/static/js/xxx.js"></script>就你而言,仅此而已。无需 Docker、Proxy 等。

换句话说:您应该在任何地方使用 Web 组件,就像在“微前端”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 )

关于javascript - 如何在拼接层中重用微前端定义的 Web 组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56076667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com