AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

云音樂2023年報(bào)前端大揭秘

來源: 責(zé)編: 時(shí)間:2024-07-09 07:02:58 756觀看
導(dǎo)讀前言每年的云音樂年度聽歌報(bào)告,就像一個(gè)靠譜的老朋友,總會(huì)在忙碌一年的時(shí)光盡頭里叩響記憶的大門。如果你曾錯(cuò)過了彼時(shí)的年報(bào),不妨現(xiàn)在就拿起手機(jī)掃描上圖的二維碼,與往期的精彩視聽來一場(chǎng)不期而遇的邂逅;如果你為年報(bào)中精

前言

每年的云音樂年度聽歌報(bào)告,就像一個(gè)靠譜的老朋友,總會(huì)在忙碌一年的時(shí)光盡頭里叩響記憶的大門。cZ228資訊網(wǎng)——每日最新資訊28at.com

  • 如果你曾錯(cuò)過了彼時(shí)的年報(bào),不妨現(xiàn)在就拿起手機(jī)掃描上圖的二維碼,與往期的精彩視聽來一場(chǎng)不期而遇的邂逅;
  • 如果你為年報(bào)中精巧而溫馨的動(dòng)畫而深深著迷,請(qǐng)直接移步至本文的姊妹篇:「云音樂2023年報(bào)動(dòng)效大揭秘」一探究竟;
  • 如果你恰好想了解年報(bào)中前端開發(fā)承擔(dān)了什么樣的角色、積累了哪些最佳實(shí)踐 ——那么巧了,本文將從性能體驗(yàn)、質(zhì)量管理、工程效率和一些筆者底層思考,幫助你逐步揭開年報(bào)的神秘面紗

性能體驗(yàn)

首次訪問年報(bào)活動(dòng)為例,好的用戶體驗(yàn)主要包括以下幾個(gè)方面:cZ228資訊網(wǎng)——每日最新資訊28at.com

  • 頁面能秒級(jí)打開,頁面到達(dá)率高、流失少;
  • 頁面間轉(zhuǎn)場(chǎng)展示流暢,不會(huì)出現(xiàn)卡頓;
  • 文本和圖片內(nèi)容在任何設(shè)備上都能完整展示,不出現(xiàn)缺失或者加載閃爍情況;
  • 音頻或視頻啟播速度快,播放過程中不發(fā)生錯(cuò)亂或者卡頓情況;
  • 頁面內(nèi)的動(dòng)效展示流暢,不會(huì)出現(xiàn)卡頓;

圖片圖片cZ228資訊網(wǎng)——每日最新資訊28at.com

簡(jiǎn)而言之,體驗(yàn)優(yōu)涉及以下幾個(gè)方面:cZ228資訊網(wǎng)——每日最新資訊28at.com

1、頁面導(dǎo)航:包括首屏秒開,頁面轉(zhuǎn)場(chǎng)等cZ228資訊網(wǎng)——每日最新資訊28at.com

2、資源管理:包括圖片、視頻、音頻和字體包等cZ228資訊網(wǎng)——每日最新資訊28at.com

3、頁面適配:包括文本適配、動(dòng)效適配和機(jī)型適配等cZ228資訊網(wǎng)——每日最新資訊28at.com

首屏秒開

首屏秒開是指用戶從點(diǎn)擊鏈接開始到展示頁面內(nèi)容大約在1s左右完成。整個(gè)過程經(jīng)歷如圖所示:cZ228資訊網(wǎng)——每日最新資訊28at.com

容器初始化 -> CDN -> TCP 建連 -> html/js/css 加載解析 -> DOM / CSSOM 解析 -> 渲染布局 -> 繪制cZ228資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cZ228資訊網(wǎng)——每日最新資訊28at.com

對(duì)于前端開發(fā)來說,優(yōu)化難度是從右到左,越到左邊就越需要跨團(tuán)隊(duì)合作來完成。可以簡(jiǎn)單的分析總結(jié):cZ228資訊網(wǎng)——每日最新資訊28at.com

  • 在渲染/繪制階段,可以隔離狀態(tài)變化頻繁的組件,減少無效狀態(tài)引起的繪制。盡量選擇由 GPU 渲染的 CSS3 來實(shí)現(xiàn)動(dòng)效。邏輯實(shí)現(xiàn)的動(dòng)效建議使用GSAP。
  • 在 DOM / CSSDOM 解析階段,可以減少 DOM 的嵌套深度,減少使用 JavaScript 直接修改元素樣式,減少不必要的 CSS,減少使用 CSS 選擇器等。
  • 在 HTML / JS / CSS 加載解析階段,可以通過構(gòu)件工具對(duì)文件進(jìn)行壓縮。利用離線包能力,將這些資源提前下載到本地。
  • 在 CDN、TCP 建連階段,更多依賴 App 網(wǎng)絡(luò)庫(kù)底層的優(yōu)化,如使用 HTPP/2 減少 TCP 連接數(shù)。
  • 在容器初始化階段,為了達(dá)到極致的打開速度,可以將 H5 容器進(jìn)行預(yù)初始化。也可以建立容器復(fù)用池,減少容器創(chuàng)建的耗時(shí)。

頁面管理

頁面路由

為了有效管控年報(bào)中多個(gè)視圖的高效展示和切換,采用了 SPA[1] 的形式對(duì)H5進(jìn)行組織,同時(shí)為頁面路由提供了路由表的配置。cZ228資訊網(wǎng)——每日最新資訊28at.com

路由表簡(jiǎn)單理解是各個(gè)子頁面路由對(duì)象的集合,這個(gè)集合可以是全局?jǐn)?shù)組對(duì)象,本地文件,或者服務(wù)端下發(fā)的配置。集合內(nèi)的順序決定了用戶看到報(bào)告頁順序。這樣也可以根據(jù)產(chǎn)品的述求,靈活調(diào)整集合內(nèi)的順序,這樣就能動(dòng)態(tài)調(diào)整頁面順序了。cZ228資訊網(wǎng)——每日最新資訊28at.com

各個(gè)子頁面路由對(duì)象的屬性具體如下。建議不用傳統(tǒng)的 path,因?yàn)樽禹撁鏀?shù)量多,且名稱很難記憶,可以使用 routerIndex,這是子頁面在交互稿中的位置代號(hào),方便開發(fā)和調(diào)試。其中 ignoreSwipe 是使用在下節(jié)手勢(shì)處理中「子容器接管父容器手勢(shì)」的場(chǎng)景。cZ228資訊網(wǎng)——每日最新資訊28at.com

export interface PageProps {    model: unknown;    position?: number; // 頁面埋點(diǎn)使用}export interface PageRouteProps {    c: ComponentType<PageProps>;    cId: string; // 當(dāng)前頁面唯一id    routerIndex: number | string; // 路由索引    ignoreSwipe?: boolean; // 是否忽略滑動(dòng),默認(rèn)false}

手勢(shì)處理

年報(bào)項(xiàng)目中用戶可以通過點(diǎn)擊、左右滑動(dòng)、上下滑動(dòng)來切換頁面。為了防止手勢(shì)沖突,全局只有一個(gè)父容器,各個(gè)報(bào)告頁面是子容器;一些手勢(shì)頻控、頁面狀態(tài)變化等通用邏輯統(tǒng)一在父容器中實(shí)現(xiàn)。只在父容器中使用 hammerjs 做手勢(shì)監(jiān)聽,子容器不再負(fù)責(zé)頁面切換的手勢(shì)監(jiān)聽,關(guān)鍵代碼如下。cZ228資訊網(wǎng)——每日最新資訊28at.com

hammer = new Hammer(reportRef.current); hammer.get('swipe').set({ direction: Hammer.DIRECTION_ALL }); hammer.on('swipeleft', onNextPageWrap); hammer.on('swiperight', onPrePageWrap); hammer.on('swipeup', onNextPage); hammer.on('swipedown', onPrePage);

對(duì)于子容器,可能會(huì)有以下幾種特殊情況:cZ228資訊網(wǎng)——每日最新資訊28at.com

情況一:如果子容器需要感知用戶手勢(shì)事件,可以監(jiān)聽父容器發(fā)出的自定義事件。cZ228資訊網(wǎng)——每日最新資訊28at.com

// 【翻頁】動(dòng)效:下一頁export const ON_PAGE_NEXT = 'ON_PAGE_NEXT';// 【翻頁】動(dòng)效:上一頁export const ON_PAGE_PREV = 'ON_PAGE_PREV';

情況二:如果子容器需要完全接管父容器的手勢(shì)監(jiān)聽事件,例如年度歌手相關(guān)的所有頁面。首先需要在路由表中將 ignoreSwipe=ture 設(shè)置忽略手勢(shì),然后在監(jiān)聽父容器發(fā)出的通知,進(jìn)行自定義的事件處理。最后當(dāng)子容器接管結(jié)束后,需要根據(jù)需要再次觸發(fā)父容器的切換事件。關(guān)鍵代碼如下:cZ228資訊網(wǎng)——每日最新資訊28at.com

const onNextPage = useCallback(    (nextAction) => {        if (currentPage >= len - 1) {            nextAction(); // 結(jié)束接管,再次觸發(fā)父容器的切換事件            return;        }                setCurrentPage(currentPage + 1);    },    [currentPage, len]);useEffect(() => {        bus.on(ON_PAGE_NEXT, onNextPage);        return () => {            bus.off(ON_PAGE_NEXT, onNextPage);        };    }, [onNextPage, onPrePage]);

情況三:如果子容器存在特定區(qū)域需要響應(yīng)特點(diǎn)手勢(shì),例如歌手來信頁面左右切換是查看歌手來信。這時(shí)候需要子容器調(diào)用stopPropagation主動(dòng)阻止手勢(shì)向父容器傳遞。cZ228資訊網(wǎng)——每日最新資訊28at.com

轉(zhuǎn)場(chǎng)實(shí)現(xiàn)

在路由表和手勢(shì)處理準(zhǔn)備就緒后,最后來看看頁面之間轉(zhuǎn)場(chǎng)的實(shí)現(xiàn)。年報(bào)頁面的轉(zhuǎn)場(chǎng)效果使用React官方實(shí)現(xiàn)的 react-transition-group 組件。由于篇幅限制,這里不詳細(xì)介紹react-transition-group 組件的底層原理。結(jié)合路由表順序和當(dāng)前頁面位置,通過 z-index 和 match 來控制子頁面的層級(jí)和顯示隱藏。使用 CSSTransition 實(shí)現(xiàn)頁面間的進(jìn)場(chǎng)和退場(chǎng)CSS動(dòng)畫。關(guān)鍵代碼如下:cZ228資訊網(wǎng)——每日最新資訊28at.com

(pages || []).map((item, index) => {    // zIndex 和 match是關(guān)鍵代碼    const zIndex = (pages.length - index) * 100;    const match = index === currentIdx;    return (        <div            key={item.cId}            style={{                zIndex,                pointerEvents: match ? 'auto' : 'none',                overflow: 'hidden',            }}>                <CSSTransition                    in={match}                    timeout={100}                    ...                    appear                    unmountOnExit>                    <item.c                        model={item.model}                        positinotallow={index} />                </CSSTransition>          </div>            );})

但是以上的頁面轉(zhuǎn)場(chǎng)存在一個(gè)問題,即頁面之間只能存在一種轉(zhuǎn)場(chǎng)方式。如何自定義頁面之間的轉(zhuǎn)場(chǎng)效果?基本思路是各自頁面維護(hù)自己的轉(zhuǎn)場(chǎng)效果;大部分頁面只需將轉(zhuǎn)場(chǎng)信息配置到路由表中;小部分頁面可以通過頁面上下文獲得上一個(gè)或者下一個(gè)頁面的信息,動(dòng)態(tài)決定如何進(jìn)場(chǎng)或者退場(chǎng)。基于該思路,改造路由表對(duì)象,新增一個(gè) TransitionParams 協(xié)議,并且提供漸隱漸顯的默認(rèn)轉(zhuǎn)場(chǎng)實(shí)現(xiàn)。關(guān)鍵代碼如下:cZ228資訊網(wǎng)——每日最新資訊28at.com

export type TransitionParams = {    timeout: number | { appear?: number | undefined; enter?: number | undefined; exit?: number | undefined };    classNames: CSSTransitionClassNames;};export interface PageRouteProps {    c: ComponentType<PageProps>;    cId: string; // 當(dāng)前頁面唯一id    routerIndex: number; // 路由索引    transition: TransitionParams; //默認(rèn)是漸隱漸顯的轉(zhuǎn)場(chǎng)效果    ignoreSwipe?: boolean; // 是否忽略滑動(dòng),默認(rèn)false}

CSSTransition 配合改造后的關(guān)鍵代碼如下:cZ228資訊網(wǎng)——每日最新資訊28at.com

<CSSTransition    in={match}    timeout={item.transition.timeout}    // 關(guān)鍵代碼    classNames={item.transition.classNames}    appear    unmountOnExit>        <item.c model={item.model} positinotallow={index} /></CSSTransition>

資源管理

資源管理主要任務(wù)是將網(wǎng)絡(luò)資源下載到本地,最終將本地資源加載到內(nèi)存,以便程序可以使用這些資源。優(yōu)化資源管理可以有效提高年報(bào)用戶體驗(yàn)。通常開發(fā)者會(huì)通過壓縮資源的大小,并通過內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)加快資源的下載速度。但是除了這些還有其他通用的方法呢?cZ228資訊網(wǎng)——每日最新資訊28at.com

在介紹具體優(yōu)化手段前,先來看以下關(guān)鍵字,這些是性能優(yōu)化的通用方法。cZ228資訊網(wǎng)——每日最新資訊28at.com

  • 提前 preload:提前準(zhǔn)備必要的資源,提升加載速度
  • 同步 sync:串行執(zhí)行當(dāng)前任務(wù),確保執(zhí)行任務(wù)的優(yōu)先級(jí)
  • 異步 async:工作線程異步執(zhí)行,處理比較耗時(shí)的操作,不阻塞主線程
  • 懶加載 lazy:又稱按需加載,不浪費(fèi)請(qǐng)求
  • 緩存 cache:將資源緩存到內(nèi)存或者磁盤本地,減少不必要的網(wǎng)絡(luò)請(qǐng)求
  • 延遲 defer:不立即執(zhí)行任務(wù),延遲執(zhí)行

總結(jié)如下圖:cZ228資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cZ228資訊網(wǎng)——每日最新資訊28at.com

接下來,將從圖片、視頻、字體包等各個(gè)資源,進(jìn)一步解析如何結(jié)合上述關(guān)鍵詞進(jìn)行優(yōu)化。cZ228資訊網(wǎng)——每日最新資訊28at.com

圖片

關(guān)鍵字:提前 preload、懶加載 lazy、緩存 cache

圖片資源占整個(gè)年報(bào)項(xiàng)目資源中的比例是最高的,大概 70% 左右。所以圖片展示速度是否足夠快和內(nèi)容是否完整都會(huì)直接影響用戶體驗(yàn)。cZ228資訊網(wǎng)——每日最新資訊28at.com

優(yōu)先將圖片資源使用 tinypng 進(jìn)行手動(dòng)壓縮,在不失真的情況下,保證圖片大小足夠小。其次正確選擇圖片格式能有效減少圖片大小。其中圖片格式很多,主流的有:cZ228資訊網(wǎng)——每日最新資訊28at.com

  • SVG 是基于XML的矢量圖片格式,不失真無限放大。支持動(dòng)畫。
  • JPEG 是有損壓縮,不支持透明度或者動(dòng)畫。
  • PNG 是無損壓縮,支持透明度。APNG 是 PNG 的擴(kuò)展,支持動(dòng)胡奧。
  • WebP 是無損和有損壓縮,支持動(dòng)畫或者透明度。
  • GIF 是位圖圖片格式,支持動(dòng)畫。

不同圖片格式在不同場(chǎng)景上使用。格式?jīng)]選準(zhǔn)確,會(huì)導(dǎo)致資源浪的費(fèi)。如在「年度總覽」一頁中,海浪

本文鏈接:http://www.tebozhan.com/showinfo-26-99645-0.html云音樂2023年報(bào)前端大揭秘

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 我們聊聊如何分析Rust進(jìn)程使用了多少內(nèi)存?

下一篇: 我讓代碼,學(xué)會(huì)了自動(dòng)評(píng)審!提高80%的交付質(zhì)量!

標(biāo)簽:
  • 熱門焦點(diǎn)
Top