經(jīng)過持續(xù)的迭代,Rax 小程序迎來了一個大的升級,支持全新的運行時方案。站在 2020 年初這個時間點,我們想從 Rax 小程序的特點出發(fā),進行一次全面的梳理與總結,并且在文末附上了 Rax 與當前主流的小程序開發(fā)框架的對比。本文將從 API 設計與性能、雙引擎架構、優(yōu)秀的多端組件協(xié)議設計和基于 webpack 的工程架構四個方向展開。 一、API 設計與性能當決定一個產(chǎn)品的技術選型的時候,我們往往會從幾個方面考慮,(1)可用生態(tài),即周邊相關的工具是否滿足產(chǎn)品開發(fā)的條件;(2)風險率,即出現(xiàn)問題是否能夠快速定位解決,所使用的技術是否會持續(xù)維護;(3)上手成本,即需不需要很大代價才能達到能夠使用的階段;(4)性能,即能夠滿足產(chǎn)品既定的性能標準以及用戶體驗。 本節(jié)主要會介紹 Rax 小程序在后面兩點上的優(yōu)勢。 API 設計框架整體的上手成本是比較小的,Rax 小程序鏈路從框架上是繼承自 Rax(構建多端應用的漸進式類 React 框架)。所以只要你會 Rax Web/Weex 開發(fā)或者 React,那么你就會用 Rax 開發(fā)小程序,并且可以同時投放到 Rax 所支持的其它端。 但是由于小程序端的特殊性,總會存在無法抹平以及需要單獨處理的地方。得益于 Rax 已經(jīng)做了比較久的多端方案,我們認為,每個端獨立的屬性不應該入侵基礎框架本身,保證基礎框架的純凈有利于做更多的擴展。 以下面的代碼為例: Taro: import Taro, { Component } from '@tarojs/taro' Rax:
在和 Taro 的對比中,可以看出主要是兩點差異:(1)Rax 沒有 這就是前文所說的不入侵基礎框架本身,React 本身其實是沒有 當然這種設計本身會導致代碼量一定的膨脹,但是通過工程上的手段,是可以保證最后產(chǎn)物代碼的體積幾乎毫無差異。 性能小程序的性能問題是在業(yè)務開發(fā)中經(jīng)常會遇到的,為此 Rax 小程序現(xiàn)有的編譯時方案也做了很多的努力。通過阿里小程序真機云測的功能,我們對一個無限下拉的列表做了測試。 頁面結構如下: 根據(jù)真機測試報告,原生小程序三次平均是 2008 ms,Taro 是 2003ms,Rax 是 1924ms,當然其實相差并不多,但是實際的業(yè)務場景其實遠比上面的頁面結構更加復雜。 與 Taro 類似的,Rax 小程序側的基礎框架沒有在邏輯層弄一個 VDOM,而是通過數(shù)據(jù)合并、傳統(tǒng)的數(shù)據(jù) diff,來避免用戶更新冗余的數(shù)據(jù)。更多的是,阿里小程序原生提供了私有方法 另外需要提到的是,前面說的原生事件監(jiān)聽,小程序本身需要預先注冊才能監(jiān)聽事件(這也是為了保障性能),即需要: Page({ 而不能動態(tài)注冊:
所以加入 于是 Rax 小程序引入了 當然,Rax 小程序能做的性能優(yōu)化到此為止了么?在可計劃的未來,Rax 小程序編譯時方案已經(jīng)有一些明確的 action,比如進一步減輕框架對 二、雙引擎架構Rax (可能)是業(yè)界首個同時支持編譯時和運行時方案的小程序解決方案。兩種方案之間的切換無比簡單,我們將高性能 or 完整語法的選擇權真正地交給了用戶。雙引擎驅動的 Rax 小程序架構如下: 編譯時方案Rax 小程序編譯時方案是基于 AST 轉譯的前提下,將 Rax 代碼通過詞法、語法分析轉譯成小程序原生代碼的過程。由于 JavaScript 的動態(tài)能力以及 JSX 本身不是一個傳統(tǒng)模板類型語法,所以在這個方案中引入一個較為輕量的運行時墊片。 Rax 小程序編譯時架構的核心主要分為兩個部分,AST 轉譯和運行時墊片。下文會針對這兩個部分做簡要的介紹。 AST 轉譯AST 轉譯部分的架構相比同類產(chǎn)品 Taro 來說,更加清晰以及可維護性更強。這里不得不提到,它的分語法場景轉譯以及洋蔥模型。我們可以粗略的看一下,分語法場景轉譯部分的代碼結構: 可以比較清晰的看到,針對需要轉譯的每一個語法場景都有一個模塊專門負責轉譯,這就讓整個轉譯的過程輕松了起來,只要每一部分的轉譯結果符合預期,那么轉譯結果就是符合預期的。這樣的設計可以讓我們能夠充分利用單元測試來對轉譯前后的代碼進行比較。 而洋蔥模型的設計則是AST 轉譯的另一個主要設計,整個轉譯過程實際上分為 4 個步驟: 洋蔥模型主要進行的是后面三步,在 parser 層將原有的 AST 樹修改為符合預期的新 AST 樹,然后在 generate 層將新的 AST 樹轉譯成小程序代碼。 運行時墊片由于 JSX 的動態(tài)能力以及 Rax 原本提供的一些例如 hooks 之類的特性。所以,Rax 小程序編譯時方案提供了一個運行時墊片,用來對齊模擬 Rax core API 。 既然引入了運行時,自然可以基于這套機制對數(shù)據(jù)流做更多的管理,以及提供 Rax 工程在其他端上的 API,比如路由相關的 運行時方案Rax 小程序的運行時方案沒有自研,而是『站在了巨人的肩膀上』,復用了 kbone[3] 的架構并對其作了一定程度的改造以接入 Rax 小程序的工程體系。關于運行時方案的實現(xiàn)原理可以點擊這里[4]查看,此處不再詳細介紹。首先需要介紹的是 Rax 小程序同時也是 kbone 的優(yōu)點:
而在 kbone 的基礎上,Rax 小程序運行時方案還新增了不少特性,概括起來有以下幾點:
最后,我們也不能回避的是,Rax 小程序運行時方案具有所有運行時方案都存在的問題:性能損耗。事實上,運行時方案就是以一定的性能損耗來換取更為全面的 Web 端特性支持。所以,如果你對小程序有一定的性能要求,建議使用編譯時方案;如果對性能要求不高,那么運行時方案就是助你快速開發(fā)小程序的利器。雙引擎驅動的 Rax 小程序,總有一處能夠擊中你的內心。 三、優(yōu)秀的多端組件協(xié)議設計Rax 小程序編譯時方案支持項目級開發(fā)和組件級開發(fā)。與 Taro 將組件統(tǒng)一在項目中進行編譯產(chǎn)出為小程序代碼不同,Rax 在組件工程中即可構建出小程序組件。結合一套優(yōu)秀的多端組件協(xié)議設計,我們做到了在 Rax 小程序項目和原生小程序項目中都能正常使用 Rax 小程序組件,同時保持統(tǒng)一的多端開發(fā)體驗。該協(xié)議定義在 package.json 中的 支持漸進式接入 Rax對于那些已經(jīng)使用原生語法開發(fā)了完整的小程序的開發(fā)者來說,一個很合理的需求就是漸進地切換到 Rax 開發(fā)鏈路上來,畢竟整個項目遷移可能成本高昂。而 Rax 依托多端組件協(xié)議,能夠幫助開發(fā)者平滑過渡。 按照設計,Rax 小程序組件工程的構建產(chǎn)物為符合小程序語法的組件,因此其理所當然可以直接在原生小程序項目中使用。這意味著,如果你想漸進式地使用 Rax 來開發(fā)小程序,可以以組件或者頁面為單位將之前使用原生語法開發(fā)的小程序逐漸地遷移到 Rax 上來。而這,也是 Taro 等其他框架不具備的能力。在 Rax 的使用方中,浙江省網(wǎng)上政務平臺『浙里辦』支付寶小程序即采用了漸進式接入 Rax 的方式。 多端統(tǒng)一的組件使用體驗當使用 Rax 組件工程發(fā)布的小程序組件在 Rax 項目中使用時,構建器會自動通過 // Wrong 除此之外,多端組件協(xié)議還可以擴展成多端組件庫協(xié)議,支持更靈活的類似 四、基于 webpack 的工程架構Rax 工程以阿里巴巴集團前端統(tǒng)一的 CLI 工具 @alib/build-script[7] 為基礎,其依賴 webpack,通過插件體系支持各個場景,同時基于 webpack-chain 提供了靈活的 webpack 配置能力,用戶可以通過組合各種插件實現(xiàn)工程需求。Rax 小程序的編譯時方案通過 webpack loader 來處理自身邏輯。以 app/page/component 等文件角色分類的 webpack loader 會調用 jsx-compiler 進行代碼的 AST 分析及處理,再將處理完的代碼交由 loader 生成對應的小程序文件;運行時方案直接復用 Web 端的編譯配置,再通過額外的 webpack 插件生成具體的小程序代碼。 相比其他自研的工程體系,整套架構具有如下優(yōu)點:
總結最后,附上 Rax 和現(xiàn)有主流小程序框架的對比。 更多關于 Rax 小程序的內容,歡迎訪問 https://rax./miniapp 了解! 參考資料https://github.com/alibaba/rax: https://link.zhihu.com/?target=https%3A//github.com/alibaba/rax [2]https://rax./miniapp: https://link.zhihu.com/?target=https%3A//rax./miniapp [3]kbone: https://github.com/wechat-miniprogram/kbone [4]這里: https://wechat-miniprogram./kbone/docs/guide/principle.html [5]Rax 小程序——多端組件開發(fā): https://rax./docs/guide/multiple-ends-component-development [6]Rax 基礎組件: https://rax./docs/components/introduce [7]@alib/build-script: https://www./package/@alib/build-scripts 關注我們 |
|
來自: 西北望msm66g9f > 《編程》