前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >基于AST技术的Taro框架升级方案

基于AST技术的Taro框架升级方案

作者头像
QQ音乐技术团队
发布于 2024-01-04 00:39:02
发布于 2024-01-04 00:39:02
4090
举报

1、项目背景

音乐人小程序初版于2019年8月上线,当时做开发框架选型时,Taro 由于支持小程序、H5两端同构及类 React 语法等特性,比较契合团队当时的诉求,最终选择 Taro(版本1.3.4)作为主框架开发音乐人小程序。

随着 Taro 的主版本升级至3.x,Taro 1/2官方不再进行维护,目前使用的1.3.4版本在开发体验上跟3.x版本存在较大的不足,主要体现在以下几点:

  • Taro 1.x 版本遵循 React 语法规范实现的 Nerv 框架跟 React 在 jsx 语法差异,新特性不支持
  • 部分小程序官方提供的API不支持
  • Taro 全家桶,依赖升级困难
  • Taro 自研构建工具,编译慢,黑盒

2、预期收益

  • 改善开发体验:完全支持 React 18新版本语法特性,减少开发心智负担,编译时间提升明显,热更新速度达到秒级。
  • 提升页面性能:页面运行流畅度及加载速度方面都有一定的提升。
  • 提高可维护性:Taro 新版本issue处理活跃,生态丰富,文档完善,对项目质量更有保障。

3、升级方式对比

3.1 人工方式

先是梳理 Taro 新旧版本差异,然后对每个文件进行分别处理,这种方式费时费力不说,人工很容易遗漏文件及处理事宜,如果页面众多,风险很大。其次这种大工程一般多人协作参与,很容易出现代码冲突及重复建设问题。

3.2 程序升级方式

先梳理 Taro 新旧版本差异,然后针对这些差异制定不同的处理策略,对于语法特性及配置层面的差异我们通过抽象语法树(AST)来进行转换,这种方式能够面面俱到处理每一个文件,即使发现遗漏的事项,只要优化下升级程序就好。当然有些差异点旁路逻辑太多,程序处理本身编码就很复杂,这块考虑 ROI 也可程序升级完成后人工再介入处理下。

4、Taro 1.x与Taro 3.x差异及处理策略

4.1 npm 依赖

  • Taro3 核心依赖,需要升级到目标版本 3.5.12
  • Taro3 新引入的依赖(react/构建相关)
  • Taro3 需要删除过期依赖
  • Taro-ui 升级

处理:通过脚本读取package.json,并对当前依赖逐行与差异依赖进行版本比对,执行相应的新增、修改、删除等操作,最终写入文件覆盖package.json。

4.2 相关类库、模块

  • 相关模块从 Taro 切换到 React,含 ts 类型(useEffect、useState、useMemo、useCallback、useRef、Component、FunctionComponent、FC、PropsWithChildren、SFC、PureComponent、ComponentClass)
  • @tarojs/redux 转成 react-redux,dispatch的写法也有所差异,需要同时处理

处理:通过把对应文件解析成 AST,遇到MemberExpression、ImportDeclaration、TSQualifiedName 等节点访问器时,进行相应的模块名称替换,若有新添加的模块或者不再需要的模块引用,需要对该模块添加导入或者删除导入操作,这部分也是复杂度最高环节之一。

下图是一个普通函数组件处理前后语法的变化:

要完成上面的转换,主要需要导入 react,然后相关 api 引用由 Taro 改成 react。可以通过 ImportSpecifier 节点访问器获取 Taro 对象引用的变量名称,通过 node.imported.name 进行匹配。

如果文件本身有引入 react ,则添加对应引用就行,如无则继续导入。直接通过 Taro 对象访问的变量则通过 MemberExpression 访问器直接将父对象改成 react 即可,代码具体实现如下:

4.3 项目文件结构

  • Taro3 (除小程序自定义组件外)不再支持Component config的写法,需要单独作为配置文件存在
  • Taro3 (除小程序自定义组件外)不再支持Component options的写法,需要删除

处理:通过把对应文件解析成 AST,遇到MemberExpression、ClassMethod、ClassProperty标记时。将对应的节点内容转化为代码,新建为配置文件,再删除旧标记节点。

4.4 样式

  • Taro3 不再支持小程序的原生样式隔离方式,所有样式文件统一被抽离到 app.wxss 中,原来的样式隔离会失效

处理:通过把对应文件解析成 AST,遇到 JSXAttribute 且属性名为 className 时,替换成css module引用方式,由于 className 的赋值语法多样(如下图)。

我们需要考虑多种场景,还有部分css是外部引入样式,本身找不到,需要向上查找,样式处理部分也是复杂度最高环节之一。

4.5 相关内置api

  • Taro3 不再支持 this.routerthis.scope、useScope 等写法去获取路由、小程序实例等信息
  • Taro3 不再支持 组件级别的componentDidShow、componentDidHide事件,需要手动进行处理

处理:通过把对应文件解析成 AST,遇到MemberExpression、ClassProperty标记时,将对应的节点内容转化为代码。

4.6 构建配置及其他

  • Taro3整体的配置文件的字段也有所调整。主要范围在webpack、babel、scss、react等相关
  • Taro3 会模拟 全局window 对象,因此原来依靠 typeof window === 'undefined' 来判断是否是web环境会失效

处理:由于配置的修改相对于是一次性的行为,人工直接进行修改即可。

5、基于AST实现自动升级方案原理解析

如下是一个源文件转换成AST,进行二次处理,最终又变成源代码文件的过程。

主要依赖babel库:

整体转换工具处理流程:

Taro 项目代码命令行工具执行入口主要是 app.tsx 及 app.config.js,具体执行流程见下图。

我们以 app.tsx 举例,首先通过@babel/parser将源代码转成AST,然后通过@babel/parser遍历 AST 的节点访问器。

针对上面2中的区别我们封装了多个独立处理单元,每个处理单元功能都是原子化的,负责具体某个功能的转换,它由多个 AST 节点访问器组成。

例如对于 Taro 1.x版本中使用的 taro-ui 组件,在新版本中需要使用 CustomWrapper 组件进行包裹下,不然会导致组件不可见,具体实现如下:

对于整个命令行工具执行过程中,我们还开发了一个日志模块收集相关处理信息,并能生成html预览页,便于代码转换成功后人工进行check。

相关信息如下,其中未被引用到的文件清单给开发删除项目冗余文件提供了指引,人工确认代码文件主要是对className的处理,例如有些在全局及相关css中都没找到,有些2者都有等等,这块需要人工确认处理。

6、项目总结及规划

基于 AST 的升级方案相较于纯人工方案优势明显,沉淀的命令行工具将来可贡献给 Taro 社区提供类似场景通用解决方案。

当然 AST 升级方案挑战也很多,工作量不小,开发过程中需要不断查阅文档反复调试,对个人而言也是深入研究该领域、扩展技术视野的好机会。

AST技术在业界使用广泛,小程序升级项目更多是进行代码变更等操作,我们团队对AST技术的运用也在持续探索,最近在尝试使用AST对代码改动进行分析,获取函数、变量之间的引用关系,最终得到一个代码改动对业务影响范围的报告,大家可期待后续相关分享。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯音乐技术团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Taro3 不使用 TypeScript 的情况下使用 taro-ui 时报错
最近有个小程序的项目,用 taro3 脚手架创建了项目,在组件里引入了 taro-ui 的组件之后,执行 yarn dev:weapp 一直报错,报错内容是无法识别 taro-ui 里面的 ts 语法
小鑫
2022/04/26
1.1K0
Taro3.2 适配 React Native 之运行时架构详解
由 58 前端团队主导的 Taro 3 适配 React Native 工作已完成有一段时间了。目前发布了多个体验版,也将在3月底迎来正式版。基于 Taro 的良好架构演变,适配 React Native 的方案的也做了较大调整,本文将主要介绍 Taro 3 适配 React Native 运行时相关的详细设计与实现。
PHP开发工程师
2021/05/24
2.7K0
Taro3.2 适配 React Native 之运行时架构详解
探索Taro:跨平台开发的实践与原理
在如今不断增长的小程序市场中,小程序的数量迅速增多。这是因为小程序具有诸多优势,例如轻量化、便捷性和良好的用户体验,吸引了越来越多的开发者和企业加入这一领域。随着小程序的普及,各个行业都纷纷推出自己的小程序,以满足用户的多样化需求。
政采云前端团队
2023/12/13
1.4K0
探索Taro:跨平台开发的实践与原理
小程序开发效率提升神兽:京东Taro诞生记
自 2017-1-9 微信小程序(以下简称小程序)诞生以来,就伴随着赞誉与争议不断。从发布上线时的不被大多数人看好,到如今的逐渐火热,甚至说是如日中天也不为过,小程序用时间与实践证明了自己的价值。同时于开发者来说,小程序的生态不断在完善,许多的坑已被踩平,虽然还是存在一些令人诟病的问题,但已经足见微信的诚意了。这个时候要是还没有上手把玩过小程序,就显得非常OUT了。
京东技术
2018/07/30
9250
小程序开发效率提升神兽:京东Taro诞生记
Taro 助力京喜拼拼项目性能体验优化
2020 年是社区团购风起云涌的一年,互联网大厂纷纷抓紧一分一秒跑步进场。“京喜拼拼”(微信搜京喜拼拼)是京东旗下的社区团购平台,依托京东供应链体系,精选低价好货,为社区用户提供次日达等优质服务。
winty
2021/03/09
1.1K0
Taro
一种多端代码转换方案,这里的“端”是指微信小程序、Web、ReactNative、百度小程序、支付宝小程序、头条小程序、快应用等等
ayqy贾杰
2019/06/12
1.7K0
Taro
taro自学笔记:从零开始搞多小程序开发
用于判断当前编译类型,目前有 weapp / swan / alipay / h5 / rn / tt / qq / quickapp 八个取值,可以通过这个变量来书写对应一些不同环境下的代码,在编译时会将不属于当前编译类型的代码去掉,只保留当前编译类型下的代码,例如想在微信小程序和 H5 端分别引用不同资源
周陆军博客
2023/05/14
7120
干货 | Taro 开发微信小程序入门与实战
如果你是 Vue 开发者,但又不想过多的折腾,继续沿用 Vue 的开发方式来开发小程序,那么用 mpvue 将会是你的最明智的选择。同时也支持一些第三方 UI 库,这就给一些需要讲求速度的小程序开发者提供了便利。mpvue 2.0 在 微信小程序 的基础上增加了对 百度智能小程序、头条小程序 和 支付宝小程序 的支持。
极乐君
2019/11/21
1.4K0
干货 | Taro 开发微信小程序入门与实战
GitHub Star数超2万的开源框架帮你轻松构建跨端应用
本文根据京东高级前端开发工程师朱天健在2019年软件绿色联盟开发者大会发表的《使用Taro构建跨端应用》主题演讲整理而成,为大家带来Taro框架的背景介绍、快速上手、样例解析和开发生态等内容分享。
软件绿色联盟
2022/03/31
6110
GitHub Star数超2万的开源框架帮你轻松构建跨端应用
多端统一开发框架 Taro 1.0 正式发布
Taro 是一个多端统一开发框架,它支持使用 React 的开发方式来编写可以同时在微信小程序、Web 、React Native 等多个平台上运行的应用,帮助开发者提升开发效率,改善开发体验,降低多端研发成本。
花叔
2018/11/06
1.1K0
Taro 支持使用 Vue3 开发小程序
9 月 19 日凌晨,Vue3 在经过多个开发版本的迭代后,终于迎来了它的正式版本,"One Piece" 的代号也昭示了其开拓伟大航路的野心。
一只图雀
2020/11/03
2.6K0
Taro 支持使用 Vue3 开发小程序
携程跨端解决方案的新选择:Taro-CRN
随着小程序用户的增长,APP和小程序在需求迭代上呈齐头并进的趋势。与此同时,前端研发人员面对多套平台代码的维护与开发,研发投入上耗时耗力。目前携程内部急需一种跨平台的开发框架,来节约不必要的多套开发量。
携程技术
2023/02/28
8960
携程跨端解决方案的新选择:Taro-CRN
从 wepy 到 uniapp 变形记
进入互联网“下半场”,靠“人海战术”的研发模式已经不再具备竞争力,如何通过技术升级提升研发效能?前端通过Babel等编译技术发展实现了工程化体系升级,如何进一步通过编译技术赋能前端开发?或许我们 wepy 到uniapp 编译的转换实践,能给你带来启发。
2020labs小助手
2022/10/31
5870
使用 Taro 开发鸿蒙原生应用 —— 探秘适配鸿蒙 ArkTS 的工作原理
在上一篇文章中,我们已经了解到华为即将发布的鸿蒙操作系统《纯血版本——鸿蒙 Next》,以及各个互联网厂商开展鸿蒙应用开发的消息。其中,Taro作为一个重要的前端开发框架,也积极适配鸿蒙的新一代语言框架 —— ArkTS。
winty
2023/12/12
1.9K0
使用 Taro 开发鸿蒙原生应用 —— 探秘适配鸿蒙 ArkTS 的工作原理
干货 | 携程门票H5转小程序实践
自微信小程序出来后,互联网进入一个新的纪元。由于手机的容量有限,每个人不可能装太多APP ,总有一些APP大家都装,称之为超级APP,它们集成越来越多的功能,其中以小程序尤为突出。小程序巨大的流量红利不容小视,这也是小程序越来越火的部分原因。
携程技术
2021/07/22
1.8K0
Taro小程序跨端开发入门实战
随着业务不断扩张以及大小程序平台的崛起,针对每个平台都去写一套代码是不现实的,且原生的小程序开发模式有很多弊端。为了让小程序开发更简单、高效,采用Taro作为首选框架,本文将分享Taro的实践经验,主要内容围绕什么是Taro以及Taro如何使用(正确使用的姿势),还有Taro背后的一些设计思想来展开,让读者能够对Taro有较为完整的认识。Taro3.0已经逐渐成熟,实践项目已经进行Taro3.0的升级,因此本文代码示例以Taro3.0作为基础。
京东技术
2021/09/24
1.7K0
Taro小程序跨端开发入门实战
Taro及Taro-UI从入门到放弃
Taro是京东旗下的跨端开发框架,功能非常强大,支持React/Vue/Nerv进行小程序,H5,甚至是RN应用。
terrence386
2022/07/15
2.8K0
Taro及Taro-UI从入门到放弃
Taro 小程序开发大型实战(二):多页面跳转和 Taro UI 组件库
在上一篇教程[1]中,我们用熟悉的 React 和 Hooks 搞定了“奥特曼俱乐部”的雏形。在这一篇文章中,我们将用 Taro 自带的路由功能实现多页面跳转,并用 Taro UI 组件库升级之前略显简陋的界面。这一篇完成后的 DEMO 如下:
一只图雀
2020/04/07
3.2K0
干货 | 携程Taro多端化探索与实践
随着移动互联网和智能设备的普及,前端开发人员需要采用多端同构技术来适配不同的终端(小程序、App和Web)。这些终端之间存在着明显的差异,包括浏览器引擎、操作系统、交互方式以及代码语言等方面。
携程技术
2023/09/06
1.3K0
干货 | 携程Taro多端化探索与实践
Taro | 高性能小程序的最佳实践
Tech 导读 Taro作为开放式跨端跨框架解决方案,在大量小程序和H5应用中得到广泛实践,本文将为读者提供最佳实践示例,以帮助最大程度地提升小程序应用的性能表现。
京东技术
2023/12/26
6230
Taro | 高性能小程序的最佳实践
推荐阅读
相关推荐
Taro3 不使用 TypeScript 的情况下使用 taro-ui 时报错
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档