【Weex】 理性思考

【Weex】 理性思考

什麼是動態性


        今天在移動端,尤其是像手機淘寶這樣的 App 中,動態性問題逐漸成爲一個比較棘手的問題。所謂動態性,就是把移動應用本身的靈活性、迭代更新的週期和成本優化到極致。比如手機淘寶的店鋪首頁,它允許商家實時裝修自己的店鋪,更新自家的商品、活動等信息;再比如淘寶、天貓每次大促的會場頁面,要求我們非常靈活的及時調整界面信息和狀態,確保在瞬息萬變的活動當天緊跟促銷節奏,應對各種突發情況。


爲什麼要解決動態化的問題


       動態性需求的出現有很多必然的因素:我們的移動應用背後是一個平臺級甚至是生態級的電商系統,它需要有海納百川的能力和高速流通的特點,市場上很多移動應用也有類似的客觀形態和訴求;同時整個行業迄今爲止在移動端的積累都還不足以對產品形態、用戶體驗、交互方式等細節有完全的前期把握,一個移動應用,客觀上需要更多的嘗試和探索,甚至是“試錯”,而這種動態化的程度和產品迭代演進的速度有着強烈的正相關;第三,我們不必要爲這些動態性在多個端投入重複的精力,更不應該因此而頻繁的觸發新版本。所以動態性問題在今天的移動端顯得尤其重要。


無線電商動態化


無線(移動端)


1、前端快速迭代(試錯):

      無線端很多形態大家都還在一起摸索之中,這其中有很高的“試錯”成本,產品經理甚至會在項目初期就主動坦承我們需要很多試錯,需要快速迭代。

2、後臺版本兼容:

      由於前端以平均每兩週一個版本的速度在瘋狂迭代,後臺代碼中從最開始的比較規整的代碼,演變成進行各種各樣的容錯、兼容的臃腫代碼。

電商:


1、可變、實時性:
      從電商的角度來講,運營郭某無時無刻不在爲用戶挑選更合適的商品,如:一分錢拿羊奶皁,85元拿成本價德運全脂奶粉……
      它作爲平臺:展現形式一定是自由、靈活、實時的;
2、穩定性:

      電商是和真金白銀打交道的,這要求我們對技術方案的穩定性和準確性做非常嚴格的把控,對項目工程化有極高的要求,項目過程中的半點鬆懈都有可能對用戶產生極大的影響。

動態化:


     今天前端app 都是 native 的,有必要的版本控制和發佈節奏,並且能夠快速迭代、實時調整、還能把控性能和各方面風險,就變成了重中之重,但是這部分還有其他的問題修復BUG需要送審

   IOS審覈週期不定,打包-發佈-審覈(這個工作流程避免不了,總是在浪費時間),在這種惡略條件下,催生出了動態化這個概念,app不發佈照樣更新,這樣必將是未來互聯網發展的大方向。   

   

動態化歷史:



1、傳統 Hybrid:基於嵌入 native app 的 webview,通過對 API 的擴展達到解決問題的目的;
爲 Hybrid 引入 native 界面:去年 QCon 北京集鵠 (大叔) 的分享,當時只有安卓版本,以類似 plugin 的方式把一塊 native 界面引入到 webview 當中,這樣在整體還是 webview 的情況下,可以局部達到特殊的 native 效果。
2、WeApp:alibaba無線事業部2年前開啓的一個項目,設計一套 JSON 格式,可以描述界面的結構和樣式,然後各端實現對這套 JSON 格式的解析和渲染。這樣每次返回不一樣的 JSON 數據,就可以展示出不一樣的界面效果,和 Hybrid 方案不同的是,在 native app 裏我們的展示效果是 100% native 的,並且還做了 HTML5 版本的“降級”渲染方案。
3、React Native:這位老兄毫無疑問是今年全球最火熱的移動技術方案之一,界面是 100% 的 native,徹底顛覆了移動應用的技術棧和開發體驗。但最重要的是,它在運行時是用 JavaScript 進行控制的。這件事爲我們打開了一個巨大的腦洞:一旦我可以在線發佈和加載 JavaScript 文件,那也就意味着我具備了動態性的能力!於是乎出現了通過動態發佈 React Native 代碼達到動態性目的的技術方案。

Weex的由來


WEEX前身

Weex的前身是WeApp,一個用JSON配置原生UI組件來實現動態化的框架,關於類似這個的思想,可以在天貓這篇配置中心實踐中看到,已經很牛了,Weex是WeApp的進化版本,加上ex去掉App,就成了現在這個名字。他們還編了個段子:
You give us a few weeks, so we bring you a weex
這個段子要表達的意思,你get到了嗎?

與Vue.js的關係

         如果對前端有所涉獵的同學會發現,Weex的DSL風格與一個前端的MVVM框架Vue.js比較像,那麼它們的關係是什麼呢?
Weex由多個關鍵模塊組成,分別是DSL transformer、JS Framework、HTML5/iOS/Android Renderer和工具鏈 , 其中JS Framework就直接使用了部分來自Vue.JS的代碼。不過這種使用也是遵守開源協議的(Vue使用MIT協議,Weex使用Apache協議),Weex團隊在源碼的說明文件中記錄了來自Vue.JS和其他開源項目的貢獻。


爲什麼不用React Native

手淘和天貓曾經嘗試過React Native,然後放棄了。但是把它的思想吸收過來,結合Web Component和Vue.js,然後就成了Weex.
關於這個問題,莊卓然列舉了一些原因:
    1、因爲手淘之前有WeApp,從WeApp進化到Weex是很自然的選擇,拋棄自己的解決方案去用別人的反而很奇怪。
    2、React Native的JSX、CSS in JS寫法都很彆扭,淘寶有很多ISV(即各種店鋪),他們之前只會Web技術,寫這個有門檻。另外,HTML標準在過去二十年內經受了檢驗,HMTL/CSS/JS對應的結構、樣式和行爲,天然分離,代碼的可維護性會更好。拋棄標準自己發明DSL也不明智。
    3、React Native重視平臺獨立性,不能做到100%代碼共用,實際上還是要學習各平臺的特性,Weex希望做到100%共用,即一次編寫到處運行,進一步降低開發門檻。
    4、React Native在一些地方的性能上還有問題,手淘希望能自己主導優化的進程,否則會很被動。


Weex的優勢


 alibab經過一系列的調研、思考和討論之後,提出了一套完全針對無線電商動態化的技術方案:

     1、致力於移動端
     2、能夠充分調度 native 的能力
     3、能夠充分解決或迴避性能瓶頸
     4、能夠靈活擴展
     5、能夠多端統一
     6、能夠優雅“降級”到 HTML5
     7、能夠保持較低的開發成本
     8、能夠快速迭代
     9、能夠輕量實時發佈
     10、能夠融入現有的 native 技術體系
     11、能夠工程化管理和監控

Weex工作原理:




1、DSL : weex文件;
2、Virtual DOM (提升性能) :  
Virtual DOM 是一個模擬 DOM 樹的 JavaScript 對象。 weex使用 Virtual DOM 來渲染 UI,當組件狀態state 有更改的時候,weex會自動調用組件的 render 方法重新渲染整個組件的 UI。

weex主要的目標是提供一套不同的, 高效的方案來更新 DOM.不是通過直接把 DOM 變成可變的數據, 而是通過構建 “Virtual DOM”, 虛擬的 DOM, 隨後 weex處理真實的 DOM 上的更新來進行模擬相應的更新。

DOM 樹上的節點被稱爲元素, 而 virtual DOM 是完全不同的抽象, 叫做 components,component 的使用在 weex裏極爲重要, 因爲 components 的存在讓計算 DOM diff 更高效。

簡單的說就是:

當然如果真的這樣大面積的操作 DOM,性能會是一個很大的問題,所以 Weex實現了一個虛擬 DOM,組件 DOM 結構就是映射到這個虛擬 DOM 上,weex在這個虛擬 DOM 上實現了一個 diff 算法,當要更新組件的時候,會通過 diff 尋找到要變更的 DOM 節點,再把這個修改更新到瀏覽器實際的 DOM 節點上,所以實際上不是真的渲染整個 DOM 樹。這個虛擬 DOM 是一個純粹的 JS 數據結構,所以性能會比原生 DOM 快很多。

3、Android RenderEngine 將輸入Virtual DOM 轉換成輸出的android原聲控件;

 



1、後臺部署時會將weex文件轉換爲JSbundle,大家完全不必擔心這部分的時間,因爲在後臺已經轉換完成;
2、Native 渲染和 JavaScript 引擎之間的邊界放在了 Virtual DOM,兩者通過約定 Virtual DOM 來進行通信,而不是 template + data 或是別的邊界,確保渲染性能和靈活度的平衡;

目前Weex有三種集成方式:


全頁模式:

      :目前支持單頁使用或整個app使用weex開發(還不完善,需要開發router和生命週期管理)這是主推的模式,可以類比RN。

Native Component模式

      :把weex當作一個iOS/Android組件來使用,類比ImageView。這類需求遍佈手淘主鏈路,如首頁、主搜結果、交易組件化等,和業務同學溝           通下來這類Native頁面主體已經很穩定,但是局部動態化需求旺盛導致頻繁發版,解決這類問題也是Weex的重點。
      :這也涉及到如何讓Native同學快速上手“準Web”開發,有意思的話題,大家多給些建議。

H5 Component模式

      :在H5種使用Weex,類比WVC。一些較複雜或特殊的H5頁面短期內無法完全轉爲Weex全頁模式(或RN),比如貓超、互動類頁面、一些複雜頻道         頁 等。針對這個痛點我發起過WVC項目,並在實際業務中驗證了這樣的想法:在現有的H5頁面上做微調,引入Native解決長列表內存暴增、         滾動不流暢、動 畫/手勢體驗差等問題。

      :WVC將會融入到Weex中,成爲Weex的H5 Components模式。這3種模式幾乎涵蓋了淘系業務上的動態化需求(針對Native)或體驗提升需求(針         對H5)。更有趣的是這3種模式的技術基礎是一致的,這非常重要,意 味着:業務方可以使用Native或H5 Component模式 解決實際的業務痛         點,同時平滑過渡到Weex全頁模式。期待Weex成長壯大到AppFramework的那天。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章