2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

消费者端微组件的实现

  • 2020-09-17
  • 本文字数:1727 字

    阅读完需:约 6 分钟

消费者端微组件的实现

一、背景

在消费者端,为了方便各条业务线接入,我们通常以组件的方式提供功能,但是组件的发布必须依赖于页面的发布,页面发布又通常需要业务方统一操作,比较影响组件的迭代速度。


经过一段时间的探索和开发,我们实现了一种可以让组件独立发布的异步方案,具备以下特点:


  • 组件级别解耦,独立版本控制

  • 组件单独发布,支持灰度、秒级回滚以及平滑升降级

  • 不影响现有的开发测试流程


下面我介绍一下我们的方案。

二、概述

一句话概括:将组件独立打包成 UMD 格式的 js 文件,页面加载时通过动态生成 script 插入该 js,插入完成后渲染组件。


组件单独打包是异步组件实现的基础,动态获取 js 能实时地获取最新版本,再结合组件动态切换可以实现组件的升降级。


异步组件方案核心功能通过消费者端组件、Node 端插件和打包服务三部分来实现:


  • 组件 Vue-Components-Injector —— 负责 h5 端异步组件的注入,动态渲染和降级,提高异步组件的稳定性。

  • Node 端插件 Apollo-Dynamic-Components —— 使用分布式配置中心 Apollo 处理配置的分发,实现实时组件灰度切流和版本迭代。

  • 打包中心 —— 负责将组件源码打包成浏览器可立即执行的 UMD 代码,保障代码的兼容性。


使用异步组件的流程:


  1. 使用打包工具将组件源代码独立打包成 UMD 代码并上传到 CDN

  2. 修改组件配置,包含代码地址、版本、灰度比例以及降级版本等信息

  3. 页面请求 Node 时,Apollo-Dynamic-Components 插件会根据配置,返回页面需要的异步组件信息并放入全局变量内

  4. 页面加载时,从全局变量获取异步组件信息,并告诉 Vue-Components-Injector 要使用哪个异步组件以及异步组件的变量名

  5. Vue-Components-Injector 构建 script 标签,加载 js 挂载组件并渲染


具体思路如下图所示:


三、具体分析

3.1 组件代码独立打包

首先我们需要将原本 ESM 或者 CJS 的组件打包成 UMD 规范或者 IIFE 的形式。


打包配置可以根据每个组件的内容和使用方法单独配置,不需要修改代码,所以组件依然可以通过 NPM 的方式引入。


打包完成后,为了加快文件的下载速度,通过脚本将文件上传到 cdn 服务器,然后将返回的 cdn 地址同步到配置中心。这样我们就完成了组件打包层面的解耦,将组件打包流程从项目打包中独立出来。


这里有一个优化点,可以把一些公共的依赖排除在外,使用时在项目中配置组件的外部依赖,不过需要注意该组件依赖的版本和项目中依赖的版本是否兼容。


3.2 Node 端获取组件配置

Node 端收到页面请求后,获取当前组件在配置中心包含灰度切流比例和 A/B 版本信息的配置内容,A/B 版本的使用会在组件动态切换中详细介绍。


每次请求都会获取最新的异步组件配置,所以配置更新时能够第一时间在线上生效,异步组件的发布和秒级回滚都依赖这个特性。这个功能我们通过插件的方式来实现,保证业务代码的足够精简、稳定,使用也方便。


Apollo 使用分布式部署,可用性高且能实时更新配置,同时也可以在开发、测试、生产等环境分别部署运行,对开发很友好。

3.3 加载异步组件

为了进一步提高异步组件的加载速度、减少请求次数和耗时,我们将异步组件配置在 node 层返回 html 模版的时候注入。整个流程分为 4 步:


  • vue-components-injector 获取配置

  • 生成 script 标签并插入到页面中,加载脚本

  • 监听 js onload 事件,加载成功后调用回调函数

  • 执行组件挂载


3.4 组件动态切换

线上的稳定性非常重要,当异步组件地址获取异常、加载异常、没有命中切流或其他异常情况发生时,vue-components-injector 会立刻根据配置策略动态切换到其他版本或使用 NPM 引入的原组件,保证异步组件在极端情况下的可用性。


组件升级也是经常出现问题的地方,我们可以通过配置 A/B 版本信息并结合百分比切流来实现组件版本稳定升级。


例如 我们将 A 版本设置为当前版本的 js 地址,B 版本配置为将要发布的新版本,将流量通过修改灰度比例逐步切换到 B 版本,如果遇到异常情况,可以通过修改组件配置立刻切回 A 版本。

四、效果

最近我们陆续将交易下单页中的储值卡和收银台的引入方式替换为异步组件加载,得益于我们比较充分的准备,替换过程比较顺利,上线之后也比较稳定,达到了预期的目标。


后续我们会简化异步组件的接入流程,扩大接入范围,优化有赞消费者端用户体验。


本文转载自公众号有赞 coder(ID:youzan_coder)。


原文链接


消费者端微组件的实现


2020-09-17 10:001914

评论 1 条评论

发布
用户头像
请问一下,现在的有赞商家后台 https://www.youzan.com/v4/dashboard 用的就是这个方案吗?
2021-09-06 16:21
回复
没有更多了
发现更多内容

恒源云(GpuShare)_训练指引

恒源云

深度学习

微信业务架构图 & 学生管理系统架构设计

Steven

架构实战营

告别传统压测:全链路压测在中通的实践分享

TakinTalks稳定性社区

全链路压测 系统稳定高可用 性能压测 电商大促 系统保障

微信的业务架构图

张平

架构实战营

阿里JAVA架构师面试136题含答案:JVM+spring+分布式+并发编程!

Java 编程 程序员 面试

首例“微服务+国产分布式数据库”架构,TDSQL助力昆山农商行换“心”

腾讯云数据库

数据库 tdsql

移动CRM软件是销售人员必备办公工具

低代码小观

管理 软件 移动 CRM CRM系统

农业CRM系统帮助建设新农村和休闲农业

低代码小观

系统 CRM 农业 管理工具 农业管理

微信业务架构图和学生管理系统架构

Geek_cb2b43

5G、元宇宙和被重新定义的社交出海

融云 RongCloud

如何轻松集成多厂家推送服务

融云 RongCloud

消息推送

新里程碑!TDSQL金融核心系统客户数国内领先

腾讯云数据库

tdsql

按照网络规模来分,服务器分为哪几类?

行云管家

云计算 网络 服务器 IT运维

Requires: libc.so.6(GLIBC_2.14)(64bit)错误解决方法

杨清强

「The Data Way」1024 特别节目|一线工程师的开源路

SphereEx

开源 开源社区 开源青年

TDSQL助力建设数字政务

腾讯云数据库

数据库 tdsql

腾讯云数据库TDSQL PG版重磅升级:查询性能提升百倍

腾讯云数据库

tdsql

美团的动态线程池,不依赖中间件可以实现么?

马丁玩编程

Spring Boot ThreadPoolExecutor

模块一作业

doublechun

「架构实战营」

从小公司到大厂,从8K到30K-一个iOS开发的艰辛路程

iOSer

ios iOS面试

【活动报名】首次 「Apache ShardingSphere Dev Meetup 」期待你的参与!

SphereEx

开源 ShardingSphere 技术沙龙 Meetup SphereEx

徐州等保测评公司有哪些?联系电话是多少?在哪里?

行云管家

网络安全 等级保护 过等保 徐州

你分库分表的姿势对么?——详谈水平分库分表

vivo互联网技术

MySQL 分库分表 hash Range 数据库表

Java面试过了京东五面之后,发现掌握了这些技术也没有那么难

Java 编程 程序员 面试

TDSQL:解锁数据库前沿技术要点 | 腾讯云数据库DTCC 2021亮点回顾

腾讯云数据库

tdsql

低代码平台的爆火,会导致程序员失业吗?

J2PaaS低代码平台

低代码 低代码开发 低代码平台

Java ArrayList 与 LinkedList

码界行者

Java

明道云在建筑工程行业的应用场景

明道云

实时通信全链路质量追踪与指标体系构建

融云 RongCloud

通信云 Qoe

你的 APP 能否精准「推送」击中用户?!

融云 RongCloud

消息推送 双十一

浅谈云上攻防——CVE-2020-8562漏洞为k8s带来的安全挑战

腾讯安全云鼎实验室

漏洞分析

消费者端微组件的实现_软件工程_吴鹏飞_InfoQ精选文章