我们的平台建立在带有 Web 组件的微前端架构上。我们对其中一些使用 Stencil,这意味着我们在一个网页中有多个 Stencil 应用程序。此外,我们还有一个 UI 库,也是用 Stencil 构建的,我们希望在这些微前端组件中使用它。
我们想使用 Stencil UI 库作为 Stencil 微前端组件的构建时依赖项。但是由于标签名称冲突,这目前是不可能的:
理论上,两个微前端可以发布两个不同版本的 UI 库。但是,在运行时,它们会发生冲突,因为它们都试图用customElements.define
. 当然,这不会发生,因为 Stencil 在注册新名称之前会检查现有名称 - 但结果同样糟糕:第一个加载的组件总是获胜,如果它是旧版本或具有不同的 API,其他组件会破裂。
一个解决方案是在构建或运行时命名空间/为标签名称添加前缀,但网络标准中没有任何内容(尚未)。虽然namespace
Stencil 中有一个配置选项,但这似乎并不能解决此类问题。
使用纯 ES6,我们至少可以做到以下几点(即注册一个带有动态标签名称的自定义元素):
export class InnerComponent extends HTMLElement
{
static register(prefix) {
customElements.define(`my-${prefix}-inner-component`, InnerComponent)
}
constructor() {
super()
this.shadow = this.attachShadow({ mode: "open" })
}
connectedCallback() {
this.shadow.innerHTML = `<span>this is some UI component</span>`
}
}
而且我确信我们可以使用某种构建时解决方案和 Webpack 等来实现相同的目标。
但是 Stencil 是否有类似的可能?或者还有什么办法可以解决这个问题?