Vue 加载远程组件的解决方案

news2025/4/5 16:44:43

背景

最近的项目有一个加载远程组件的需求。基于此我对 Vue 加载远程组件的方案进行了研究,并且整理了两个可行的解决方案。

HTML 文件 + umd 组件

这个方案是最简单、最容易实现的。组件以 umd 的格式进行打包,然后在 HTML 文件中直接使用。

<div id="app">
    <test-input></test-input>
</div>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script>
    // 将组件 URL 挂载到 script 标签上,然后通过 window 获取这个组件
    await lodaScript('http://localhost/component/input/0.1.0/bundle.js')
    app.component('TestInput', window.TestInput)
</script>

但是这个方案不适合在大型项目中使用,效率比较低。

Vue 工程项目 + esm /umd 组件

Vue 工程项目 + esm /umd 组件是我目前在使用的方案,但是在研究的过程中遇到了两个问题,逐一解决后,才把这个方案趟通了。

第一个问题 Relative references must start with either "/", "./", or "../"

由于我们的项目不需要兼容 IE,所以打包组件采用的是 esm 格式。打包后的组件源码如下:

import { reactive } from 'vue'
// other code...

然后在主项目中进行引用:

const { default: TestInput } = await import('http://localhost/component/input/0.1.0/bundle.mjs')

在动态导入远程组件到项目时,提示报错 Relative references must start with either "/", "./", or "../"。这是因为在浏览器中不支持以 import { reactive } from 'vue' 的方式进行导入,得把 'vue' 改成 https://..../vue.js 或者 './vue.js' 的形式才可以。平时我们这样用没问题是因为有 vite、webpack 等构建工具帮忙解决了这个问题。

第二个问题 Vue 上下文环境不同

产生上面的问题是因为要引入依赖,如果打包组件时把相关依赖都打在一起,那不就没有 import 语句了。结果试了一下还是不行,因为当前的 Vue 主项目和打包好的 Vue 组件存在两个不同的 Vue 上下文。导致在加载组件时报错,比如提示 xxx 变量找不到 这种问题。

在这里插入图片描述
虽然主项目和远程组件使用的 Vue 方法都是一样的,但由于各自的 Vue 上下文不一样,导致主项目无法正常使用远程组件。

以上两个问题困扰了我一天的时间,但是睡醒一觉后,终于想到了如何解决这两个问题。首先在浏览器上不能直接使用 import { reactive } from 'vue' 这种语句,那把它改成 const { reactive } = Vue 就能解决这个问题了。至于第二个问题,打包时不把依赖打在一起,而是在 main.js 文件中直接把整个 Vue 引进来:

import * as Vue from 'vue'
window.Vue = Vue

这样就能确保主项目和远程组件使用的是同一个 Vue 上下文。

为了解决代码转换问题,我写了一个 rollup-plugin-import-to-const 插件(支持 rollup、vite),打包 esm 组件时,它会自动的把 import { reactive } from 'vue' 转换成 const { reactive } = Vue

至此,就可以在主项目中加载远程 esm 组件了:

const { default: TestInput } = await import('http://localhost/component/input/0.1.0/bundle.mjs')

其实只要能解决上面的两个问题,不管是 esm 还是 umd、cjs 等格式,都能够实现加载远程组件的方案。比如换成 umd 的格式来打包组件,就不需要引入 rollup 插件去转换代码了,并且还能支持 webpack。唯一要做的只是在 main.js 上把 Vue 全引进来挂到 window 下。

import * as Vue from 'vue'
window.Vue = Vue

总结

远程组件的方案其实不止上面两种,比如还有直接加载 .vue 文件的方案,有个现成的 vue3-sfc-loader 插件能用。 一般来说,加载远程组件的应用场景比较少,所以网上能搜到的讨论也比较少。目前比较常见的应用场景应该就是在低代码平台中加载远程组件了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/802493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Glide原理分析

工程目录图 Glide源码分析 - 缓存源码分析 活动缓存 &#xff1a;当前activity有效内存缓存&#xff08;LRU算法&#xff0c;核心linkhashmap&#xff09;,当前运行的整个app生命周都有效&#xff0c;有大小限制&#xff0c;防止app oom磁盘缓存&#xff0c;整个app都有效&…

汇编语言(第4版)实验9 根据材料编程

参考答案&#xff1a; ①经分析&#xff0c;完整程序代码如下。 assume cs:codesg,ds:datasgdatasg segment db welcome to masm! datasg endscodesg segment start: mov ax,0b800hmov es,axmov si,0722hmov ax,datasgmov ds,axmov cx,16mov bx,0s: mov al,ds:[bx]mov ah,0…

语音识别 — 特征提取 MFCC 和 PLP

一、说明 语音识别是一种技术&#xff0c;通过计算机和软件系统&#xff0c;将人们的口头语言转换为计算机可读的文本或命令。它使用语音信号处理算法来识别和理解人类语言&#xff0c;并将其转换为计算机可处理的格式。语音识别技术被广泛应用于许多领域&#xff0c;如语音助手…

Spring学习之Spring启示录

文章目录 OCP开闭原则依赖倒置原则控制反转依赖注入DI OCP开闭原则 什么是OCP&#xff1f; OCP是软件七大开发原则当中最基本的一个原则&#xff1a;开闭原则对什么开&#xff1f;对拓展开对什么闭&#xff1f;对修改关系 如果为了一个功能拓展&#xff0c;需要修改之前运行良…

项目播报 | 新基德携手璞华易研PLM,打造企业新一代研发管理平台

近日&#xff0c;“新基德PLM&#xff08;Product Lifecycle Management&#xff0c;产品生命周期管理&#xff09;项目”在新基德&#xff08;深圳&#xff09;电子有限公司&#xff08;以下简称&#xff1a;新基德&#xff09;正式启动。新基德是一家集手机研发、生产、销售、…

2023 数字生态发展大会,和鲸 ModelWhale 入选中国信通院“铸基计划”《高质量数字化转型产品及服务全景图》

7月27日&#xff0c;由中国信通院主办的“2023数字生态发展大会”暨中国信通院“铸基计划”年中会议在北京召开。本次大会重磅发布了《高质量数字化转型产品及服务全景图&#xff08;2023&#xff09;》&#xff0c;和鲸科技旗下数据科学协同平台 ModelWhale 成功入选&#xff…

android jetpack DataStore(java)代替SharedPreferences

目录 Preferences DataStore 怎么用&#xff1f;导入依赖创建 Preferences DataStore读取内容写入内容 Proto DataStore怎么用&#xff1f;导入依赖创建proto创建Serializer使用DataStore DataStore 提供两种不同的实现&#xff1a;Preferences DataStore 和 Proto DataStore。…

【C语言进阶】重新认识字符型变量

引例 首先我们看一个简单的例子 #include <stdio.h> #include <stdlib.h>int main() {double x4 2023.727;char c (int)x4 / 10;printf("c%6c\tc%6hd\n",abs(c),abs(c));return 0; } }这小例子的结果是多少呢&#xff1f; 结果是 “c 6 c 54” 有知…

医学案例|单因素重复测量方差

一、案例介绍 为研究某诱导方法对患者收缩压的影响&#xff0c;将手术要求基本相同的15名患者&#xff0c;在手术过程中采用A麻醉诱导方法&#xff0c;并在T0&#xff08;诱导前&#xff09;、T1、T2、T3、T4五个时刻测量患者的收缩压&#xff0c;试着进行方差分析。 二、问题…

小程序相较于APP,广告变现有哪些优势?

对于开发者而言&#xff0c;微信小程序开发门槛相对较低&#xff0c;难度不及APP&#xff0c;能够满足简单的基础应用&#xff0c;适合生活服务类线下商铺以及非刚需低频应用的转换。 和早期相比&#xff0c;今天小程序在产品功能、UI设计、交互体验等方面&#xff0c;越来越精…

python_day16_装饰器

装饰器基础写法 def outer(func):def inner():print("睡眠")func()print("起床")return innerdef sleep():import timeprint("睡眠中、、、")time.sleep(5)f1 outer(sleep) f1()装饰器语法糖 def outer(func):def inner():print("休息一…

Inpaint Anything: 自动化抹除视频元素

自动化抹除视频元素 不用逐帧抠图&#xff0c;直接SAM Tracking Video Inpainting就能实现自动化抹除奔跑吧idol。 https://github.com/geekyutao/Inpaint-Anything 目录 网站演示参考文献 网站 https://huggingface.co/spaces/InpaintAI/Inpaint-Anything 演示 原理就是&a…

Bert经典变体学习

ALBert ALBERT就是为了解决模型参数量大以及训练时间过长的问题。ALBERT最小的参数只有十几M, 效果要比BERT低1-2个点&#xff0c;最大的xxlarge也就200多M。可以看到在模型参数量上减少的还是非常明显的&#xff0c;但是在速度上似乎没有那么明显。最大的问题就是这种方式其实…

力扣算法递归类—(链表)两数相加

目录 2. 两数相加 题解&#xff1a; 知识点&#xff1a; 链表定义&#xff1a; 链表赋值&#xff1a; 链表题小技巧&#xff1a; 代码&#xff1a; 结果&#xff1a; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&…

idea 里 controller service impl mapper xml 切换跳转快捷键

首先在controller层&#xff0c;对着接口点方法的方法上按着ctrl和鼠标左键&#xff0c;你会进入service层。 对着方法ctrlaltb不按鼠标&#xff0c;你会进入impl层。service层的方法上按ctrl和鼠标左键会回到controller&#xff0c;ctrlaltb不按鼠标也会进入到impl层,impl上的…

0基础学习VR全景平台篇 第73篇:VR直播-如何自定义邀请二维码(直播邀请)

自定义直播邀请二维码是自定义直播间邀请卡上显示的二维码&#xff0c;若上传&#xff0c;那么便会替换掉邀请卡上原有的二维码&#xff0c;原二维码为本场直播活动的二维码。 建议上传的尺寸为300px*300px&#xff0c;可选择开启二维码的弹出效果&#xff0c;开启后&#xff0…

第三章 数据链路层

第三章 数据链路层 3.1 数据链路层的几个基本概念 数据发送模型 数据链路层主要的两种信号类型 点对点信号&#xff1a;这种信道使用一对一的点对点通信方式&#xff1b;广播信道&#xff1a;这种信道使用一对多的广播方式&#xff0c;因此过程比较复杂。广播信道上连接的主机…

管理类联考——写作——真题篇——论说文——企业管理=2011+2013+2014+2015+2016+2017+2020真题论说文

2020年探究的就是管理者做决策的时候&#xff0c;应该多听听专家的意见&#xff1b; 2017年探究的是企业在研发新产品和扩大生产之间的抉择问题&#xff1b; 2016年也可以看成企业的问题&#xff0c;就是企业组织的多样化和一致性。 2015年则说明企业在积累财富的过程中&#x…

又双叒叕被调查?竟是Elsevier旗下中科院TOP?如何避雷看这几个指标!

近期小编发现处于“On Hold”状态的期刊愈发的多了&#xff0c;总在不明所以的情况下&#xff0c;科睿唯安官网就将期刊拉入“审查”名单&#xff0c;包括前几天发现的同为Elsevier旗下的中科院TOP期刊Chemosphere &#xff08;&#x1f449;参考&#xff1a;慎投&#xff01;…

科技云报道:是时候全员FinOps了吗?

科技云报道原创。 在论坛上&#xff0c;国外某企业的真实案例引发了热议。一开始该企业只顾技术创新&#xff0c;积极上云&#xff0c;不顾成本。 直到有一天&#xff0c;高层介入喊停&#xff1a;“这个云不能再上了&#xff0c;成本已经远大于收益了”。该企业因为成本失控…