【问题标题】:Embedding Vue Apps (or Vue Web Components) in a non Vue web application在非 Vue Web 应用程序中嵌入 Vue 应用程序(或 Vue Web 组件)
【发布时间】:2021-02-10 08:57:49
【问题描述】:

我是 Vue 的新手,我的任务是创建一些 Vue 小部件,这些小部件可以嵌入到几个现有的非 Vue 旧版 Web 应用程序中。我们的想法是,我们将创建一个包含这些小部件的库,然后可以将其嵌入到任一遗留应用程序中,最终我们可能会将整个应用程序迁移到 Vue。

我一直在寻找最好的前进方式,但我有点困惑。我想这些是我的问题:

  1. 我是否需要在这里考虑 Web 组件,或者这些小部件可以是我们以某种方式嵌入的实际 Vue 应用程序?

  2. 如果小部件应该创建为 Web 组件,使用 Vue/web-component-wrapper 或 vue-custom-element 库有什么区别吗?

  3. 无论我们选择哪个选项,我们都可以充分利用您在任何普通 Vue 应用程序中使用的功能 - Vue 路由器、用于状态管理的 Vuex 等(并且可以在这些小部件之间共享状态)?

  4. 小部件是否需要完全设置样式,或者最好将组件的所有样式留给父应用(或两者的组合)?

我以前从来没有做过这样的事情(你可能知道!)所以任何指导或建议或指向示例的指针都将不胜感激。

** 更新**

我发现了这篇文章,我认为这是我需要在https://itnext.io/vuidget-how-to-create-an-embeddable-vue-js-widget-with-vue-custom-element-674bdcb96b97去的方向

【问题讨论】:

  • 传统 Web 应用程序的技术栈是什么?服务器端(Java/Spring 等)还是客户端(React 等)?

标签: javascript vue.js embed web-component vuex4


【解决方案1】:

有三种不同(但非常相似)的情况:

  • web components
    它们应该是一个封装的 Web 片段。如果您愿意,它是<iframe>s 的更智能替代方案。它的主要用例(以及它的设计目的)是在页面中显示广告并保证主机不会弄乱其内部逻辑和呈现。

  • custom elements
    简单地说,这些就是声明和注册的自定义 HTML 标记。使用它们的好处是能够在任何外部框架中将它们标记为 off-limits,并声明:“此自定义元素不是您的自定义组件之一,请将其视为 HTML 标记".

  • framework components
    默认情况下,现代 JS 框架(Angular、React、Vue)在内部使用这种模式:它们的内部组件看起来像自定义元素(案例 2)。 但它们不是。它们只是内部约定,从未进入应用的 HTML 标记输出。
    以下是内部发生的情况:解析模板时,如果遇到未知的 HTML 元素,框架会假定它是其注册组件之一。如果是,则不呈现标签。该组件的新实例被创建,标签被替换为组件模板的内容(或其渲染函数的结果)。
    上述所有框架,当遇到不是已注册自定义组件的未知 html 标签时,都会发出类似 “嘿,您忘记注册此组件吗?”的警告。除非它被注册为自定义元素(案例 2)——在这种情况下,他们将其视为:HTML 标记。

Vue 优雅地处理了上述所有问题。您为小部件选择的内容很大程度上取决于上下文和所需的最终结果。

以下是您问题的答案:

  1. 我是否需要在这里考虑 Web 组件,或者这些小部件可以是我们以某种方式嵌入的实际 Vue 应用程序?

如果您希望能够根据上下文设置样式,则不应使用 Web 组件。

  1. 如果小部件应该创建为 Web 组件,使用 @vue/web-component-wrappervue-custom-element 库有什么区别吗?

是的,有。 @vue/web-component-wrapper 生成 Web 组件(封装的 DOM 框架)。
vue-custom-elements 声明并使用自定义元素(自定义 HTML 标记)。它们的内容是 HTML 标记(未封装)。使用自定义元素的优点是能够通知外部框架:不要将此自定义元素视为您自己的组件之一,它由其他东西处理(在我们的例子中是 Vue)。将其视为 HTML 标记。

  1. 无论我们选择哪个选项,我们都可以充分利用您在任何普通 Vue 应用程序中使用的功能 - Vue 路由器、用于状态管理的 Vuex 等(并且可以在这些小部件之间共享状态)?

是的。无论您选择哪个选项,您仍在使用 JavaScript(每个小部件/应用程序都可以不受限制地访问整个上下文)。您还可以将依赖项注入到您的小部件中,允许它们进行通信(通过修改相同的外部依赖项 - 路由器、状态管理模块等......)。这几乎是每个 Vue 实例正常运行的标准模式。简单来说,Vue(子)组件可以在没有父组件的情况下运行,本质上是一个 Vue 应用程序。 (或者,如果您愿意,每个 Vue 应用程序都是一个 Vue 实例,它的所有子组件也是 Vue 实例)。

  1. 小部件是否需要完全设置样式,或者最好将组件的所有样式留给父应用(或两者的组合)?

这完全是您的代码设计选择。在 Vue 中 scope CSS 很容易。但是从上面的样式(DRY-er 代码)有很大的优势。此外,来自上下文的样式意味着应用较少的 CSS 规则,尽管这几乎不能算作性能问题。显然,要考虑第一个问题的答案。

【讨论】:

  • 感谢您提供详细的答案-四处寻找我在此线程stackoverflow.com/questions/61899394/… 上找到了您的其他回复。如果我正确理解了该答案,那么您正在做我想做的事,但没有使用 web-component-wrapper 或 vue-custom-element - 对吗?
  • @Richard,是的。这种模式在大多数情况下都有效。但是,有一些特别的地方我不推荐它。例如,如果您的应用使用 Bootstrap 4.x,并且您尝试将其嵌入到 Bootstrap 3.x 上下文中。
  • 谢谢,同样的模式是否适用于 Vue 3?我对 Vue 很陌生,并且在理解我将如何做到这一点方面有点挣扎 - 你不能在 Vue 3 中做那个 Vue.set 位 - 我不认为? - 我不确定等价物是什么?
  • 我对 Vue 3 的探索还不足以回答这个问题,而且就我而言,这是一个不同的问题。虽然我没有看到使用相同原理的任何实际问题,但实施细节很可能会有所不同。目前,在我看来,Vue 3 还没有准备好生产,因为没有任何主要的库支持它(例如:Bootstrap-Vue、Vuetify 等)。相比之下,我认为我的团队是 Vue 的早期采用者,但我们仍然认为我们至少要再过半年才能在生产环境中使用 Vue 3。
猜你喜欢
  • 2018-12-01
  • 2020-01-08
  • 2021-11-08
  • 2019-02-02
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 2021-11-18
  • 2021-07-28
相关资源
最近更新 更多