9月7日-8日,相约 2023 腾讯全球数字生态大会!聚焦产业未来发展新趋势! 了解详情
写点什么

为降低迁移风险,Etsy 从 React 转向了 Preact

  • 2022-02-09
  • 本文字数:2746 字

    阅读完需:约 9 分钟

为降低迁移风险,Etsy 从 React 转向了 Preact

关于“该用 Preact 还是 React”的争论由来已久。Preact 是 MIT 许可下的开源软件,在 GitHub 上有超过 26k 的 star,在 NPM 上每周有 1/4 百万的下载量。而源于 Facebook 的内部项目 React 在 2013 年开源后已经成为主流前端框架之一。

 

百度很久之前就要求内部全面停止使用 React / React Native,阿里内部也已经有部分业务开始试点 Preact。美国电商企业 Etsy 近日也用脚投票做出了选择。

 

高级软件工程师 Ben Sangster 宣布 Etsy 已从 React v15.6 迁移到了 Preact 10 。Preact 比 React 小得多,性能也比 React 快,Sangster 认为采用 Preact 能降低迁移大型代码库产生的风险。据悉,Etsy 大约在 2015 年左右开始使用 React。

 


我们用 Preact 替换掉了全部的 React v15.6 。这是一个巨大的胜利。与迁移到 v16 相比,迁移到 Preact 要容易得多(对旧代码的重写或重构要少得多)。

 

Sangster 表示迁移是无缝的,React v15.6 和 Preact 可以使用完全相同的 client,对于 Etsy 的开发人员来说,真正重要的改进是他们可以开始编写更现代的 React。

Preact 还是 React ?

 

Etsy 目前拥有两大主要产品栈。在面向买家的页面中,Etsy 使用的是基于 PHP 服务器的渲染方案,再配合客户端上的 jQuery/原始 JS。在面向卖家的页面时,Etsy 选择使用由 React 渲染的 SPA 再配合一点点基于服务器的 HTML 渲染,借此尽可能减少从同一 PHP 服务器端堆栈接收的数据总量。

 

相关博客文章中,Sangster 详细解释了 Etsy 迁移到 Preact 而不是最新版 React 的三个原因。

 

首先,采用 Preact 能最大程度地降低迁移风险。开发人员一般都比较喜欢React 16 的新特性(例如,error boundaries、fragments、错误堆栈跟踪、自定义 DOM 属性、React 16.8 中的 hooks),虽然 React 16.0 文档提到了一些小的重大更改,但也有不少开发人员报告了迁移的痛苦。Discord 的 Michael Greer 说:“并不是所有的 package error 都那么容易被发现,这才是真正的痛苦所在。我们遇到了一个错误,花了 2 天时间才找到对应的 library,你可能也会遇到同样的问题。”

 

对于 Etsy 来说,虽然升级到 React v16 在保障长期兼容性方面堪称最为稳妥的选项,但要求 Etsy 付出高昂的代价。在新版本中很多生命周期方法已经被弃用和重新命名,所以 Etsy 得在代码运行模块中调整这些被弃用的方法名称。虽然 Etsy 打算选择 Preact,但这些 codemods 还是要用的,只是 Preact 允许其先迁移、之后再慢慢修改。React 升级则要求把 codemods 也作为升级流程的一部分,这样登台工作和撤销操作就会变得更加困难。

 

另外,Etsy 的卖家工具中大量用到现在已被弃用的 theseus/Component helper,所以其在 React v16 中就面临着缺少生命周期方法可用的问题。另一方面,Web Toolkit 也用到不少已经弃用的生命周期方法,所以需要配合重构和回归测试才能安全完成迁移。

 

因为 FES 团队的实验架构已经明确基于 Preact,而且有意共享 Web 工具包,所以选择迁移到 React 会大大提高在 Preact 与 React 之间共享代码成果的难度。虽然这个问题最初只影响到 Web Toolkit,但后续也必然会干扰到 Etsy 检测未来卖家工具子应用架构新版本的能力(其中用到了 Preact SSR 服务)。

 

但迁移到 Preact 的话,虽然与 React 一样,Etsy 也需要完成从 React.createClass 到 create-react-class 包,以及从 React.PropTypes 到 prop-types 包的升级。但是, Preact 的 API 与 React 兼容,这意味着团队不用进行任何更改。由于 Preact 强调与 React v15 和 React v16 的兼容性,迁移到 Preact v10.4.2 将变得更加容易。从开发人员工具的角度来看,采用 Preact 似乎没有任何重大障碍。

 

Sangster 也从与现有库、现有工具、未来规划等兼容性问题上对两者进行了详细对比:

 

与现有库的兼容性问题上的对比:

 

Preact 10

React v16

Redux

Redux v3.4.0版本可能不需要变更

需要升级

React-Redux

React-Redux v4.4.5 版本可能直接兼容

需要升级

React Router

React Router v2.3.0 版本可能直接兼容

需要升级

React Router Redux

React Router Redux v4.0.5 版本可能直接兼容

此库不再受支持,需要替代方案

 

与现有工具的兼容性问题上的对比:

 

 

Preact 10

React v16

Yarn/NPM版本控制

如果把React从package.json中完全删除,那安装过程中Yarn可能会输出警告。但问题不大

 

Jest / Enzyme

测试接口可能会给出React测试中不存在的一些冒泡问题

似乎没有产生严重的兼容性/破坏性变更

Jest / Unitcards

不太清楚,还需要进一步测试

预计不用考虑

开发工具

Preact拥有自己的浏览器扩展(注意,不是React扩展),但也提供类似的调试功能和性能监控选项

升级至React v16将在React开发工具扩展中带来一系列重要的性能测试新功能。

 

与未来规划的兼容性问题上的对比:

 

 

Preact 10

React v16

TypeScript支持

还没发现具体问题

React团队已经在投入资源,开发对TypeScript的支持功能

Suspense支持

对SSR Suspense的真正支持可能要求Etsy 对代码库进行大规模重写

其内部工具已经实现了Suspense的大部分功能,完全迁移到Suspense会很麻烦,对其的审查和维护也相当困难和耗时

GraphQL

取决于架构试验效果,但无法保证支持的全面适用

取决于架构试验效果

 

其次,Etsy 的前端系统团队已经在使用 Preact。在 Etsy 中统一使用 Preact 可能会使开发人员的生活更轻松。

 

Sangster 介绍,FES 团队(Etsy 的前端系统团队)的新项目架构已经基于 Preact,这并没有带来兼容性方面的问题。同时,还统一了 Etsy 内部使用的 Preact/React 库,随时间推移大大降低了开发者的工作难度。同时在 React 和 Preact 中支持/测试 Web Toolkit 等工具必定会增加 FES 团队及其他同事的工作负担,导致团队很难实现全面的工具与架构共享。在 Preact 成为整个 Etsy 中的唯一标准后,这类问题也就随之消失了。

 

最后,Preact 的包大小(Preact v10.4.5 为 4KB)比 React 的小六倍(React v16.13.1 添加 react 和 react-dom 之后为 38.5KB)。JavaScript 体量越大,延迟 (time to interactive)也就越大,消耗的内存和 CPU 也会越大。

 

Sangster 进行了简单的对比,需要注意的是,下面列出的数字并不包括三种库都具有的包的大小——例如 prop-types or create-react-class。各包大小均取 Bundlephobia 上的最小值,且皆为 gzip 格式。

 

 

React v15.6.2

React v16.13.1

Preact v10.4.5

react

21.4KB / 7.1KB

6.3KB / 2.6KB

 

react-dom

121.4KB / 36.6KB

114.6KB / 35.9KB

 

preact

 

 

10.1KB / 4KB

preact/compat

 

 

未知 / 2KB (并未找到preact/compat的最小体积)

总计

142.8KB / 43.7KB

120.9KB / 38.5KB

? / 6KB

 

可以看出,从 v15.6.2 升级至 v16.13.1 能在 gzip 格式下节约 5.2 KB 空间,而从 v15.6.2 升级至 Preact v10.4.5 则能在 gzip 格式下节约 37 KB 空间,因此,使用 Preact v10.4.5 替代 React v16.13.1 能在 gzip 格式下节约 32.5 KB 空间。

 

Sangster 强调说:“我们有很多古老的‘无主’代码和很多旧的库,升级到 React 16 会导致一些 API 问题(尤其是 Portals/legacy Context/refs),需要做大量的工作才能够解决。相反,我们迁移到 Preact,可以将代码重构为可用的、最现代的东西,而不需要去做同步升级组件/库这些事情。”

 

迁移计划

 

在假设所有库的兼容性都跟前文中预测的一致,而且 Preact 的兼容性也不出意外问题的情况下,Etsy 的整个迁移流程将如下所示:

 

  1. 先切换、再升级至 Preact v10.4.5,这样我们就能在 Preact 与 React 两种渲染驱动方案之间往来切换以验证迁移效果。

  2. 使用 codemods 以迁移至“现代”React 生命周期方法(不算是硬性要求,因为 Preact 也完全能够支持同一 API 的两个版本,但我们觉得这是个很好的长期发展目标)。

  3. 彻底移除 react-router-redux (可以在 Preact 迁移的同时并行完成)。

  4. 将 react-redux 升级至 7.2.0 版本(可能还涉及升级 redux)。

  5. 将 react-router 升级至 5.2.0 版本(也可能要升级到 6.x 版本,具体取决于 5.2.0 版本够不够稳定)。

 

目前,Etsy 的迁移工作卡在了移除 React.PropType 和 React.createClass 这一步,因为 Web 平台团队对 ESM 语法进行了升级。

 

整个迁移过程中的挑战在于,大部分工作都很复杂,即使是单行/upgrade 也可能需要大量时间。其次,react-router 上的重大变更也要求 Etsy 对卖方工具中的子应用架构做出侵入性的调整,用以重新设计加载/路由的方式。另外,移除 react-router-redux 的工作量也不小,不过好在这几项任务还算相对独立、互不影响。

 

查看更多:

 

https://github.com/mq2thez/blog/blob/main/upgrade-react-etsy/preact-vs-react.md

活动推荐:

2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。

2022-02-09 18:299383

评论

发布
暂无评论
发现更多内容

公司来了一个腾讯做优化的大佬,三下五除二让我程序快了200%

做梦都在改BUG

Java 性能优化 JVM 性能调优

世界顶级级架构师编写2580页DDD领域驱动设计笔记,属实有牌面

Java你猿哥

Java 领域驱动设计 DDD crud 领域驱动

极光笔记 | EngageLab Push的多时区解决方案

极光JIGUANG

运营 消息推送 笔记分享 海外

2023-05-26:golang关于垃圾回收和析构函数的选择题,多数人会选错。

福大大架构师每日一题

golang 福大大

Vue3 修改项目名称及相关信息

Andy

不止缓存!Redis这16种妙用你可能没见识过……

Java你猿哥

redis 缓存 分布式 消息队列 全局唯一ID

Auto-GPT 迈向智能体的第一步——从信息增强和上下文理解开始

Zilliz

Milvus 向量数据库 autogpt gptcache zillizcloud

设计模式之订阅发布模式

越长大越悲伤

设计模式 发布订阅模式 spring boot3 订阅发布

Go 语言 map 如何顺序读取?

AlwaysBeta

Go 面试 map

CMake vs Makefile: 如何选择适合你的项目构建工具

小万哥

Linux 程序员 C/C++ 后端开发 cmake

牧云 • 主机管理助手|正式开放应用市场,梦幻联动雷池WAF等多款开源软件

百川云开发者

云计算 防火墙 云主机 waf 主机管理

神册!出自阿里P8的深入理解Java虚拟机最新版,让我涨薪60%

Java你猿哥

Java JVM 虚拟机 并发 代码优化

MySQL 正确使用带有横线“-”SQL语句

Andy

PoseiSwap 参赛,参与斯坦福、Nautilus等联合主办的 Hackathon 活动

西柚子

Go 语言 map 是并发安全的吗?

AlwaysBeta

Go 面试 map

PoseiSwap 参赛,参与斯坦福、Nautilus等联合主办的 Hackathon 活动

石头财经

改变开发的未来 | 探索无服务器与人工智能的协同效应

亚马逊云科技 (Amazon Web Services)

Serverless

数字化转型应该如何去做?(敏捷思维篇)

数字随行

数字化转型

PoseiSwap 参赛,参与斯坦福、Nautilus等联合主办的 Hackathon 活动

BlockChain先知

聊聊技术变现这件事

老张

斜杠青年 技术变现 技术咨询

AIGC背后的技术分析 | 机器学习背后的微分入门

TiAmo

机器学习 AIGC

mac端摄影师青睐软件:ON1 Photo RAW 2023.5 中文激活版

真大的脸盆

Mac Mac 软件 图像编辑 编辑图像 照片编辑

Zebec生态进展迅速,频被BitFlow、Matryx DAO等蹭热度碰瓷

鳄鱼视界

PoseiSwap  参赛,参与斯坦福、Nautilus等联合主办的 Hackathon

EOSdreamer111

Django笔记三十七之多数据库操作(补充版)

Hunter熊

Python django 多数据库

C语言编程—作用域规则

向阳逐梦

关于斐波那契数列的笔记

贝湖光

Github星标88.8k,阿里新产的Spring Cloud进阶小册!面面俱到

Java你猿哥

Java 架构 微服务 微服务架构 Spring Cloud

线程是如何通讯的?

Java你猿哥

Java 线程 多线程 ssm 通讯

PoseiSwap  参赛,参与斯坦福、Nautilus等联合主办的 Hackathon 活动

鳄鱼视界

PoseiSwap  参赛,参与斯坦福、Nautilus Chain等联合主办的 Hackathon 活动

股市老人

  • 扫码添加小助手
    领取最新资料包
为降低迁移风险,Etsy 从 React 转向了 Preact_大前端_Tina_InfoQ精选文章