Taro 3.1 beta 发布: 开放式架构新增 4 端支持

作者:凹凸曼-JJ
自 7 月初我们正式发布了 Taro 3,至今半年时间已然略去。期间我们不断地修复着问题,同时也在构想着下一个 minor 版本。
面对小程序平台越来越多的大环境,Taro 是选择偏安一隅,只支持部分的主流小程序,还是成为所有小程序平台开发、多端转换的基础设施,我们在 v3.1 给出了答案:开放式架构。
一、开放式架构
背景
近年来业界推出的小程序平台越来越多,但 Taro 核心维护的平台只有 6 个(微信、支付宝、百度、头条、QQ、京东小程序),因此常常有同学提出能不能支持某某平台的 Feature Request。
基于目前的架构,对于单一平台的兼容性代码分布于 Taro 核心库的各个角落,涉及编译时与运行时等部分。支持一个新的平台需要改动所有的这些地方,开发复杂度高,同时社区也难以参与贡献。
为此我们萌生了打造一个开放式框架的想法。目标是可以通过插件的形式扩展 Taro 的端平台支持能力:
- 插件开发者无需修改 Taro 核心库代码,即可编写出一个端平台插件。
- 插件使用者只需安装、配置端平台插件,即可把代码编译到指定平台。
- 开发者可以继承现有的端平台插件,然后对平台的适配逻辑进行自定义。
端平台插件架构图

Taro 基于开放式架构的改动
1. 同步了小程序最新特性
我们把内置支持的 6 个平台封装成了插件,CLI 默认会全部加载这些插件。封装的过程中,我们检索了各小程序最新的组件、API,并全数进行更新与支持,对齐各小程序最新的能力。
2. 新增支持转换的平台
借助开放式架构,我们编写了若干端平台插件,开发者安装后即可使用:
- 企业微信插件:@tarojs/plugin-platform-weapp-qy
- 钉钉小程序插件:@tarojs/plugin-platform-alipay-dd
- 支付宝 IOT 小程序插件:@tarojs/plugin-platform-alipay-iot
- 快手小程序插件(体验版):@tarojs/plugin-platform-kwai
对开发者的影响
没有影响,改动属于 Taro 内部架构重构,不会影响开发者使用。
还可以做什么有意思的事
除了扩展新的编译平台,我们还可以通过继承于现有的端平台插件,来编写自定义的端平台插件,对平台的适配逻辑进行自定义:
如何编写端平台插件:文档地址
1. 快速修复问题
由于小程序平台众多,而且它们也在不断地迭代,往往会出现 Taro 对某个小程序新推出的组件或 API 支持不及时的问题。这时开发者首先需要联系 Taro 团队,再等待我们跟进修复、发布新版本后才能正常使用,平均需要等待一周或两周的时间才能得到解决。
而基于开放式架构,开发者能够通过继承某个端平台插件,迅速开发出自定义端平台插件,完成对这些新组件或 API 的支持,无需等待 Taro 发布版本。
为微信小程序拓展 API 的例子:
- 运行时注入 API:
/** plugin/apis.ts */
export function initNativeApi (taro) {
// 挂载额外 API:Taro.xxx()
taro.xxx = function () {}
}
/** plugin/runtime.ts */
import { mergeReconciler } from '@tarojs/shared'
import { initNativeApi } from './apis'
// 把 initNativeApi 合并到 reconciler 中。
// 这样可以侵入 Taro 运行时并修改 Taro 对象,达到增加 API 的目的
mergeReconciler({
initNativeApi
})
- 端平台插件入口:
/** plugin/program.ts */
import { Weapp } from '@tarojs/plugin-platform-weapp'
// 继承微信小程序
export default class Example extends Weapp {
platform = 'example'
// 步骤 1 中,runtime 文件的路径
runtimePath = `@tarojs/plugin-platform-example/dist/runtime`
}
/** plugin/index.ts */
import Example from './program'
import type { IPluginContext } from '@tarojs/service'
export default (ctx: IPluginContext) => {
ctx.registerPlatform({
name: 'example',
useConfigName: 'mini',
async fn ({ config }) {
const program = new Example(ctx, config)
program.start()
}
})
}
2. 属性精简
因为小程序组件的属性和事件都必须静态写死,不可以动态添加,所以 Taro 会把组件的所有属性和事件全部在模板里提前进行绑定。
但实际项目中很多情况下并不会使用到组件的所有属性和事件,循环这些冗余的属性和事件绑定也会占据很大一部分的体积,另外太多的事件绑定也会在一定程度上降低小程序的性能。
以下是 View 组件模板的伪代码:
<template name="tmpl_0_view">
<view
hover-class="..."
hover-stop-propagation="..."
hover-start-time="..."
hover-stay-time="..."
animation="..."
onTouchStart="..."
onTouchMove="..."
onTouchEnd="..."
onTouchCancel="..."
onLongTap="..."
onAnimationStart="..."
onAnimationIteration="..."
onAnimationEnd="..."
onTransitionEnd="..."
disable-scroll="..."
hidden="..."
onAppear="..."
onDisappear="..."
onFirstAppear="..."
style="..."
class="..."
onTap="..."
id="..."
>
...
</view>
</template>
Taro 需要把 View 组件的所有属性和事件提前进行绑定,才能满足不同开发者的使用需求。但可能对于某位开发者来说,整个项目的 View 组件都没有使用到 hover-stop-propagation 这个属性,那么则可以考虑把它精简掉,不编译到 View 组件的模板当中。
需要注意的是,对属性的精简可能会引起不必要的问题、使项目的维护变得困难,特别当项目变大,开发者众多时,需要谨慎设计和使用。
二、重要问题修复
v3.1 除了包括开放式架构的调整外,也不忘巩固核心。以下是 v3.1 对重要问题的修复情况,有一些在 v3.0 的 patch 版本已经推出,一些则是 v3.1 中才推出,均予以列出:
1. [Breaking Change]修复 Vue 中 App 生命周期被调用两次的问题
注意,此修复含有【Breaking Change】,如果你正在把 Vue 项目从 v3.0 升级到 v3.1,需要对入口组件进行如下修改:
// app.js
// v3.0
// Taro 运行时内部本来就会调用一次 new Vue,
// 用户的入口组件多调用一次的话,会导致生命周期函数重复触发
const App = new Vue({
// ...
})
// v3.1
// 用户在入口文件中只需要导出入口组件的配置对象,不需要再调用 new Vue
const App = {
// ...
}
2. 优化反向转换功能
v3.1 中我们对反向转换功能(Taro convert)进行了广泛的验证,修复了大量问题,现已达到比较高可用的状态。
详细文档:https://taro-docs.jd.com/taro/docs/next/taroize。
主要变动:
- 支持使用
Behavior - 支持使用自定义 tabbar
- 支持配置全局
usingComponents - 修复
catch事件不能阻止冒泡的问题 - 修复不支持挂载额外属性到 app 对象的问题
- 修复循环的 key 值没有被正确编译的问题
- 修复编译时没有处理样式中引用的字体的问题
反向转换例子
我们尝试使用 taro convert 转换了四个 GitHub 上最热门的开源微信小程序应用,它们转换之后都表现良好:
EastWorld/wechat-app-mall - 微信小程序商城
tumobi/nideshop-mini-program - 基于 Node.js + MySQL 开发的开源微信小程序商城
RebeccaHanjw/weapp-wechat-zhihu - 仿知乎
jectychen/wechat-v2ex - V2EX
3. 支持阻止小程序滑动穿透
v3.0 推出后反馈最多的问题之一,就是在 touchmove 事件回调中调用 e.stopPropagation() 并不能阻止滑动穿透。
这是因为 Taro 3 的事件冒泡机制是单独在小程序逻辑层实现,所有事件都是绑定的 bind 而不是 catch。因此touchmove 事件回调中调用 e.stopPropagation() 只会阻止上层组件的事件回调触发,而没有 catchtouchmove 能阻止滑动穿透的能力。
v3.1 中我们为 View 组件增加了 catchMove 属性,只要 catchMove 属性值为 true,就会使用 catchtouchmove 代替 bindtouchmove 进行事件绑定,从而获得阻止滑动穿透的能力。
用法:
<View class='parent'>
<View class='modal' catchMove>滑动 .modal 时,并不会令 .parent 也一起滑动</View>
</View>
4. 修复使用了 HOC 后分享生命周期方法不触发的问题
倘若我们在 v3.0 的 React 框架下,把页面使用 HOC 进行包裹,如 react-redux 的 @connect,那么我们设置的一些分享生命周期:onShareAppMessage, onShareTimeline 都将不会被触发。这时需要在页面的配置文件中对应设置 enableShareAppMessage: true、enableShareTimeline: true 才能解决。
v3.1 会在编译时扫描 onShareAppMessage、 onShareTimeline 是否有被调用,进而自动在页面配置文件中加上对应配置,大部分场景下不需要用户手动设置。
注意,如果分享生命周期被封装在基类或自定义 Hooks 中,还是需要手动加上对应配置。
5. 修复支付宝小程序使用原生自定义组件报错的问题
在 v3.0,支付宝小程序使用原生自定义组件时,会报“元素不存在”的错误。
这是因为支付宝小程序中规定,页面引用到的自定义组件,需要在页面对应的 axml 文件中定义。而 Taro 会把自定义组件定义在全局模板文件 base.axml 中。
因此 3.1 会识别出使用了原生自定义组件的页面,把这些页面的模板都在页面对应的 axml 里进行定义。
6. 优化 base.xml 模板体积
v3.0 刚推出,很多同学反馈小程序体积过大的问题,其中一个原因是编译产物中 base.xml 这个模板的体积太大了。
自 v3.0.9 后,我们对模板生成逻辑进行了重构:可能嵌套引用自身的组件,模板默认生成 16 次,如 View。不会嵌套引用自身的组件,模板只会生成一次,如 Map。
以微信小程序为例,在最极端的情况下体积优化率达 85% 以上:

三、升级指南
从 v2.x 升级的同学需要先按 迁移指南 进行操作。
从 v3.x 升级的同学,首先需要安装 v3.1 的 CLI 工具:
npm i -g @tarojs/cli@next
然后进入项目,把 package.json 文件中 taro 相关依赖的版本修改为 3.1.0-beta.4,再重新安装依赖(建议先把 node_modules 文件夹删除)。至此升级结束。
Breaking
v3.1 带来了一个 Breaking Change,使用 Vue 进行开发的同学需要按指示进行修改。
四、未来规划
Taro 3 即将支持 React Native,欢迎体验:《增加 React Native 支持的 Taro 3.2.0 版本测试通告》
五、感恩社区
开源不易,贵在坚持。Taro 团队衷心感谢各位参与过本项目开源建设的朋友,无论是为 Taro 提交过代码、建设周边生态,还是反馈过问题,甚至只是茶余饭后讨论、吐槽 Taro 的各位。
现诚挚邀请您与 Taro 官方团队交流您的使用情况,有你相伴,Taro更加精彩!问卷地址
最后,特别感谢为 Taro 从 v3.0 走到 v3.1 贡献过代码的各位,排名不分先后:
- @wuchangming
- @SyMind
- @zhuxianguo
- @Songkeys
- @vdfor
- @Spencer17x
- @wingsico
- @w91
- @fjc0k
- @Leechael
- @southorange1228
- @alexlees
- @cncolder
- @rottenpen
- @gcxfd
- @twocucao
- @pengtikui
- @kala888
- @LengYXin
- @iugo
- @xuchengzone
- @csolin
- @xiaoyao96
- @zhaoguoweiLLHC
- @baranwang
- @fred8617
- @huanz
- @Cslove
- @002huiguo
- @jazzqi
- @Jetsly
- @yuezk
- @lukezhange001
- @k55k32
- @Soul-Stone
- @hisanshao
- @gjc9620
- @younthu
- @digiaries
- @ZeroTo0ne
- @GoodbyeNJN
欢迎关注凹凸实验室博客:aotu.io
或者关注凹凸实验室公众号(AOTULabs),不定时推送文章:

Taro 3.1 beta 发布: 开放式架构新增 4 端支持的更多相关文章
- Taro 3.4 beta 发布: 支持 Preact 为应用开辟更多体积空间
项目体积是困扰小程序开发者的一大问题,如果开发者使用 Taro React 进行开发,更是不得不引入接近 100K 的 React 相关依赖,这让项目体积变得更加捉襟见肘.因此,Taro v3.4 的 ...
- Taro 3 正式版发布:开放式跨端跨框架解决方案
作者:凹凸曼 - yuche 从 Taro 第一个版本发布到现在,Taro 已经接受了来自于开源社区两年多的考验.今天我们很高兴地在党的生日发布 Taro 3(Taro Next)正式版,希望 Tar ...
- 个人对beta发布的观点
内容:五个小组的beta发布 时间:2016年11月10日 13:40-15:15 地点:传媒西楼202 发布顺序: 1.飞天小女警(选礼物) 2.金州勇士(在线考试) 3.新蜂(俄罗斯方块) 4.天 ...
- Beta发布 _thunder_文案+美工展示
作业要求:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/1366 团队介绍:thunder 组成员及各位博客地址: 1.王航:htt ...
- Beta发布文案+美工
团队名称:探路者 1蔺依铭:http://www.cnblogs.com/linym762/(组长) 2张恩聚:http://www.cnblogs.com/zej87/ 3米赫:http://www ...
- Thunder团队--Beta发布用户使用报告
Thunder爱阅app Beta 发布用户使用报告 用户数量:14人 以下为用户评论:(注:为了保护用户的姓名权,以下用户名以昵称形式给出.) 序号 昵称 个人信息 获得软件途径 使用次数 用户评论 ...
- Beta发布--PSP DAILY软件功能说明书2.0
一.开发背景 你在完成了一周的软件工程作业后,需要提交一个PSP图表,里面有4项,如下所示: 1.本周PSP表格,包含每项任务的开始.中断.结束.最终时间,格式如下: 2.本周进度条,包含从开始到现在 ...
- CKEditor 4.5 beta 发布,可视化 HTML 编辑器
分享 <关于我> 分享 [中文纪录片]互联网时代 http://pan.baidu.com/s/1qWkJfcS 分享 <HTML开发MacOSAp ...
- 团队最后一次——冲刺+Beta发布
这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/2019autumnsystemanalysisanddesign/ 这个作业要求在哪里 https:// ...
随机推荐
- ESP定律脱壳——NsPack3.x脱壳
首先进行查壳,NsPack 将程序拖入x64dbg 程序入口处标志性的push F8单步,发现仅有esp寄存器有变化 在esp上右键,在内存窗口查看,下硬件断点 F9运行程序,程序断在pop之后. 使 ...
- div可以滚动但不显示滚动条
首先有3个div, 第1个,固定大小是200*200(单位为px,下同) 第2个,不固定大小,其大小要用第3个div把个撑开,但是这个div必需要有滚动条, 第3个,固定大小与第1个div保持一致20 ...
- 怎么绘制C语言选择和循环语句的思维导图
C语言是一门非常基础的计算机语言,是大部分本科学生的公共专业,在C语言的学习中,选择和循环语句是至关重要的部分,利用思维导图可以有效节约时间并加深知识点记忆. 接下来就为大家介绍一下我用iMindMa ...
- 【CF375D】Trees and Queries——树上启发式合并
(题面不是来自Luogu) 题目描述 有一个大小为n且以1为根的树,树上每个点都有对应的颜色ci.现给出m次询问v, k,问以v为根的子树中有多少种颜色至少出现了k次. 输入格式 第一行两个数n,m表 ...
- Java基础教程——继承
继承 一个类 可以 继承自 另一个类: 派生的类(子类)继承父类的方法和数据成员: 关键字:子类 extends 父类. public class 继承 { public static void ma ...
- 一口气带你读懂80年IT发展史
计算机的发展历史有多长?真正意义上的计算机诞生,距今也只有80多年的时间.80年,对于每一个人来说,是很长的时间,但对于整个历史来说,只是短短的一瞬间.这八十多年只是整段历史中的一粒尘埃罢了,但却对这 ...
- mysql主从同步上---主从同步原理
1.主从同步机制 1.1 主从同步介绍和优点 在多台数据服务器中,分为主服务器和从服务器.一台主服务器对应多台从服务器. 主服务器只负责写入数据,从服务器只负责同步主服务器的数据,并让外部程序 ...
- devc++编译时 undefined reference to `__imp_WSAStartup'
socket编程时遇到的问题:
- Java 命名之道
为什么需要重视命名? 好的命名即是注释,别人一看到你的命名就知道你的变量.方法或者类是做什么的! 好的命名对于其他人(包括你自己)理解你的代码有着很大的帮助! 简单举个例子说明一下命名的重要性. &l ...
- 基于vue(element ui) + ssm + shiro 的权限框架
zhcc 基于vue(element ui) + ssm + shiro 的权限框架 引言 心声 现在的Java世界,各种资源很丰富,不得不说,从分布式,服务化,orm,再到前端控制,权限等等玲琅满目 ...