Taro 3 正式版发布:开放式跨端跨框架解决方案

Easter79
• 阅读 913

从 Taro 第一个版本发布到现在,Taro 已经接受了来自于开源社区两年多的考验。今天我们很高兴地在党的生日发布 Taro 3(Taro Next)正式版,希望未来的更多两年能像一名共产主义战士一样经受住更多的考验。以下是 Taro 3 的一些新增特性:

跨框架:React、Nerv、Vue2、Vue3、jQuery—

在旧版本的 Taro,我们以微信小程序的开发规范为基准,使用 React/JSX 的方式来进行开发。而在 Taro 3,我们把这一思路量化为一个编程模型:

设微信小程序生命周期为一个 interface,不同的框架实例的生命周期虽然不尽相同,但我们可以根据框架生命周期分别新建一个 classimplements 小程序生命周期的 interface。相应地,小程序的组件/API/路由规范可以使用同样的思路和模型让不同框架的代码,运行在不同的端上:

Taro 3 正式版发布:开放式跨端跨框架解决方案

在 Taro 3 中我们内置了 React、Nerv、Vue 2、Vue 3 四种框架的支持,开发者可以通过 taro init 命令创建对应的模板,并编写与框架本身生命周期、调用方法合乎一致的代码(idiomatic code),在语法上也没有任何的限制。

在四类框架之外,Taro 3 还提供 jQuery-like API[1] 的支持,作为现代开发框架的补充和实现跨框架组件的方案。

跨端:H5、微信、支付宝、百度、字节跳动...小程序—

和旧版本的 Taro 一样,Taro 3 支持编译到微信、京东、支付宝、百度、字节跳动、QQ 等主流小程序平台。

和小程序一样,Taro 3 的 H5 端相较于之前版本的 Taro 是一次彻底的重写:基础组件现在全部使用 Web Components 构建,路由系统也完全与前端框架解耦,因此在 H5 端 Taro 也实现了跨框架。不管开发者使用的是 React、Vue 还是 Nerv,都可以同时运行在各种小程序和 H5 上。

开放式插件系统—

Taro 3 在编译时引入了基于 Tapable[2] 的插件系统,开发者可以通过编写插件的方式为 Taro 拓展更多功能或者为自身业务定制个性化功能。在运行时我们则从 React Reconciler[3] 中得到启发,在 Taro 运行时也实现了一套修改运行时逻辑的 API。

也就是说,开发者可以在不修改甚至不了解 Taro 源码和实现的情况下通过 Taro 拓展更多端,拓展更多的框架。在下个 Minor 版本(v3.1.0)Taro 就会完成编译时/运行时与端/框架的解耦,届时开发者只要写一个插件就能拓展新的端或框架。未来 Taro 添加新的端或框架也会通过这样的方式进行。

开源治理与项目治理—

为了与开发者更高效地交流,Taro 从 Vue.js 和 Ant Design 得到启发,引入了 Issue Helper 工具[4]。为了让 Taro 在重大特性更新和更改能稳步推进,我们又从 Rust、React 中学习,引入了 RFC 流程机制[5]。为了让版本迭代更透明、更规范,Taro 在今后版本发布也会遵守 Milestone 机制[6]。

文档是开发者最好的朋友。在 Taro 3 我们对文档也进行了改版和重新梳理,并推出了新的 渐进式文档,渐进式文档按照开发项目的顺序介绍 Taro 的基础概念和优化技巧,适合喜欢边学边做或对小程序开发没有任何了解的开发者。

代码质量和稳定性对开源项目非常重要。Taro 也在严格贯彻 Code Review 机制,所有人的代码都要被审核,没有人例外。为了保证我们能更大胆地迭代新特性,在整个 Taro 3 开发期间我们总共添加了三万行测试代码。

微信小程序转 React/Vue—

早在 Taro 1.2 发布[7] 时,我们就提供微信小程序转 Taro 的功能,转换后的微信小程序应用会变成一个多端应用。现在这个功能也完全兼容 Taro Next 的新架构,并且转换后的代码提供 React 和 Vue 两种选项。和以前一样,只需要在微信小程序项目根目录执行命令 taro convert

$ taro convert

选择想要转换后的框架即可:

Taro 3 正式版发布:开放式跨端跨框架解决方案

convert

渲染 HTML 字符串—

在小程序中渲染 HTML 字符串通常会使用 wxparse[8] 这样的第三方库,但 wxparse 的 API 复杂,拓展性弱,内部实现不准确,最重要的是现在已经停止了维护。比起 wxparse,Taro 3 的 HTML 字符串渲染提供以下的特性:

  • API 与 Web 保持一致,可以直接通过 React 的 dangerouslySetInnerHTML 或 Vue 的 v-html 调用。

  • 可以通过 CSS 直接控制标签样式

  • 给已经渲染的 HTML 标签绑定事件

  • 在 HTML 解析和渲染都提供了钩子函数满足个性化渲染需求

你可以访问文档渲染 HTML[9]了解更多信息。

CSS-In-JS—

在 React 社区有一个著名的 CSS-in-JS 解决方案: styled-components[10]。但遗憾的是,styled-components 使用 <style> 标签来动态地控制样式,在小程序端没有类似的方案。但在 Taro 中我们可以通过 linaria[11] 实现同样的功能,linaria 主要提供以下特性:

  • 近似于 styled-components 的 API

  • 完整的 TypeScript 支持

  • 零运行时

其中零运行时对于打包体积有要求的小程序尤为重要。

你可以访问文档使用 CSS-in-JS[12]了解更多信息。

虚拟列表(VirtualList)—

当我们渲染数据量非常大的列表时,框架会根据数据尝试全量渲染视图,这就可能会产生性能问题导致视图无法响应操作一段时间。为了解决这个问题,我们可以采用另一种方式:比起全量渲染数据生成的视图,可以只渲染 当前可视区域(visable viewport) 的视图,非可视区域的视图在用户滚动到可视区域再渲染:

Taro 3 正式版发布:开放式跨端跨框架解决方案

正常渲染和虚拟列表的区别

Taro 3 正式版发布:开放式跨端跨框架解决方案

在开发者工具的直观效果

类似的技术在 Android 开发被称之为 RecyclerView[13],在 React Native 叫做 VirtualizedList[14],我们统一命名为虚拟列表(Virtual List),这个组件现在内置在 Taro 中,在 React/Vue 或各种小程序及 H5 皆可使用:

import VirtualList from '@tarojs/components/virtual-list'

你可以访问文档长列表渲染[15]了解更多信息。

预渲染—

初始化性能是 Taro 3 的性能优化的痛点。原生小程序或编译型框架的初始数据可以直接用于渲染,但 Taro 3 在初始化时会把框架的渲染数据转化为小程序的渲染数据,多了一次 setData 开销。

为了解决这个问题,Taro 从服务端渲染受到启发,在 Taro CLI 将页面初始化的状态直接渲染为无状态的 wxml,在框架和业务逻辑运行之前执行渲染流程。我们将这一技术称之为预渲染(Prerender),经过 Prerender 的页面初始渲染速度通常会和原生小程序一致甚至更快。

你可以访问文档预渲染[16]了解更多信息。

更快的构建速度和 source-map 支持—

作为一个编译型框架,旧版本的 Taro 会进行大量的 AST 操作,这类操作显著地拖慢了 Taro CLI 的编译速度。而在 Taro 3 中不会操作任何开发者代码的 AST,因此编译速度得到了大幅的提高。

正因为 AST 操作的取消,Taro 也轻松地实现了 source-map 的支持。这对于开发体验是一个巨大的提升:

Taro 3 正式版发布:开放式跨端跨框架解决方案

source-map

没有枪,没有炮,没有轮子自己造—

把时间节点再跳转回两年前,市面上并没有一个支持使用 React 开发小程序的框架,也没有什么思路或探索能提供指引,我们面对的情况和旧中国「一穷二白」的情况差不多。今天,Taro 已经是中国活跃度 Top 5[17] 的开源项目。

办法总是比困难多,即便是在小程序这样相对受限的开发环境。今后,Taro 依然会从开发者的角度出发,不断完善开发体验,提升开发效率,走中国特色发展道路,遇山开山,遇水搭桥,努力成为小程序开发,甚至多端开发的基础技术设施——Taro 3 就是实现这一愿景最坚实的一步,正如一位智者所言:

上车 Taro 最好的时机是从前,其次是现在。

感谢—

感谢参与 Taro 开发的贡献者们,也感谢使用 Taro 开发的开发者们,有你相伴,Taro 更加精彩!

Taro 3 正式版发布:开放式跨端跨框架解决方案

参考资料

[1]

jQuery-like API: https://github.com/NervJS/taro-rfcs/blob/jquery-like-api/rfcs/0000-jquery-like-api.md

[2]

Tapable: https://github.com/webpack/tapable

[3]

React Reconciler: https://github.com/facebook/react/tree/master/packages/react-reconciler

[4]

Issue Helper 工具: https://nervjs.github.io/taro-issue-helper/

[5]

RFC 流程机制: https://github.com/NervJS/taro-rfcs

[6]

Milestone 机制: https://github.com/NervJS/taro/milestones?direction=asc&sort=due\_date

[7]

Taro 1.2 发布: https://aotu.io/notes/2018/12/17/taro-1-2/

[8]

wxparse: https://github.com/icindy/wxParse

[9]

渲染 HTML: https://taro-docs.jd.com/taro/next/docs/html.html

[10]

styled-components: https://github.com/styled-components/styled-components

[11]

linaria: https://github.com/callstack/linaria

[12]

使用 CSS-in-JS: https://taro-docs.jd.com/taro/next/docs/css-in-js.html

[13]

RecyclerView: https://developer.android.com/reference/android/support/v7/widget/RecyclerView

[14]

VirtualizedList: https://reactnative.dev/docs/virtualizedlist

[15]

长列表渲染: https://taro-docs.jd.com/taro/next/docs/virtual-list.html

[16]

预渲染: https://taro-docs.jd.com/taro/docs/next/prerender

[17]

中国活跃度 Top 5: https://www.infoq.cn/article/dCY0AHH71rBBjq3pIfh7


欢迎关注凹凸实验室博客:aotu.io

或者关注凹凸实验室公众号(AOTULabs),不定时推送文章:

Taro 3 正式版发布:开放式跨端跨框架解决方案

欢迎关注凹凸实验室公众号

本文分享自微信公众号 - 凹凸实验室(AOTULabs)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
马丁路德 马丁路德
3年前
Taro 入门教程
简介Taro是一个遵循React语法规范的开放式跨端跨框架解决方案,支持使用React/Vue/Nerv等框架来开发微信/京东/百度/
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Easter79 Easter79
3年前
Taro 版本升级权威指南
“Taro\1\是一款由京东凹凸实验室\2\推出的开放式跨端跨框架解决方案,致力于解决小程序、H5、ReactNative的跨端同构问题,支持同时使用React和Vue来进行开发。本文由Taro团队成员隔壁老李撰写,旨在帮助Taro开发者厘清当前Taro多版本之间关系的那些事儿,同时解答有关Taro3、T
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k