Vue 3 外部组件/插件在运行时加载

2023-12-11

我正在设计一个架构Vue 3具有基于分布式模块所有权的应用程序。模块系统将用插件来表示(似乎是最合适的解决方案,允许vuex模块和vue-router动态注入)。每个此类模块/插件都将由在独立存储库中工作的专门团队开发。我们不能使用npm每个插件包的方法作为部署过程也应该被隔离,并且npm方法核心应用程序团队每次都必须重建应用程序npm包插件有更新。这意味着我们必须在运行时通过以下方式加载此类插件/页面http.

So far 这种方法作者:Markus Oberlehner 似乎是某种可行的方法 - 它使用自定义Promise基于解决方案webpack缺少“在运行时加载外部 url 脚本”功能。虽然它可以很好地工作Vue 2, Vue 3 gives VNode type: undefined error.

上述文章提供了以下内容webpack外部元件加载解决方案:

// src/utils/external-component.js
export default async function externalComponent(url) {
    const name = url.split('/').reverse()[0].match(/^(.*?)\.umd/)[1];

    if (window[name]) return window[name];

    window[name] = new Promise((resolve, reject) => {
        const script = document.createElement('script');
        script.async = true;
        script.addEventListener('load', () => {
            resolve(window[name]);
        });
        script.addEventListener('error', () => {
            reject(new Error(`Error loading ${url}`));
        });
        script.src = url;
        document.head.appendChild(script);
    });

    return window[name];
}

但正如我所说,上面不适用于Vue 3 defineAsyncComponent机制。

// 2.x version WORKS
const oldAsyncComponent = () => externalComponent('http://some-external-script-url.js')

// 3.x version DOES NOT WORK
const asyncComponent = defineAsyncComponent(
    () => externalComponent('http://some-external-script-url.js')
)

所以我有两个问题:

  1. 对于上述架构规范是否有任何已知的更好的解决方案/建议?

  2. 有工作的吗webpack动态外部导入解决方案经过测试Vue 3在那里?

UPD:这里很小复制仓库


我们通过聊天一起解决了这个问题。

通过 Vue 3 vue-cli 构建的组件依赖Vue在全球范围内可用。因此,为了渲染通过我的文章中描述的技术加载的组件,您需要设置window.Vue参考Vue本身。然后一切都会按预期进行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue 3 外部组件/插件在运行时加载 的相关文章

随机推荐

  • 如何就地对文件进行排序?

    当我们使用sort file命令 该文件以排序的方式显示其内容 如果我不想在标准输出上获得任何输出 而是想在输入文件中获得任何输出 该怎么办 您可以使用 o output FILEsort 选项指示相同的输入和输出文件 sort o fil
  • 将对象数据字段复制到子类实例中

    我有两个类 TNode 和 TMaster 我从 TNode 继承了 TMaster 目标是创建一个 TMaster 实例 其中包含先前创建的 TNode 实例的所有数据 是否有任何 内置 方法可以实现此目的 或者应该手动完成 type T
  • 计算向量中相同字符串的更简单方法?

    我正在尝试获取向量中所有相同字符串的数量的输出 作为更大程序的一部分 经过大量研究后 我设法将一些有用的东西组合在一起 但看起来很混乱 我想知道是否有更好的方法来做到这一点 include
  • 在多行数据中提取记事本++中2个特定单词之间的字符串/数据

    All 我一直在尝试使用正则表达式搜索和替换在 Notepad 中提取 2 个特定单词之间的文本 但没有运气 它给了我找到的最后一个匹配项 我尝试搜索 Stack Overflow 并回答了几个问题 但没有运气 我的数据是 Open opt
  • FirebaseListAdapter 不推送聊天应用程序的单个项目 - Firebase-Ui 3.1

    我正在 Android 上制作一个聊天应用程序 它使用 google firebase 来存储用户互相写入的消息 为了向用户显示这些消息 我从数据库中读取它们 并使用 ListAdapter 将它们组织到自定义 ListView 中 在我将
  • 如何在Jcreator中调试? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我使用的是 JCreator 版本 5 0 0 10 而且我不知道如何调试程序 能否请您
  • 根据文本内容查找html元素

    我有一个像这样的html代码 div span TV span div 我想找到这个span通过具有文本 TV 的 documentObject 例如getElementById等等 类似的东西getElementByText 我知道可以通
  • 在 C# 中指定范围

    我有 6 个范围 1000000 5000000 50000001 10000000 10000001 25000000 25000001 50000000 50000001 75000000 75000001 100000000 现在我该
  • h5py 将虚拟数据集读取到 NumPy 数组时出错

    我正在尝试从使用 h5py 创建的虚拟 HDF 数据集加载数据 但在正确加载数据时遇到一些问题 这是我的问题的一个例子 import h5py import tools as ut virtual h5py File ut params p
  • C# 泛型方法和动态类型问题[重复]

    这个问题在这里已经有答案了 我有一个通用方法声明如下 public void Duplicate
  • SurfaceView 和 ImageView 的区别

    我想知道SurfaceView和ImageView有什么区别以及它们的使用场景 两者似乎都是一样的 如果有我可能错过的正确链接 请指导我 表面视图的一些优点和差异 更好的渲染机制 线程可以在不使用处理程序的情况下更新表面的内容 这有助于提高
  • Angular 中的子父母沟通最佳实践

    我正在努力提高 Angular 的水平 并且想了解儿童与家长之间沟通的最佳实践 我当前想要使用的应用程序是 Angular 6 我知道我可以使用 ViewChild Output 或创建服务在子父组件之间进行通信 还有其他方式进行沟通吗 如
  • 无法让OkHttp的response.body.toString()返回字符串

    我正在尝试使用 OkHttp 获取一些 json 数据 但当我尝试记录时无法弄清楚为什么response body toString 我得到的是Results com squareup okhttp Call RealResponseBod
  • 在最新的 MapBox SDK 6.7 中旋转和更改标记的位置

    Mapbox Android SDK 6 7 0 我们正在开发的应用程序的要求是 我们必须在不同的 LatLng 位置添加多个标记 并使用一些方位旋转它们 在旧的mapbox版本 4 2 1 中 我们可以毫无问题地做到这一点 Working
  • 如何在可编码类型中使用 Any

    我目前正在与Codable输入我的项目并面临问题 struct Person Codable var id Any id上面的代码可以是String or an Int 这就是原因id属于类型Any 我知道Any is not Codabl
  • 在 ActionScript 3 中加密/解密图像

    我正在开发一个移动应用程序 其中包含 本质上 图片消息功能 我需要使用简单的纯文本密码对图像进行加密 解密 由于所捕获图像的性质 加密和解密过程在设备上进行是 至关重要的 在听完有关 Flex 移动开发的演示后 我决定使用 Flex SDK
  • 为什么查询不会因子查询中不存在的列而失败?

    我在查询中拼写错误 并遇到了 MySQL 的奇怪行为 create table aaa id bigint auto increment primary key amount int not null other column varcha
  • sklearn 绘制带有标签的混淆矩阵

    我想绘制一个混淆矩阵来可视化分类器的性能 但它仅显示标签的数量 而不显示标签本身 from sklearn metrics import confusion matrix import pylab as pl y test business
  • 是否有可能并且以良好的形式在 Angular 中重用相同的数据工厂?

    我正在查看 Angular 的 CRUD 通用工厂 我目前更喜欢使用它而不是使用服务 app factory dataFactory http function http var urlBase odata ContentTypes The
  • Vue 3 外部组件/插件在运行时加载

    我正在设计一个架构Vue 3具有基于分布式模块所有权的应用程序 模块系统将用插件来表示 似乎是最合适的解决方案 允许vuex模块和vue router动态注入 每个此类模块 插件都将由在独立存储库中工作的专门团队开发 我们不能使用npm每个