“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
打交道這麼久,突然換一個小兄弟上,一時還真的難以適應,甚至一臉嫌棄。Weex
和ReactNative
的設計理念也完全不同。RN
重點在Native
,以React
的方式開發跨平臺App
,它注重Native
細膩的使用者體驗和強大的原生功能,運用 ReactNative
甚至不需要Native
工程師就能獨立開發一款功能完善的App
。
Web 開發體驗
獨立開發App
對Weex
來說比較困難,因為它的Native
能力沒有RN
那般強大而全面。它更注重 Web開發體驗
,顧名思義就是像開發Web
網頁一樣開發跨平臺App
頁面,注意了是以Web
為主導,所以它的設計理念提倡 輕量 + 可擴充(至於“高效能”較RN
並沒什麼太大的體現),官方也推薦用Weex
和Native
混合的方式開發App
,也就是把Weex
作為一個元件融入到Native App
,替換傳統的 Hybrid
模式。
沒有專利限制
Weex
已經加入ASF
,沒有ReactNative
的專利協議限制,可以放心大膽地使用。當然有童鞋會反問 Weex
目前還在使用 FaceBook
的 Yoga
引擎,會不會有隱患?這個短期內不需要我們操心,首先這個問題本身邊緣就很模糊,其次 像阿里這樣的大廠遲早會開發一套類似的引擎來替代,時間問題。
三端共用程式碼
Weex
既保留了H5
的靈活性,也賦予了其Native
能力,通過JavaSriptCore
+JSbridge
直接和Native
進行通訊,較之 Hybrid
的WebView
+ URLScheme
方式效能好了很多。甚至可以實現傳說中的 “三端融合”——也就是 Web
、iOS
、Android
端的前端部分共用一套程式碼,省去了獨立建站和維護的麻煩。值得一提的是它把基礎bundle融入到了sdk力,業務bundle體積很小,載入速度相當可觀。
當然有得必有失,三端相容的坑也不少,Android
各機型 hack
就不提了,Web端其實就是個WebApp
,要利用瀏覽器的BOM
與三方的JS-SDK
來完成 DOM
和HTTP
以外的功能。不過使用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轉換、過渡、線性漸變、陰影(僅Web
和iOS
)、偽類、自定義字型(iconFront
圖示也能用哦) - 支援單個 類名選擇器,不支援 關係型選擇器,也不支援 屬性選擇器
- 支援元件級別的作用域,為了保持
Web
和Native
的一致,需要<style scoped>
宣告作用域 - 不支援
CSS3
動畫(動畫請使用Weex內建animation
模組)和3D轉換 - 不支援
display: none
,用模板語法v-if
替代,不建議用opacity: 0
(Native
裡有點透問題) - 類似
RN
,為了提高解析效率,Weex樣式屬性不支援簡寫,比如font
、border
、transfrom
不能簡寫
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
能不斷改進和完善!