Taro 1.3 正式發(fā)布:全面支持 JSX 和 Hooks、快應用和 QQ 小程序

作者:余澈

在 Taro 1.2 發(fā)布之后,Taro 在業(yè)界收獲了巨大的贊譽和關注:GitHub 上 Star 數(shù)量超過 19000 粒,NPM 下載量也穩(wěn)居同類開發(fā)框架之首,同時 Taro 團隊也和騰訊、百度、華為等數(shù)十家業(yè)界巨頭的研發(fā)團隊展開了深入和有效的合作。

Taro 1.3 是我們醞釀最久的版本:經(jīng)歷了橫跨 6 個月的開發(fā)時間,近 2000 次的代碼提交,近百位開發(fā)者的共同參與。我們終于在今天驕傲地發(fā)布了 Taro 1.3。

Taro 1.3 的特性包括但不限于:

  • 支持快應用和 QQ 小程序的開發(fā)
  • 全面支持 JSX 語法和 React Hooks
  • 大幅提高 H5 性能和可用性
  • Taro Doctor

支持快應用和 QQ 小程序的開發(fā)

快應用的開發(fā)模式非常特別,它的 API、組件系統(tǒng)、組件庫和其他小程序端差異非常大,并且快應用只是一個標準,各家安卓廠商對運行時的實現(xiàn)也各不相同。而這塊「硬骨頭」終于也被 Taro 啃下了。

QQ 小程序作為新興的小程序類容器,大家普遍對它知之甚少,但 Taro 也率先實現(xiàn)了對 QQ 小程序的支持。

支持快應用和 QQ 小程序意味著 Taro 真正對業(yè)界主流小程序實現(xiàn)了「全覆蓋」,不管你的業(yè)務要支持哪一個小程序端,只要維護一套代碼,Taro 就能生成對應小程序平臺的代碼。同時 Taro 也成為了業(yè)界首個同時支持微信小程序、百度智能小程序、字節(jié)跳動小程序、支付寶小程序、快應用、QQ 小程序共 6 端小程序的開發(fā)框架。

taro.jd.com.png

全面支持 JSX 語法和 React Hooks

作為使用 React 和 JSX 語法的開發(fā)框架,Taro 早期的版本在編譯器和編輯器檢查工具都對語法做了高強度的限制。而在 Taro 1.3 中,開發(fā)者可以充分發(fā)揮自己的創(chuàng)造力和想象力,可以任意地寫 if-else,可以任意地寫匿名函數(shù),可以把 JSX 放在類函數(shù)中,也可以放在普通函數(shù)中,等等。只要編譯器和和 ESLint 不報錯,就可以這么寫。

雖然 React Hooks 正式穩(wěn)定的時間并不長,但我們認為這個特性能有效地簡化開發(fā)模式,提升開發(fā)效率和開發(fā)體驗。即便 Hooks 的生態(tài)和最佳實踐還尚未完善,但我們相信未來 Hooks 會成為 React 開發(fā)模式的主流,也會深刻地影響其它框架未來的 API 構成。所以我們優(yōu)先把 React Hooks 帶到了 Taro 中,還寫了兩個小例子展示如何在 Taro 中使用 Hooks:

V2EX: https://github.com/NervJS/taro-v2ex-hooks

TodoMVC: https://github.com/NervJS/taro-todomvc-hooks

carbon.png

全新生命周期和 Context API

在 Taro 1.3 我們還實現(xiàn)了 React 16 的新生命周期函數(shù) static getDerivedStateFromProps()getSnapshotBeforeUpdate()。當新的生命周期函數(shù)注入到類組件時,老的生命周期函數(shù)將不會被調用,沒有使用新的生命周期函數(shù)則不會影響原有生命周期的調用。就多數(shù)情況而言,我們更推薦使用新的生命周期來構建你的類組件,因為這樣能減少一次渲染和更新的開銷。更多詳細信息可以查看相關文檔

Taro 1.3 還實現(xiàn)了 React 16 的 createContext、contextTypeuseContext API。新 Context 通過聲明式的 API 來傳遞組件的更新,使得Taro 跨組件通信和共享狀態(tài)更為直觀。同時,例如 react-redux 這樣的熱門庫也正在基于 ContextHooks 進行重構,我們也非常期待與社區(qū)一起探索 React/Taro 新的開發(fā)與設計模式。

大幅提高 H5 性能和可用性

作為除微信小程序之外需求量最高的端,我們一直都部署了重要的開發(fā)戰(zhàn)力在 H5 端。而在 Taro 1.3 中,我們優(yōu)化了編譯代碼的方式,實現(xiàn)了資源最小引入和按需引入,將原有最小項目的編譯大小降低了 80% 左右。這對于網(wǎng)絡狀況不佳的 H5 端無疑是巨大的提升。

H5 端的 API 數(shù)量和質量也得到了大幅地增長,Taro 1.3 新增了 28 個 H5 API,解決了上百個 H5 相關的 issue。

關于 H5 端性能更感興趣可以查看文章:《決戰(zhàn)性能之巔 - Taro H5 轉換與優(yōu)化升級》。

Taro Doctor

我們還從 Flutter Doctor 中得到啟發(fā),開發(fā)了 Taro Doctor。 Taro Doctor 就像一個醫(yī)生一樣,可以診斷項目的依賴、設置、結構,以及代碼的規(guī)范是否存在問題,并嘗試給出解決方案。

但和真正的醫(yī)生不一樣,Taro Doctor 不需要排隊掛號,也不用花錢。你只需要在終端運行命令:taro doctor,就像圖里一樣:

taro-doctor.png

還有更多

除了以上的特性之外,Taro 1.3 還做了許多額外的工作,這些工作可能對日常開發(fā)影響不大,但為 Taro 的穩(wěn)定性以及將來更多的可能性夯實了基礎:

組件傳參(props)系統(tǒng)重構

在 Taro 1.0 到 1.2 的小程序端,我們一直使用原生小程序框架的組件傳參系統(tǒng),但小程序組件系統(tǒng)沒辦法傳遞函數(shù)的值,也無法傳遞非具名參數(shù),并且各小程序組件的實現(xiàn)各不相同。為了解決這些問題,在 Taro 1.3 中我們自己實現(xiàn)了一套組件傳參系統(tǒng)。新系統(tǒng)會使得傳參相關的代碼更為可靠,同時也是我們支持更多 JSX 語法的基礎。

命令行工具(CLI) 重構

在 Taro 1.3,我們將命令行工具使用 TypeScript 進行了重構并逐步添加更多測試用例。重構之后我們可以更加大膽地為 CLI 添加新功能,替換老舊依賴。同時我們也會將 CLI 的功能以 API 的形式暴露出來,賦能給其它開發(fā)工具和我們的合作伙伴。

移動端容器更換

我們和京東的 ARES 團隊合作,把原有的移動端容器 expo 替換為深度定制的 JDReact。JDReact 大幅提升了 Taro 移動端的可控性,可以讓我們突破 expo 的掣肘,引入原生移動端代碼,提供定制功能和 API,并且性能和穩(wěn)定性的表現(xiàn)都會更好。

支持開發(fā)小程序插件

小程序插件是小程序帶來的一個非常優(yōu)秀的特性,可以極大地提高代碼復用率,降低包大小,為開發(fā)者帶來諸多便利,目前微信、支付寶小程序已經(jīng)支持插件功能。而從 1.3 版本開始,Taro 支持直接開發(fā)微信與支付寶小程序插件,這意味著 Taro 項目將和小程序插件無縫對接,不再有開發(fā)模式切換的成本。

支持「小程序·云開發(fā)」

「小程序·云開發(fā)」是微信小程序聯(lián)合騰訊云團隊提供的一個非常強大的功能,它是一款 Serverless 服務,為開發(fā)者提供了「云函數(shù)」、「云數(shù)據(jù)庫」和「云文件存儲」三大能力,并且將這些能力封裝成特定的接口,可以幫助開發(fā)者快速構建微信小程序的后端服務。為了讓 Taro 開發(fā)者能夠享受到「小程序·云開發(fā)」的能力,Taro 也加入了對「小程序·云開發(fā)」的支持,為「小程序·云開發(fā)」提供了初始化模板,并且將小程序云相關的 API 進行了封裝,方便開發(fā)者進行使用。同時,「小程序·云開發(fā)」已提供 H5 版本的 SDK,Taro 支持將小程序、H5 的調用方式進行統(tǒng)一封裝,幫助開發(fā)者快速打造 Serverless 的多端應用。

升級兼容性

正如前面所提到,Taro 1.3 是一個醞釀時間最久,擁有特性最多的大版本,對 Taro 底層也進行了不小的重構,所以,1.3 版本的升級帶了以下 2 個兼容性問題。

JSX 中的事件監(jiān)聽函數(shù)必須綁定作用域

在之前的 Taro 版本中,JSX 中綁定的事件監(jiān)聽函數(shù),是可以不需要綁定任何作用域,就能訪問到組件實例的,例如

import Taro, { Component, Config } from '@tarojs/taro'
import { View, Button } from '@tarojs/components'

export default class Test extends Component {
  state = {
    hello: 'noclick'
  }
  clickHandler () {
    this.setState({
      hello: 'click'
    })
  }

  render () {
    return (
      <View className={styles.index}>
        <Button onClick={this.clickHandler}>點擊</Button>
      </View>
    )
  }
}

上述例子中,<Button /> 按鈕綁定的點擊事件,在之前版本中是能夠正常執(zhí)行的,Taro 會默認將 clickHandler 的作用域綁定為當前組件實例,但是這并不符合 React 中的實際情況,所以,在 1.3 版本中,我們對這一問題進行了修復,現(xiàn)在 JSX 中的事件監(jiān)聽函數(shù)必須綁定作用域,否則就會報錯。

上述代碼中 JSX 部分可以修改為如下

render () {
  return (
    <View className={styles.index}>
      <Button onClick={this.clickHandler.bind(this)}>點擊</Button>
    </View>
  )
}

或者你也可以在 constructor 中將函數(shù)進行提前綁定作用域,

constructor () {
  this.clickHandlerBind = this.clickHandler.bind(this)
}

render () {
  return (
    <View className={styles.index}>
      <Button onClick={this.clickHandlerBind}>點擊</Button>
    </View>
  )
}

還有一種做法是,將 clickHandler 寫成箭頭函數(shù),這種方式在新舊版本中均可以正常運行。

暫時無法在原生應用中使用 Taro 組件

在之前版本中,使用 Taro 編譯后的組件是可以直接用在原生項目中的,以提升復用性,但 1.3 版本由于組件的 props 系統(tǒng)徹底重構了,升級 1.3 后暫時無法在原生項目中使用 Taro 組件,我們正在積極處理這個問題,在后續(xù)版本中將繼續(xù)支持這一特性。

在框架之外

Taro 團隊除了 1.3 版本中完善多端適配,提高框架開發(fā)體驗和開發(fā)效率之外,我們還在生態(tài)建設上付出了諸多努力,其中包括全新升級的官網(wǎng),物料/插件市場,獨立的社區(qū)/論壇。

我們認為,Taro 能夠安身立命的本錢是作為開發(fā)框架的硬實力,但真正決定 Taro 能走多遠卻是生態(tài)、社區(qū)以及合作伙伴。
我們在 1.3 已經(jīng)把實力大幅增強,現(xiàn)在邀請你一起參與或觀察 Taro 在生態(tài)和社區(qū)的建設:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容