React轉小程式現狀

發表於2018-09-05

現在做React轉小程式,一個是taro,一個是anujs。

anujs的React小程式一開始是群的方正搞的,後來神煩IT狗接手。當我們想抄襲時,已經有一個可以執行的demo。taro那時名聲很大,但實質並不如意。我研究了好久taro的原始碼,發現可以使用tempate元素避開小程式的自定義元件不能在構造器傳參的問題,就正式動工了。

小程式的自定義元件不能在構造器傳參的問題, 用過React的同學都知道,React的元件構造器有兩個傳參props與context,這都是react幫你傳入的。props是JSX中同名的標籤的屬性組成的物件,context是上方元件的getChildContext()產生的物件的並集。而小程式的Component只是一個方法,你傳什麼它就有什麼,不會幫你加東西。

開發了大概有三個星期,已經脫離方正大大的原始碼。元件的思路使用雙模板機制——即使用者編寫時是React風格編寫的(es6與jsx),通過我們一番神操作,它會產生三個檔案,第一個是js檔案,es5與createElement風格,類機制改由ReactWX的miniCreateClass方法實現,第二個是json配置物件,涉及路由的title與視窗顏色的定義,第三個是wxml檔案,我們將render方法的jsx抽取出來,變成這個檔案。

現在我們的React小程式有如下優勢

  1. 支援npm安裝
  2. 支援less與sass
  3. 支援小程式的自帶UI庫
  4. 支援在JSX直接使用p, div, i, b等HTML標籤,它們會在wxml轉換成view與text標籤。
  5. 支援在JSX中使用函式體與複雜的物件傳參,即onClick={function(){ console.log() }}onClick={this.changeAge.bind(this, index, {aaa:111,bbb: 222})}
  6. 支援React完整的生命週期,並保證順序。
  7. 對wx所有介面進行重新包新,將回撥風格轉換成Promise風格
React轉小程式現狀

anu的React轉小程式的效能是有保證的,它不會mpvue或taro那樣使用nextTick,而是在一個頁面的虛擬DOM更新完才發一次setData。這樣就避免了複雜data diff與data 序列化。

小程式的setData效能很差,不能傳入過大的物件,它會對data進行序列化。 因此一些轉譯框架會進行diff操作。但只要減緩它setData的頻率,這一步就可以略去。

React轉小程式現狀

事件系統上,支援onXXX與catchXXX。catchXXX是模擬阻止事件冒泡實現的API。微信小程式的同學說,使用者事件是非同步的,所以這裡只有定義式介面,沒有過程式的

React轉小程式現狀
React轉小程式現狀

與React的差異

1. 微信小程式的事件機制有瑕疵,不支援stopPropagation與preventDefault。我們將e.detail當成事件物件,在它基礎上新增type,target,touches,timeStamp等屬性與空的stopPropagation與preventDefault方法
2. 事件的繫結,不要使用this.props.fn或this.state.fn,要用this.fn這種形式,微信在給模板填資料時,會對資料進行JSON.stringify,清掉所有事件。
3. 元件系統是基於小程式的template元素,由於不支援slot,因此無法使用{this.props.children}實現顯式的元件套嵌
4. 不完整支援ref機制(refs可以放入元件例項,但不能放DOM,因為沒有DOM)
5. 無狀態元件還沒有實現
6 還沒有支援findDOMNode
7. 不支援render props
8. 不支援dangerouslySetInnerHTML屬性

關於元件標籤套元件標籤,需要官方的slot機制支援,目前得到的回覆是這樣的:

React轉小程式現狀

使用

從“RubyLouvre/anu下” git clone下來, 命令列定義到packages/cli目錄下,執行npm link
使用mpreact <project-name> 建立工程
定位到 <project-name> 目錄下 mpreact start 開始監聽檔案變化,
用微信開發工具開啟當中的dist目錄,自己收在src目錄中進行開發.

小程式在它的體積還是1mb時,開發體驗是很好的,效能也很好。但隨著體積的限制放開了,產品經理開始亂搞,小程式原生的API與元件機制就跟不上了。不可能一個APP上有10個彈層,每一個都寫一次吧。缺乏繼承是它的硬傷。事件機制與我們熟悉的機制差太遠。createSelectQuery也設計得非常弱智,wxs過於奇怪。因此有了webview標籤後,許多人直接引入頁面了。。。因此才有這麼轉譯框架的誕生,包括TX內部的weby。

目前市面上許多轉譯框架是vue風格的,這對React技術棧的同學不公平,於是有了taro與anu的轉譯器。anu保留了虛擬DOM的模板,因此會比taro,mpvue更能突破小程式的桎棝。

相關文章