背景
一開始我們只做微信小程序隨著我們的業(yè)務(wù)不斷擴張和各大小程序平臺的崛起,針對每個平臺都去寫一套代碼是不現(xiàn)實的。而且原生的小程序開發(fā)模式有很多弊端。
為了讓小程序開發(fā)更簡單,更高效,我們采用 Taro 作為首選框架,我們將使用 Taro 的實踐經(jīng)驗整理了出來,主要內(nèi)容圍繞著什么是 Taro,為什么用 Taro,以及 Taro 如何使用(正確使用的姿勢),還有 Taro 背后的一些設(shè)計思想來進(jìn)行展開,讓大家能夠?qū)?Taro 有個完整的認(rèn)識。
Taro 3.0 已經(jīng)逐漸成熟,我們項目已經(jīng)進(jìn)行了Taro 3.0的升級,因此本文代碼示例以 Taro 3.0 作為基礎(chǔ)。
什么是 Taro
Taro 是一個多端統(tǒng)一的開發(fā)框架。使用 taro 它可以支持 React 的開發(fā)方式,編寫一次可以運行多端的代碼,就能夠生成可以在各種小程序,h5 甚至 React Native 等多端應(yīng)用。
Taro 官方介紹:
Taro 是一個開放式跨端跨框架解決方案,支持使用 React/Vue/Nerv 等框架來開發(fā) 微信 / 京東 / 百度 / 支付寶 / 字節(jié)跳動 / QQ 小程序 / H5/ React Native 等應(yīng)用?,F(xiàn)如今市面上端的形態(tài)多種多樣,Web、React Native、微信小程序等各種端大行其道,當(dāng)業(yè)務(wù)要求同時在不同的端都要求有所表現(xiàn)的時候,針對不同的端去編寫多套代碼的成本顯然非常高,這時候只編寫一套代碼就能夠適配到多端的能力就顯得極為需要。
它的主要特點是:
快:可以快速開發(fā)小程序: 解決小程序開發(fā)各種痛點;
多:可以實現(xiàn)多終端適配:一套代碼適配小程序、H5、RN 等多終端;
為什么用 Taro
隨著應(yīng)用變得龐大之后,復(fù)雜度越來越高,原生小程序開發(fā)的痛點逐漸暴露出來:
?代碼組織復(fù)雜:寫一個頁面的文件結(jié)構(gòu)繁瑣(四個之多)
?規(guī)范不統(tǒng)一:組件、方法命名規(guī)范不統(tǒng)一、各種書寫方式,語法結(jié)構(gòu)不一致像 React 又像 Vue
?孱弱的字符串模板:邏輯表現(xiàn)力不強,不支持 eslint
?依賴管理混亂:缺少 npm 包依賴管理
?不完全的 ES Next:僅支持部分 ES Next 語法,比較新的 ES2020, ES2021 都不支持
?落后的開發(fā)方式:前端工程體系不完善,webpack 打包,css 預(yù)處理等缺失,對于前端來說比較落后的,對個人成長也不利
可選技術(shù)方案可選技術(shù)方案
對于以上微信小程序開發(fā)模式的痛點,業(yè)界也給出了一些可選方案:
對比分析
- mpvue 是美團研發(fā)的框架,多端適配效果不好,很久問題都沒人維護;
- WePY 是騰訊出的組件化框架,但是無法適配多端;
- Chameleon 在多端適配方面表現(xiàn)很突出,缺點是不支持京東小程序,無法轉(zhuǎn)換原生小程序(想用只能重寫項目);
- Taro 優(yōu)秀的特性,遵循 React/Vue 語法規(guī)范,引入的現(xiàn)代化的開發(fā)流程,讓開發(fā)更專注核心代碼,提供健全的代碼檢查方式。
多端需求
Taro 支持平臺最全面,獨具轉(zhuǎn)換能力,性能方面優(yōu)于其它框架,總結(jié)特點如下:
- 可以實現(xiàn)微信小程序原生代碼轉(zhuǎn)換到微信平臺,百度平臺等;
- Taro 框架是唯一一款實現(xiàn)京東小程序適配的框架;
- 支持 React/Vue 語法,更好的支持組件化和 TypeScript;
- 行業(yè)影響力大,社區(qū)活躍,京東內(nèi)部優(yōu)秀團隊研發(fā)的框架,支持有保障,研發(fā)團隊靠譜非常支持我們的工作;
- 更加完善的UI組件庫,支持多端同步調(diào)試能夠適配更多終端;
一處編寫,多端運行
設(shè)計思想
主要采用 React 開發(fā)方式
用 React 寫多端應(yīng)用
核心思想
代碼轉(zhuǎn)換:使代碼可以在不同平臺上運行
運行時適配:使代碼在不同平臺上有相同表現(xiàn)
以微信小程序為例以微信小程序為例
JSX
WXML
Taro 代碼編譯原理
Taro 的編譯原理:就是對輸入的源代碼進(jìn)行語法分析,語法樹構(gòu)建,隨后對語法樹進(jìn)行轉(zhuǎn)換操作再解析生成目標(biāo)代碼的過程。
首先是 Parse,將代碼解析(Parse)成抽象語法樹(Abstract Syntex Tree),然后對 AST 進(jìn)行遍歷(traverse)和替換(replace)(這對于前端來說其實并不陌生,可以類比 DOM 樹的操作),最后是生成(generate),根據(jù)新的 AST 生成編譯后的代碼。
開發(fā)時遵循 React 語法標(biāo)準(zhǔn),結(jié)合編譯原理的思想,對代碼文件進(jìn)行一系列轉(zhuǎn)換操作,最終獲得可以在小程序運行的代碼。而 React 最開始就是為了解決 Web 開發(fā)而生的,所以對代碼稍加改動,也可以直接生成在 Web 端運行的代碼,而同屬 React 語法體系下的 React Native,也能夠很便捷地提供支持。同理其他平臺,如快應(yīng)用、百度小程序等,將源碼進(jìn)行編譯轉(zhuǎn)換操作,也能獲得該平臺下的對應(yīng)語法代碼。
可以看出小程序和 Web 端上組件標(biāo)準(zhǔn)與 API 標(biāo)準(zhǔn)有很大差異,這些差異僅僅通過代碼編譯手段是無法抹平的,例如你不能直接在編譯時將小程序的 直接編譯成
,因為他們雖然看上去有些類似,但是他們的組件屬性有很大不同的,僅僅依靠代碼編譯,無法做到一致,同理,眾多 API 也面臨一樣的情況。針對這樣的情況,Taro 采用了定制一套運行時標(biāo)準(zhǔn)來抹平不同平臺之間的差異。
這一套標(biāo)準(zhǔn)主要以三個部分組成,包括標(biāo)準(zhǔn)運行時框架、標(biāo)準(zhǔn)基礎(chǔ)組件庫、標(biāo)準(zhǔn)端能力 API,其中運行時框架和 API 對應(yīng) @taro/taro,組件庫對應(yīng) @tarojs/components,通過在不同端實現(xiàn)這些標(biāo)準(zhǔn),從而達(dá)到去差異化的目的。
多端適配基礎(chǔ)標(biāo)準(zhǔn)
- 基礎(chǔ)框架(生命周期、組件API):以React的生命周期、組件api為基礎(chǔ),小程序的特性作為補充
- 標(biāo)準(zhǔn)組件庫(View、Button): 以微信小程序組件為標(biāo)準(zhǔn),各端模擬實現(xiàn)
- 標(biāo)準(zhǔn)Api (request、setState):擴展的小程序標(biāo)準(zhǔn)Api,各端模擬實現(xiàn)
多端適配基礎(chǔ)架構(gòu)圖如下:
快速上手
初始化項目
環(huán)境準(zhǔn)備:需要有個 node 環(huán)境,運行 npm 命令:
開始使用 Taro 編寫頁面:
運行項目
多平臺啟動命令示例:
如果同時看三端效果:分別運行以上命令即可;
微信原生小程序轉(zhuǎn)換 Taro 小程序
Taro 項目的組成
Taro項目目錄結(jié)構(gòu)
基本的目錄結(jié)構(gòu):
比較完整的多端項目結(jié)構(gòu):
完整的文檔請訪問:https://taro-docs.jd.com/
多端適配
多終端配置文件編寫
?微信的配置文件 project.config.JSON,文件內(nèi)容可以自定義微信小程序的選項,運行的目錄和 appid 等;
?百度小程序的配置文件 project.swan.json 內(nèi)容和微信類似;
?京東小程序的配置文件 project.jd.json 內(nèi)容和微信類似;
?其它平臺的小程序都有獨立的配置文件便于運行的調(diào)試;
多終端入口文件
每個平臺有不同的頁面配置信息:
?微信小程序頁面是全量的,有微信登錄頁面(其它平臺不需要);
?百度小程序有專門的登錄頁面有些頁面百度不支持需隱藏比如:圖片裁剪,達(dá)達(dá)同城,打印等;
?京東小程序:不支持批量寄,不需要登錄頁面,不支持分包,都要寫入主包中;
差異化配置
- 不同平臺加載對應(yīng)的文件:
- 每個平臺差異化配置信息:
- 地圖類型;
- 渠道信息;
- 請求頭信息;
- 。。。
代碼差異化處理
平臺特定 js 代碼塊兒實現(xiàn),在任意 js 代碼中加入如下語法:
平臺特定 css 代碼塊兒實現(xiàn), 在任意 css 代碼中加入如下語法:
提示:代碼在打包時不會增加包體積,針對不同平臺提取相應(yīng)代碼。
多端適配案例
一些典型的多端通用解決方案:
- 樣式解析:
- 微信是 rPX,百度小程序 vw,京東小程序 px;
- Taro 統(tǒng)一使用 px 通過框架處理轉(zhuǎn)換成對應(yīng)平臺的像素,因此 px 值不要使用單數(shù);
- 1px(像素)的邊框通常會轉(zhuǎn)換成平臺對應(yīng)單位會導(dǎo)致無法顯示, 可以使用大寫的PX單位,例如: 1PX ;
- 百度小程序和京東小程序不支持 externalClasses,其它小程序也可能不支持避免使用;
- 模塊導(dǎo)入和導(dǎo)出:
- 導(dǎo)入模塊需要使用ES6 的 import, 不要使用 require 到 JS 文件(有些平臺不支持);
- 內(nèi)聯(lián)本地圖片資源可以使用 require 動態(tài)導(dǎo)入;
- 導(dǎo)入外部資源的 url 必須使用 https,有些平臺或機型不支持 http ;
- 小程序插件導(dǎo)入可以使用 require 但是要做多平臺適配和兼容性處理;
- 組件開發(fā)細(xì)節(jié):
- 組件 key 取值,不要使用 index ,對象的 id 屬性要先解構(gòu)出來;
- 組件渲染條件取 length 屬性頁面不更新;
- dataset 問題:百度和微信獲取的不一樣,都要用小寫來保持代碼一致: 這種駝峰的:data-goodsIndex={index} ,微信會轉(zhuǎn)成全小寫 goodsindex, 百度會保留駝峰 ,正確地寫法:data-goodsindex={index} ;
百度小程序開發(fā)注意事項:
- 層次較深的狀態(tài)不會更新時,需要解構(gòu)變量;
- 轉(zhuǎn)換成 vw 樣式有偏差,確保樣式的通用性;
- 個別組件 height: auto 有bug,不寫沒事;
- line-height 居中有偏差,用 flex 比較穩(wěn)妥;
- fixed 布局居底要設(shè)置 left: 0, bottom: 0 ,不寫默認(rèn)會有問題(默認(rèn)在中間渲染);
- mask 組件層級較深時,可能不會更新狀態(tài),可以使用 tt-modal 代替;
- 圖片裁剪,語音識別,打印功能等依賴原生 API 不支持;
- 狀態(tài)更新從有到無需要顯性設(shè)置 null ,例如將列表組件隱藏:this.setState({list: null}) {list && <組件實例>};
京東小程序開發(fā)注意事項:
- 不支持全局覆蓋組件樣式,如果想兼容需要單寫加上拼接樣式名;
- 不支持小程序分包,需要單獨配置頁面路由信息;
- showModal 彈窗不能定制 confirmColor 屬性;
- storagesync 不支持存儲 json 數(shù)據(jù),讀取需要自己手動JSON.parse;
- 不支持 canvas繪畫API:微信自定義分享功能,圖片裁剪,訂單條形碼等功能都做不了;
- 不支持同層渲染,原生組件上只能使用 Cover 組件;
- ios 內(nèi)嵌H5,如果url帶參數(shù),需要手動做一下urlencode編碼;
- H5頁面使用小程序 webview 不具備全部京東 app webview 功能,有些功能不支持;
- 京東小程序分享 URL 和 其它小程序分享的 URL 不一樣,要注意路徑的差異區(qū)分:例如:shareURL: 京東小程序: page/index/index 微信小程序:/pages/index/index
多端同步調(diào)試
在 config/index.js 配置:outputRoot: dist/${process.env.TARO_ENV}
生態(tài)與規(guī)劃
物流風(fēng)格的 Taro UI組件庫—Tarot(已適配Taro3.0)
定制化 Taro 模板工程定制化 Taro 模板工程
模板工程主要特性:
?自帶按需引入的 Tarot 組件庫及組件使用示例。
?自帶 pandora-tools 中的工具,如網(wǎng)關(guān)調(diào)用插件等。
?登陸適配多端,小程序端自動引入京東無線登陸插件,h5端自動跳轉(zhuǎn)無線統(tǒng)一登陸M頁d等。
?網(wǎng)關(guān)調(diào)用適配多端,自帶 Demo 示例;
?包含 TypeScript 和 Redux等更多高級API及用法示例;
?其它功能持續(xù)更新……
小程序 Mini Debug 工具
MiniDebug 是一款多端小程序調(diào)試工具,旨在提高小程序開發(fā)、測試效率的工具庫
功能介紹:
主要功能包括環(huán)境切換、身份Mock、應(yīng)用信息獲取、位置模擬、緩存管理、掃一掃、H5跳轉(zhuǎn)、更新版本等。工具部分頁面如下圖所示:
目前已經(jīng)在 GitHub 上開源(歡迎 issue):https://github.com/jdlfe/minidebug
物流風(fēng)格的小程序可視化拖拽平臺(規(guī)劃中)
京東商城已經(jīng)實現(xiàn)了小程序可視化拖拽平臺:https://ling.jd.com/atom/cms/pc/06599
結(jié)語:
Taro V3.0.0 目前支持 React、Nerv、Vue 三類框架,在未來 Taro 將開放拓展能力,使得開發(fā)者可以通過 Taro 拓展更多的框架支持,(比如:適配 Flutter 將成為可能 )。目前Taro框架完善社區(qū)活躍,即使沒有多端需求,僅用 Taro 開發(fā) H5 也是個不錯的選擇(未來可以 0 成本接入小程序平臺),想了解更多 Taro 3.0 實踐經(jīng)驗歡迎線下交流。
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報,一經(jīng)查實,本站將立刻刪除。