ReactNative 到 Weex 的艱難一邁

Jafeney發表於2017-09-29

“Write once,Run Everywhere” 一次編寫,多端執行。React遷移到MIT協議,可惜React Native依然沒改,沒有RN的日子,還好有Weex這位哥們頂著。雖然沒有RN那麼牛逼,但也算是一個不錯的小兄弟。

很多人可能要問我搞了這麼久的RN現在轉Weex幹什麼?說起來,真是一個悲傷的故事

為什麼不用 RN

Facebook並沒有像React那樣把ReactNative也遷移到MIT協議,所以使用ReactNative開發對外產品,依然有專利風險。一般的公司其實沒什麼影響,但我廠情況比較特殊,有好幾個核心的專利技術,老闆不想冒這個險。加之隔壁的阿里Weex推得很火,那就用用看吧!

React專利許可證具體細節歡迎出門左轉看我之前的文章:《React專利許可證研究》

Weex 較 RN 的優勢

說老實話,和ReactNative打交道這麼久,突然換一個小兄弟上,一時還真的難以適應,甚至一臉嫌棄。WeexReactNative的設計理念也完全不同。RN重點在Native,以React的方式開發跨平臺App,它注重Native細膩的使用者體驗和強大的原生功能,運用 ReactNative 甚至不需要Native工程師就能獨立開發一款功能完善的App

Web 開發體驗

獨立開發AppWeex來說比較困難,因為它的Native能力沒有RN那般強大而全面。它更注重 Web開發體驗,顧名思義就是像開發Web網頁一樣開發跨平臺App頁面,注意了是以Web為主導,所以它的設計理念提倡 輕量 + 可擴充(至於“高效能”較RN並沒什麼太大的體現),官方也推薦用WeexNative混合的方式開發App,也就是把Weex作為一個元件融入到Native App,替換傳統的 Hybrid 模式。

沒有專利限制

Weex已經加入ASF,沒有ReactNative 的專利協議限制,可以放心大膽地使用。當然有童鞋會反問 Weex目前還在使用 FaceBookYoga引擎,會不會有隱患?這個短期內不需要我們操心,首先這個問題本身邊緣就很模糊,其次 像阿里這樣的大廠遲早會開發一套類似的引擎來替代,時間問題。

三端共用程式碼

Weex既保留了H5的靈活性,也賦予了其Native能力,通過JavaSriptCore+JSbridge直接和Native進行通訊,較之 HybridWebView + URLScheme方式效能好了很多。甚至可以實現傳說中的 “三端融合”——也就是 WebiOSAndroid端的前端部分共用一套程式碼,省去了獨立建站和維護的麻煩。值得一提的是它把基礎bundle融入到了sdk力,業務bundle體積很小,載入速度相當可觀。

當然有得必有失,三端相容的坑也不少,Android各機型 hack 就不提了,Web端其實就是個WebApp,要利用瀏覽器的BOM與三方的JS-SDK 來完成 DOMHTTP以外的功能。不過使用Weex內建的標籤和樣式可以很容易實現三端佈局樣式和基本行為的一致,還是大大地減少了工作量。

值得一提 Weex的佈局單位有且只有px,預設的顯示寬度 (viewport) 是 750px,元件都會以 750px 作為滿屏寬度,但可以通過 meta.setViewport() 手動指定頁面的顯示寬度

Type iPhone4 iPhoneSE iPhone8 iPhone8P iPhoneX
物理畫素 640x960 640x1136 750x1334 1080x1920 1125x2436
顯示畫素 750x1125 750x1331 750x1334 750x1333 750x1624
畫素比 @0.85x @0.85x @1x @1.44x @1.5x

對 CSS3 的支援

Weex雖然也對CSS做了一定的閹割,但比較 ReactNative,它保留得更多,甚至支援大量的CSS3特性,這一點值得讚歎。CSS3作為Web開發的利器,放著不用難免可惜。下面列舉Weex和標準Web的樣式差異:

  • 支援的CSS3特性包括:FlexBox、定位、2D轉換、過渡、線性漸變、陰影(僅WebiOS)、偽類、自定義字型(iconFront圖示也能用哦)
  • 支援單個 類名選擇器,不支援 關係型選擇器,也不支援 屬性選擇器
  • 支援元件級別的作用域,為了保持WebNative的一致,需要 <style scoped> 宣告作用域
  • 不支援CSS3動畫(動畫請使用Weex內建animation模組)和3D轉換
  • 不支援 display: none ,用模板語法 v-if 替代,不建議用 opacity: 0Native裡有點透問題)
  • 類似RN,為了提高解析效率,Weex樣式屬性不支援簡寫,比如 fontbordertransfrom不能簡寫

Weex 不足之處

本節的最後,還是想吐槽幾個Weex的不足之處,希望官方能儘快升級和改進:

社群建設緩慢

這應該是最要命的,Weex社群從去年開源到今天還是這般冷清不免令人神傷,雖然我知道阿里內部推廣力度很大,但是既然選擇開源,就應該跳出阿里的圈子,一些成功案例、成熟解決方案、優秀架構設計等就不應該藏著掖著,不然真的很難推廣起來。我不希望遇到坑點 Google 幾圈都找不到有價值的方案,GitHub上提問半天都等不到一個滿意的答案(哈哈,說得有點激動啊,很感謝 mario 上次回答我的提問,希望能儘快反應到官方文件裡)

Native能力提高

如果不提高Native能力,Weex全頁模式 價值其實不大。不要求面面俱到,但希望能再新增一些常用的,比如:statusBar控制、位置資訊、Android動態許可權分配等

真機除錯工具升級

Weex提倡Web開發體驗,所以開發和除錯都以Web為主,做靜態頁面還好,但我要除錯Native端的特有邏輯,就需要在Native端整合weex-devtool。這個方案的確另闢蹊徑,不過每次改完程式碼需要手動重新整理會不會太麻煩,能不能搞個類似RN的 熱替換LiveReload功能呢?

Mac端檔案許可權問題

在Mac端Shell工具進入Weex的目錄,無論npm相關命令,還是git操作都需要sudo許可權,好麻煩。我很懶的,Weex在建立檔案的時候能不能幫我把寫許可權的事也做了?


哈哈,是不是我太蠢沒能領悟到技巧,不對的地方 歡迎留言指正哈。不過前端工程師都是挑剔的,希望Weex能不斷改進和完善!

相關文章