京東門詳一碼多端探索與實踐 | 京東云技術團隊

本文主要講述京東門詳業務在支撐過程中遇到的困境,面對問題我們在效率提升、質量保障等方向的探索和實踐,在此將實踐過程中問題解決的思路和方案與大家一起分享,也希望能給大家帶來一些新的啟發

一、背景

1.1、京東門詳介紹

1.1.1、京東門詳業務

門店詳情頁簡稱門詳,門詳業務包含門店詳情、列表、湊單、搜索、到店等頁面,最早于2020年在京東主站APP上線,最初是作為京東到家線下優質商家以線下店模式入駐京東主站,用戶可以在門詳內一站式完成門店信息查看、商品瀏覽、配送時效確認、領券、加車、下單等完整購物流程。后續隨著業務的發展,門詳陸續承接了天選、小時購、藥急送、前置倉等更多的業務模式場景,逐漸形成了以即時零售為特性,覆蓋到家、到店場景,承接線上線下的通用綜合型業務系統

1.1.2、門詳業務形態

門詳業務涉及到家門詳(小時購、藥急送)、到店門詳(POP、萬家);技術棧涉及京東小程序[2]、微信小程序[3]、H5、RN;頁面涉及門店首頁、湊單、搜索、評價、資質、列表等20+

1.2、門詳業務支持過程中面臨的痛點

  • 京東app和微信小程序兩端門詳功能差異較大
  • 因歷史原因面臨同時維護京東app和京購小程序兩套門詳業務需求
  • 業務規劃需求量巨大,雙端需求迭代頻繁,研發資源緊張無法短時間消化
  • 雙端業務場景及不同的技術棧對質量保障帶來較大挑戰

1.3、京購小程序業務方對門詳的訴求

  • 期望將京購小程序門詳功能對齊京東app
  • 新需求迭代希望快速同步到微信域
  • 期望研發需求吞吐量增加,可以快速消化更多的需求

二、技術方案

2.1、前期方案調研

前期技術方案調研方面,我們也了解了當前流行的各種多端框架像RN、Flutter、Taro、uni-app等,并從多端支持度、開發生態、前端框架支持情況、學習成本等各方面進行了調研對比;由于要支持京東APP及微信小程序,所以優先考慮支持小程序的多端框架像Taro3[1]、uni-app[10]、mpvue[11]、chameleon[12]、WePY[13]等;結合對前端框架兼容情況、京東小程序[2]的支持度及團隊自身情況(團隊對React比較熟悉)等因素,綜合考慮最終決定采用Taro框架來進行多端化重構。

2.2、技術方案制定及實踐

2.2.1、思考需要解決的問題

  • 如何更好的支持京東小程序、微信小程序、H5等多端需求?
  • 如何在改造過程中避免新需求重復開發?
  • 如何縮短研發交付周期?
  • 如何才能在開發過程中提高效率?
  • 如何在快速迭代過程中保障研發質量?
  • 如何靈活支持更多的業務場景?
  • 如何保障頁面性能?

2.2.2、制定解決方案

2.2.2.1、門詳業務多端化解決方案

整個方案通過前端、服務端、平臺共同構建一套完整的多端化、樓層化解決方案,服務端基于PaaS化架構將門詳功能拆分為多個領域服務、領域模型及擴展點,前端基于iPaas樓層、組件標準制定門詳多端化、樓層化方案,管理平臺通過奧德修斯(小程序交易數字化平臺)與黃流數字化平臺、iHub平臺能力打通,進行業務、頁面、樓層、組件、數據等管理及上線發布,以下是整體解決方案全景圖

2.2.2.2、門詳前端技術框架

前端基于Taro3[1] + React[8] + Recoil[7]為技術底座,將門詳業務按照基礎功能和基礎組件原則拆分出網絡、地址、埋點、優惠券、商卡、購物車等等50+功能點,頁面標準在iPaas頁面協議上增加了門詳渲染引擎部分,通過iHub平臺管理樓層及代碼,最終由頁面容器進行渲染,以下基于門詳面臨的痛點在門詳多端化過程中的架構圖及我們在實施過程中的一些方案

2.2.3、技術方案實施過程

1)業務功能歸類及樓層和組件拆分

門詳首頁按照結構拆分成頁頭、列表、頁尾、彈層等部分,按照樓層拆分成頁面頭部、門店信息、會員樓層、優惠促銷、商品列表、結算條、購物車等12+樓層組件

2)多端適配過程中的差異處理

雖然多端化框架已經幫我我們解決了跨平臺開發場景,但不同平臺之間由于底層原理及基礎能力實現方式的差異,仍然存在一些需要按照特定平臺進行適配處理的工作量,我們首先梳理門詳中使用到的小程序平臺40+底層能力,列舉并對比多端平臺上的功能差異,針對平臺差異制定中間適配層將API統一規范化(eg:登錄、地址、埋點、路由、系統信息等)

3)開發過程中的提效方式

  • 組件化:組件封裝分兩層,底層是最小單元的功能組件,上層是最小可復用業務組件原則封裝,有效的減少了相同和相似代碼的冗余,同時也會定期通過工具jscpd[4]進行代碼審計進一步找出相似代碼片段進行優化

  • 樓層化:組合相關業務組件提升能力最大復用度,例如:門店信息樓層、優惠促銷樓層等等,并且樓層組件按照頁面schema協議開發,支持部分能力可定制化

  • MVVM模式:利用react hook[6]方式將原有頁面中的邏輯及數據處理提練到View Mode層,使邏輯和UI之間清晰分離易于維護,還可以顯著提高代碼重用機會

4)改造過程中新需求處理

舊門詳采用的京東小程序原生語言開發,新門詳采用Taro+React開發,在新門詳未全量發布前新需求是需要雙端支持的,這樣也就意味著相同需求會開發兩次,經過探索我們通過混合開發模式[9]將Taro組件打包成小程序可以直接引用的原生組件,解決了新舊工程重復開發問題

2.3、門詳小程序性能優化

門詳在公測階段也暴露了一些性能問題,我們按照場景劃分為兩類:體驗性能、啟動性能,下面在這里和大家一起分享下相關案例及解決思路,希望能給有相似困境的小伙伴一些新的思路

2.3.1、體驗性能優化

門詳首頁用戶操作比較頻繁的就是分類切換、列表滑動等功能,也是用戶反饋卡頓較為多的部分,下面針對以上兩類問題進行相關案例分析:

2.3.1.1、商品列表渲染性能優化

在門詳多端化改造后,我們通過問卷調研方式收集用戶體驗反饋,發現部分用戶反饋在滾動商品列表時存在卡頓的現象。我們利用Taro的debug環境日志進行分析,發現分頁加載時setData體積不斷增大,耗時不斷增長

debug環境日志:

setData耗時走勢曲線:

經排查后發現是列表分頁渲染時數據量較大導致丟幀。為了解決大范圍渲染及重復渲染問題,將原有的商品列表二維數組數據結構優化為鏈表+遞歸方式進行分層嵌套平鋪渲染,數據上減少多層級計算、視圖上將分頁加載渲染控制在單頁內,以下為優化后的列表效果:

列表效果:

setData耗時走勢曲線:

優化前后分屏數據渲染耗時對比:

上圖左側為列表優化前效果,可以看到分頁加載請求數據時的卡頓體感比較明顯,尤其是隨著數據量的增大,卡頓時間越來越長。右側為優化后效果,在加載十幾頁之后依然保持高效的渲染性能。經過上述優化后每屏數據渲染耗時均維持在200ms左右,在分頁數據加載較多的情況下渲染依然保持高效。

2.3.1.2、分類切換時列表渲染邏輯優化

在前置倉的業務支撐過程中,發現在某些特殊場景下切換分類時等待時間較長,用戶體驗較差。經分析發現在分類列表加載數據時前端處理邏輯是在商品不滿一屏時自動加載下一頁數據,補全商品列表讓用戶可以看到更多的商品數據,而在接口進行輪詢請求時導致用戶等待時間較長

上圖左側為優化前分類切換時商品加載的邏輯,為了減少用戶等待時長對分類渲染邏輯進行優化(如圖右側),調整分類點擊后的處理邏輯,只請求當前分類下數據,不再進行跨一級分類接口請求。分類渲染耗時從n(接口請求次數)*250(接口請求耗時)+200ms(前端渲染耗時)減少到250ms+200ms。

2.3.2、啟動性能優化

我們針對門詳小程序啟動過程進行分析,整理啟動的每個環節及對應的耗時數據,制定優化方案,優化主要方向如下:

  • 京東小程序包壓縮(將jdapkg文件進行zip壓縮,文件大小從8.6MB降低到3.4MB)
  • 門詳小程序模版包復用(避免多個小程序冷啟動下載多次)
  • 門詳小程序模版包內置進APP(減少小程序包下載耗時)
  • APP啟動時進行小程序模版包預加載(減少小程序冷啟動耗時)
  • 小程序引擎加載耗時優化(前置預熱小程序引擎)
  • 小程序引擎啟動主線程卡頓優化(邏輯層與渲染層并行處理)
  • 小程序代碼構建包.jdapkg優化(引擎公共代碼抽離)
  • 小程序信息接口由同步改為異步(線上平均耗時減少158ms)
  • 小程序網絡庫超時時間及重試機制優化
  • 門詳主接口耗時優化(非首屏必要數據異步化)
  • 門詳業務代碼包瘦身(代碼優化、分包等,包大小從3.4MB降低到648KB)

使用公共模版包,多個商家共用一個代碼包,減少重復下載

優化前門詳小程序平均啟動耗時2227.7ms,經以上優化措施實施后,整體啟動耗時減少到954ms,啟動速度提升57.6%,在門詳小程序啟動優化過程中我們也得到了京東小程序引擎團隊的大力支持,也借此機會表示衷心的感謝!

2.4、ISV共建方案及質量保障探索

2.4.1、為什么要進行共建探索呢?

對于業務側大量的需求涌入,且有一部分并非門詳通用功能屬于特殊場景的個性化需求,而在研發資源緊缺的情況我們也在思考如何才能提升需求的吞吐量,為了更好的支撐業務,在與業務深度交流后發現部分業務側也有自己的研發團隊,可以自主個性化需求開發,雙方溝通后達成共識在保障系統穩定性的同時,我們在樓層化的基礎上對系統進行改進支持黃流ISV平臺接入,將部分獨立樓層開放給業務側自主接入,具體共建流程如下:

經過系統ISV方案改造探索后門詳的個性化需求等待時長明顯縮短,對比前兩個季度個性化需求整體承接量增長30%以上,在需求大量增長的同時也是對系統和新架構的考驗,為保證系統穩定性我們對共建需求的接入、開發、上線等進行了共建流程規范制定及相關性能、質量等約束

2.4.2、如何保障研發質量?

多團隊多人協作過程中我們也發現了一些問題,為了避免一些常規問題在此我們制定了相關的開發規范,并在整個需求開發上線過程中增加一些必要的校驗環節,具體細節如下:

  • 統一標準規范制定(目錄結構規范、git 分支規范、代碼編寫規范、開發規范、文件規范、上線規范等)
  • 需求評審后開發前進行前后端技術方案評審
  • 利用工具(ESLint)進行代碼規范掃描及語法規范檢查
  • 上線前進行code review及影響范圍預估
  • 上線中checklist(重要流程、核心功能、特殊場景)檢查
  • 上線后灰度切量且觀察監控、異常、客訴等系統
  • 兜底方案支持線上頁面、功能等一鍵降級

三、技術沉淀與業務賦能

3.1、技術改造過程中的能力沉淀

  • 多端化樓層化開發框架,支持ISV方式接入共建
  • 規范頁面可編排樓層化協議,支持部分能力可動態配置
  • 標準化樓層組件開發模版,減少組件開發配置過程
  • 基礎功能庫沉淀基礎API 16個、基礎組件25個、業務組件50+、打包插件3個
  • 自研多端調試工具(nuclear)、發表公眾號文章2篇、已進入國家專利局審核階段專利2篇
  • 構建工具cola-cli、cola-server
  • 小程序標準化門詳賦能SDK

3.2、多端化帶來的收益

  • 基礎能力賦能新業務(前置倉門詳、到店商詳、POP門詳等)開發效率提升40%以上
  • 京東app上的門詳新需求95%+的功能是可以直接復用到微信小程序、H5端,在有限的研發資源下大幅提升了多端需求吞吐量
  • 經過4個月的多端化改造后補齊了京購小程序中門詳業務滯后2年多的需求
  • 小程序賦能20+(eg:京購小程序、京東超市小程序、小時購等)

門詳多端化樓層化過程中沉淀的開發框架、基礎功能庫、通用開發模版,也在到店門詳、到店商詳、pop門詳等業務中得到了較好的實踐

3.3、前置倉門詳快速支撐

在京東app前置倉二期建設過程中小程序門詳組件及功能復用率達到95%+,基于多端化框架能力在2天內完成將前置倉門詳賦能到京購小程序,業務側提出期望將前置倉門詳能力可以引入到京東超市小程序(微信),基于前期門詳多端化能力建設僅用2小時就完成了置倉門詳能力賦能京東超市小程序(微信),也是在這個過程中我們將門詳多端化和樓層化能力與奧德修斯平臺鑒權、模型管理、數據管理、可視化、配置化等能力相結合,通過腳手架與平臺結合方式為業務方提供一鍵構建一站式賦能服務,通過這種標準化的方式既支持了京東超市小程序需求同時也擴充了黃流SDK中的標準化門詳能力,一鍵觸發5分鐘既可完成整個黃流SDK賦能包的構建

四、未來展望

隨著門詳業務涉及的場景日益增多,通用的樓層組件逐漸也無法滿足所有差異化場景,然而全部樓層都放入公共模版包中無疑是對小程序包大小的考驗,基于一碼多端框架和我們自研的小程序發布系統思考,可以將門詳批量小程序進行分類管理,構建時按類型按需構建,將一個公共模版包拆分成多個模版,可按照差異化方式分別構建發布

在京東前端技術域iPaas2.0搭建平臺建設逐漸完善同時,門詳業務得益于多端化、樓層化框架,也為門詳小程序支持多端可視化搭建邁出了前進的一步,為更多業務場景提供標準化門詳

參考資料

[1]Taro3:https://taro-docs.jd.com/docs/

[2]京東小程序:https://mp-docs.jd.com/doc/dev/framework/-1

[3]微信小程序:https://developers.weixin.qq.com/miniprogram/dev/framework/

[4]jscpd:https://github.com/kucherenko/jscpd

[5]狀態管理庫對比:https://cloud.tencent.com/developer/article/1685891

[6]React hook:https://react.docschina.org/learn#using-hooks

[7]Recoil:https://www.recoiljs.cn/docs/introduction/getting-started

[8]React:https://react.docschina.org/learn

[9]原生項目使用Taro:https://taro-docs.jd.com/docs/taro-in-miniapp

[10]uni-app:https://github.com/dcloudio/uni-app

[11]mpvue:https://github.com/Meituan-Dianping/mpvue

[12]chameleon:https://github.com/didi/chameleon

[13]WePY:https://github.com/Tencent/wepy

作者:京東零售 徐宏偉

來源:京東云開發者社區

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42437.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42437.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42437.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VB+SQL上機考試系統設計與實現

摘 要 隨著計算機技術的迅猛發展,學校教學和管理的信息化發展也有長足的進步,這就要求各個環節都均衡發展,從軟硬件雙方面把學校建設成一流的信息管理、教育教學的平臺。本文設計開發的考試管理系統也是其中重要的一個方面。該系統本著減輕教師工作負擔、提高工作效率、優…

六、分組背包

六、分組背包 題記算法題目代碼 題記 一個旅行者有一個最多能裝V公斤的背包和有N件物品,它們的重量分別是W[1],W[2],…,W[n],它們的價值分別為C[1],C[2],…,C[n]。這些物品被劃分為若干組,每組中的物品互相沖突&#…

【es6】函數參數設置默認值

1、es6之前的函數參數默認值寫法 1.1、使用短路或||的寫法 當y為空時,y判斷為false ,走||右邊的,所以y world;當y不為空時,y判斷為true,不需要再運行||右邊的,所以 y y function log(x, y) {y y || W…

數據的深海潛行:數據湖、數據倉庫與數據湖庫之間的微妙關系

導言:數據的重要性與存儲挑戰 在這個信息爆炸的時代,數據已經成為企業的核心資產,而如何高效、安全、便捷地存儲這些數據,更是每個組織面臨的重大挑戰。 數據作為組織的核心資產 數據在過去的幾十年里從一個輔助工具演變成企業的…

Ubuntu 20.04(服務器版)安裝 Anaconda

0、Anaconda介紹 Anaconda是一個開源的Python發行版本,包含了包括Python、Conda、科學計算庫等180多個科學包及其依賴項。因此,安裝了Anaconda就不用再單獨安裝CUDA、Python等。 CUDA,在進行深度學習的時候,需要用到GPU&#xf…

操作符詳解上(非常詳細)

目錄 二進制介紹二進制2進制轉10進制10進制轉2進制數字2進制轉8進制和16進制2進制轉8進制2進制轉16進制 原碼、反碼、補碼移位操作符左移操作符右移操作符 位操作符:&、|、^逗號表達式 二進制介紹 在初學計算機時我們常常會聽到2進制、8進制、10進制、16進制……

C++中String的語法及常用接口用法

在C語言中,string是一個標準庫類(class),用于處理字符串,它提供了一種更高級、更便捷的字符串操作方式,string 類提供了一系列成員函數和重載運算符,以便于對字符串進行操作和處理。 一、string…

scala TraversableOnce

scala TraversableOnce 1. 由來 TraversableOnce是Scala中的一個特質(trait),它定義了一組操作,用于遍歷和處理集合類型的元素。它是Scala集合層次結構中的基本概念之一。 2. 示例 以下是使用TraversableOnce的簡單示例&#…

Redis高可用:主從復制詳解

目錄 1.什么是主從復制? 2.優勢 3.主從復制的原理 4.全量復制和增量復制 4.1 全量復制 4.2 增量復制 5.相關問題總結 5.1 當主服務器不進行持久化時復制的安全性 5.2 為什么主從全量復制使用RDB而不使用AOF? 5.3 為什么還有無磁盤復制模式&#xff…

C# 一種求平方根的方法 立方根也可以 極大 極小都可以

不知道研究這些干啥&#xff0c;純純的浪費時間。。。 public static double TQSquare(double number){Random random1 new Random(DateTime.Now.Millisecond);double x1 0, resultX1 0, diff 9999999999, diffTemporary 0;for (int i 0; i < 654321; i){if (random1…

怎么做Tik Tok海外娛樂公會呢?新加坡市場怎么樣?

一、為什么選擇TikTok直播 1. 海外市場潛力巨大 ? 自2016年始&#xff0c;多家直播平臺陸續拓展至東南亞、中東、俄羅斯、日韓、歐美、拉美等地區。 ? 海外市場作為直播發展新藍海&#xff0c;2021年直播行業整申請cmxyci體規模達百億美元&#xff0c;并維持高速增長。 &a…

C++初階語法——內部類

前言&#xff1a;內部類&#xff0c;顧名思義是定義在類中的類&#xff0c;許多人會以為它屬于外部的類&#xff0c;實際上并不是&#xff0c;它們是兩個獨立的類&#xff0c;但是內部類受外部類類域的限制。 目錄 一.概念二.特性1.內部類和外部類相互獨立2.內部類是外部類的友…

10,遍歷任意參

遍歷可變參數 遍歷可變參數獲取可變參數大小通過遞歸方式遍歷可變參數通過可變參數特性來求和 遍歷可變參數 #pragma oncetemplate<class ... ParamTypes> void Func(paramTypes &... param) {}可以看作是有一個結構體里面裝滿了參數&#xff0c;把結構體放到…中。…

Git多版本并行開發實踐

本文目的&#xff1a; 實現多個項目同時進行的git多版本管理工作流。 名詞解釋&#xff1a; feature-XXXX&#xff1a;特性分支指CCS中一個項目或者一個迭代&#xff0c;在該分支上開發&#xff0c;完成后&#xff0c;合并&#xff0c;最后&#xff0c;刪除該分支&#xff0c;…

【廣州虛擬現實開發】VR智能中控系統進一步提高VR教學管理水平

隨著科技的不斷發展&#xff0c;虛擬現實(VR)技術已經逐漸走進了人們的生活。在教育領域&#xff0c;VR技術也得到了廣泛的應用&#xff0c;尤其是在教學終端中控系統方面。那么&#xff0c;廣州華銳互動開發的VR智能中控系統對學校有何益處呢&#xff1f; 首先&#xff0c;VR智…

RocketMQ(模式詳解,安裝)及控制臺安裝

下載 環境 64位操作系統&#xff0c;推薦 Linux/Unix/macOS 64位 JDK 1.8下載地址 https://rocketmq.apache.org/zh/download/ RocketMQ 的安裝包分為兩種&#xff0c;二進制包和源碼包。 二進制包是已經編譯完成后可以直接運行的&#xff0c;源碼包是需要編譯后運行的。 單…

LVS負載均衡DR(直接路由)模式

在LVS&#xff08;Linux Virtual Server&#xff09;負載均衡中的DR&#xff08;Direct Routing&#xff09;模式下&#xff0c;數據包的流向如下&#xff1a; 客戶端發送請求到負載均衡器&#xff08;LVS&#xff09;的虛擬IP&#xff08;VIP&#xff09;。負載均衡器&#x…

基于C++ 的OpenCV繪制多邊形,多邊形多條邊用不用的顏色繪制

使用基于C的OpenCV庫來繪制多邊形&#xff0c;并且為多邊形的不同邊使用不同的顏色&#xff0c;可以按照以下步驟進行操作&#xff1a; 首先&#xff0c;確保你已經安裝了OpenCV庫并配置好了你的開發環境。 導入必要的頭文件&#xff1a; #include <opencv2/opencv.hpp&g…

Bryntum Scheduler Pro 5.5.1 Crack

BRYNTUM 調度程序專業版,專業的日程安排小部件 Bryntum Scheduler Pro 5.5.1 一個專業有大腦的調度UI組件。Scheduler Pro 可幫助您安排任務&#xff0c;同時考慮資源和任務的可用性。 連接您的任務 讓 Scheduler Pro 處理剩下的事情。它將根據您定義的鏈接安排您的任務并遵守任…

BNC連接器市場分析:全球BNC連接器市場規模不斷增長

產品定義及統計范圍 BNC&#xff08;Bayonet-Neill-Concelman&#xff09;連接器是一種通常用于視頻和音頻信號傳輸的電連接器。它是以其兩位發明者Paul Neill和Carl Concelman的名字命名的&#xff0c;他們在20世紀40年代末開發了這種連接器。BNC連接器是一種設計用于同軸電纜…