【发布时间】:2020-12-14 07:14:38
【问题描述】:
我正在为 Vue 3 应用程序设计一个架构,它具有基于分布式模块的所有权。模块系统将用插件表示(似乎是允许vuex 模块和vue-router 动态注入的最合适的解决方案)。每个这样的模块/插件都将由在独立存储库中工作的专门团队开发。我们不能使用npm package-per-plugin 方法,因为部署过程也应该被隔离,并且使用npm 方法,核心应用程序团队将不得不在每次npm 包插件更新时重新构建应用程序。这意味着我们必须在运行时通过http 加载此类插件/页面。
到目前为止,Markus Oberlehner 的 this approach 似乎是某种可行的方法 - 它使用基于自定义 Promise 的解决方案来解决 webpack 缺少的“在运行时加载外部 url 脚本”功能。虽然它适用于 Vue 2,但 Vue 3 给出 VNode type: undefined 错误。
上述文章提供了以下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')
)
所以我有两个问题:
-
对于上述架构规范是否有任何已知的更好的解决方案/建议?
-
有没有用
Vue 3测试过的有效webpack动态外部导入解决方案?
UPD:这里是小号reproduction repo
【问题讨论】:
-
你好 Denys,这里是 Markus。你能提供一个复制的 Git repo 吗?刚刚用 Vue 3 对其进行了测试,它对我有用。
-
嗨@moriartie,我在票证描述中添加了回购链接。感谢您愿意看看)
-
@markoffden 你愿意加入chat.stackoverflow.com/rooms/240683/vue-external-components 聊天并在某个时候帮助我吗?我正在尝试走类似的路线,但遇到了问题。
-
@DavidTorrey 抱歉,当时是在远离笔记本电脑的纽约假期 :) 我可以补充一点,那时我们选择不更新到 Vue 3。我们还使用了
single-spa包。然后我离开了这个项目,所以没有更多可以分享的,AFAIK 团队对上述方法很满意。
标签: vue.js webpack vue-cli vuejs3