国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Flutter For Web性能優(yōu)化和新場景探索

開發(fā) 前端
FFW的html渲染模式,首開速度已經(jīng)接近傳統(tǒng)Vue.js站點;canvaskit模式的刷新幀率效率,也已經(jīng)接近App端的flutter代碼。但是,后者的首屏速度,由于必要的noto字體和wasm內(nèi)核文件,首開耗時依然過久。

背景

近些年隨著Flutter開發(fā)的App不斷涌現(xiàn),其靈活高效的編程體驗、建設(shè)良好的開發(fā)生態(tài)和后期易維護等優(yōu)點,逐漸得到開發(fā)者和企業(yè)的認可。

Flutter代碼稍作調(diào)整,即可同時編譯、打包出來App和Web/H5站點。后者即為Flutter For Web(簡寫FFW)。例如:若App內(nèi)嵌了Flutter頁面,那么這些頁面就可以被重復(fù)利用,生成M站。

但是FFW直接產(chǎn)出的Web/H5站點,首屏加載速度普遍較慢。另外,深入使用FFW也會發(fā)現(xiàn),其2種渲染模式在復(fù)雜頁面的交互上,有不同程度的卡頓問題。

針對上述性能問題的解決,作者做了較為詳盡的調(diào)研:本文首先分享了性能優(yōu)化的經(jīng)驗;然后引入element-embedding的概念;最后分享一種探索出的、適用于某些場景的試驗方案。

一.渲染模式及性能優(yōu)化

FFW有2種渲染模式,是由同一套源碼,使用2種不同的命令,打包出來的2套編譯產(chǎn)物。

1.1渲染模式介紹

  • html渲染模式:Flutter采用html的custom element,CSS,canvas和SVG來渲染UI元素。值得注意的是,此模式最終產(chǎn)物的html標簽數(shù)量十分有限,仍以canvas繪制為核心。這也是導(dǎo)致其不夠“瀏覽器友好”的原因。
  • canvaskit渲染模式:Flutter將 Skia 編譯成 WebAssembly 格式,并使用 WebGL 渲染。此模式必需加載wasm內(nèi)核文件和noto字體文件。此模式性能表現(xiàn)、瀏覽器兼容性表現(xiàn)更優(yōu)秀。若是對首屏速度要求較少的場景,如內(nèi)部Web系統(tǒng),建議使用此模式。

1.2優(yōu)化經(jīng)驗(html渲染)

?1.2.1首屏速度優(yōu)化

  • Icon font裁剪。若項目中使用到了MaterialDesign圖標字體庫,請使用最新的Flutter SDK,在編譯期間自動對字體資源進行了裁剪,并重新生成otf/ttf文件。
  • gzip開啟。若Server端開啟gzip,主Javascript文件(main.dart.js)的體積優(yōu)化將超過1倍。
  • 分片和hash化。主Javascript文件體積較大,可以利用腳本在每次打包之前,將其拆分成n個子文件;在入口處增加邏輯,用戶在進入html后,并行下載n個子文件,最后動態(tài)組裝。
  • 可借助flutter_web_optimizer工具庫。打包命令:
flutter build web --web-renderer html --release --pwa-strategy none  
flutter pub run flutter_web_optimizer optimize --asset-base ./
  • 主html優(yōu)化。利用傳統(tǒng)前端優(yōu)化方法:defer、preconnect和dns-prefetch等屬性配置。

? 1.2.2 刷新幀率優(yōu)化

  • build刷新相關(guān):
  1. 局部刷新。目的是減少rebuild范圍。在大型、復(fù)雜頁面的性能優(yōu)化上,可以利用StreamBuilder或Provider機制,實現(xiàn)局部刷新。
  2. Clean的build方法。不在build方法內(nèi)進行邏輯計算。通過DevTools性能監(jiān)測工具,可以發(fā)現(xiàn)用戶交互操作(如滾動長列表)后,build方法可能被頻繁調(diào)用。所以build方法越復(fù)雜,越可能導(dǎo)致卡頓等性能問題。
  3. 多使用無狀態(tài)的、靜態(tài)化的Widget。如:若Widget不涉及狀態(tài),就封裝為StatelessWidget。又如:用得上KeeppAlive模式的Widget,在性能優(yōu)化的時候,也可以加以使用,以獲得Widget的狀態(tài)保持、減少build刷新。
  • Scroll組件相關(guān)
  1. SingleChildScrollView內(nèi)嵌Column。若情況為“列表item結(jié)構(gòu)復(fù)雜、不統(tǒng)一,且item數(shù)量有限”時建議使用。
  2. ListView.builder。若情況為“列表的item結(jié)構(gòu)類似,或長度很長、甚至不限”時使用。其優(yōu)點是可動態(tài)復(fù)用item的資源,節(jié)省內(nèi)存開銷。
  3. 可以采用自定義的“彈簧屬性”的physics。自定義的physics可調(diào)整滾動的速度、延伸、回彈效果等。
class AhCustomScrollPhysics extends ScrollPhysics {
  const AhCustomScrollPhysics({ScrollPhysics? parent}) : super(parent: parent);

  @override
  AhCustomScrollPhysics applyTo(ScrollPhysics? ancestor) {
    return AhCustomScrollPhysics(parent: buildParent(ancestor));
  }

  @override
  SpringDescription get spring => SpringDescription.withDampingRatio(
        mass: 0.1,   //質(zhì)量,控制滾動的慣性
        stiffness: double.maxFinite, //剛性,滾動收尾速度
        ratio: 0.1,  //damping: 0.1, //阻尼,俗稱摩擦力
      );

1.3優(yōu)化經(jīng)驗(canvaskit渲染)

?1.3.1首屏速度優(yōu)化

  • wasm內(nèi)核處理

在主html里配置canvaskit.wasm加載路徑的前綴(最新FlutterSDK支持的功能)。

或者存放在國內(nèi)CDN并使用url前綴。

否則此文件會從Google的一個外網(wǎng)CDN匹配和下載,國內(nèi)訪問速度較慢。

goCanvaskit = () => {
        console.log(target);
        _flutter.loader.loadEntrypoint({
            entrypointUrl: "./flutter_canvaskit/main.dart.js", 
            onEntrypointLoaded: async (engineInitializer) => {
                let appRunnerCanvaskit = await engineInitializer.initializeEngine({
                    hostElement: target,
                    canvasKitBaseUrl: "./flutter_canvaskit/canvaskit/", //前綴處理
                });
                await appRunnerCanvaskit.runApp();
                console.log("canvaskit loaded.");
            }
        });
    };

  • noto字體處理。

在入口處(main.dart)里主動下載、加載noto字體。

否則,此文件將從外網(wǎng)CDN匹配和下載;并且加載過程中,界面的文字會展示亂碼。

var fontLoader2 = FontLoader("Noto Sans SC");
fontLoader2.addFont(fetchFont2());
await fontLoader2.load()
Future<ByteData> fetchFont2() async {
  var url = Uri.parse(
    'http://{your-cdn-host}/ah-assets/k3kXo84MPvpLmixcA63oeALhL4iJ-Q7m8w%20%281%29.otf'
  );
  final response = await http.get(url);
  if (response.statusCode == 200) {
    return ByteData.view(response.bodyBytes.buffer);
  } else {
    throw Exception('Failed to load font');
  }
}

?1.3.2刷新幀率優(yōu)化

同html的刷新幀率優(yōu)化。

1.4首屏優(yōu)化數(shù)據(jù)

html模式數(shù)據(jù)分析對比

抽樣測速的數(shù)據(jù)抽樣測速的數(shù)據(jù)

同內(nèi)容的、Vue.js線上版本,抽樣測速數(shù)據(jù)同內(nèi)容的、Vue.js線上版本,抽樣測速數(shù)據(jù)

首次加載, js大文件列表首次加載, js大文件列表

1.5分析結(jié)果

FFW的html渲染模式,首開速度已經(jīng)接近傳統(tǒng)Vue.js站點;canvaskit模式的刷新幀率效率,也已經(jīng)接近App端的flutter代碼。但是,后者的首屏速度,由于必要的noto字體和wasm內(nèi)核文件,首開耗時依然過久。

另外,html模式在刷新幀率上有略卡頓的問題。這是由于渲染產(chǎn)物使用了較少的html標簽,主要仍依靠canvas繪制;而主流瀏覽器對于canvas繪制的優(yōu)化,遠沒有html標簽、DOM樹成熟。

Google團隊已經(jīng)將canvaskit渲染模式作為未來優(yōu)化的方向。為了提升加載速度,在 112 或更高版本的 Chromium中優(yōu)化了wasm的底層支持,以縮小wasm的體積和提升性能表現(xiàn)。但是短期內(nèi)現(xiàn)狀難以得到有效解決。

所以問題歸結(jié)為:首開速度和交互性能,不能兼得。

最新的element-embedding技術(shù),為解決此“二選一”難題提供了新的思路。

二. element-embedding新功能

element-embedding是Flutter SDK 3.7的新功能;在2023年的Flutter Forward大會上被推出。在Github的Flutter Sample項目,有兩個demo:html+js集成和Angular.js集成。

圖片圖片

? 特性:

  1. Flutter的渲染產(chǎn)物,可以作為一個div里的canvas繪制層,而被宿主使用;
  2. 這個div可以在任何合適的時機被開啟渲染(否則不會加載);
  3. Flutter的代碼與它的宿主代碼(Angular.js或Vue.js等),可以通過js函數(shù)通信。

? 優(yōu)點:

  1. 低侵入性:與傳統(tǒng)Vue.js等項目的“混合”,不影響宿主的首屏加載速度等。
  2. 可交互性:通過js函數(shù)即可完成與宿主的通信。
  3. 增加了FFW的使用場景。

三. 替換AB方案

3.1利用FFW打包2種渲染產(chǎn)物

利用FFW可以方便地打包2種渲染產(chǎn)物的特性:

  1. 首屏速度較快,使用html渲染產(chǎn)物。
  2. 后續(xù)交互性能為了更順滑,使用canvaskit渲染產(chǎn)物。

3.2目標是切換過程中用戶無感

  1. 前者內(nèi)嵌1個后者的隱藏element-embedding。它會在前者加載完畢后“延遲加載”。
  2. 在合適的時機,把前者的“狀態(tài)參數(shù)”傳遞給后者。
  3. 后者更新狀態(tài)后,“靜默替換”展示。

3.3方案描述

圖片圖片

  1. html渲染產(chǎn)物作為“宿主”,首先被加載。
  2. canvaskit渲染產(chǎn)物是一個內(nèi)部隱藏的element-embedding。
  3. 當用戶每一次交互“操作”后,都判斷一下canvaskit是否渲染完畢。
  4. 如果canvaskit已經(jīng)渲染完畢,則傳參、切換、展示。
  5. 用戶的操作狀態(tài)得以保持。由于用戶的交互狀態(tài)(滾動位置、切換位置等)通過傳參得到保持,切換的過程“近乎無感”。

3.4應(yīng)用場景

 頁面交互(滾動、點擊、切換等)操作不太復(fù)雜的場景。 

 最后

在純Web開發(fā)領(lǐng)域,傳統(tǒng)框架(Vue.js,React.js等)仍是優(yōu)先的選擇。但是,經(jīng)過技術(shù)探索,仍能找到FFW的一些應(yīng)用場景。尤其App端Flutter代碼轉(zhuǎn)為Web/H5的需求很強時,可以考慮使用本文最后講述的、經(jīng)過優(yōu)化和重新架構(gòu)的FFW方案。

作者簡介

魏子博魏子博

■ 經(jīng)銷商技術(shù)部-移動APP團隊

■ 之家新人,移動端全棧開發(fā)經(jīng)驗。

責任編輯:武曉燕 來源: 之家技術(shù)
相關(guān)推薦

2011-01-07 12:56:18

Web性能優(yōu)化

2014-12-10 10:12:02

Web

2022-03-02 11:13:50

Web前端開發(fā)

2020-03-30 14:00:21

Flutter前端代碼

2022-07-08 09:38:27

攜程酒店Flutter技術(shù)跨平臺整合

2012-01-10 16:22:25

Web

2015-06-23 16:36:11

Web性能優(yōu)化

2023-10-31 12:50:35

智能優(yōu)化探索

2015-08-17 10:35:56

Web性能優(yōu)化

2013-01-22 15:27:23

WebWeb前端

2021-12-28 17:57:45

ESNoSQL數(shù)據(jù)庫

2025-04-03 03:55:00

2025-12-02 00:45:00

2010-05-28 10:23:59

JavaScriptWeb

2012-12-24 09:55:15

JavaJava WebJava優(yōu)化

2015-09-15 10:54:54

HTTP2 WEB 性能優(yōu)化

2015-09-15 10:40:26

HTTP2 WEB 性能優(yōu)化

2014-03-19 14:34:06

JQuery高性能

2022-08-01 14:59:57

Web前端后端

2015-09-15 10:46:29

點贊
收藏

51CTO技術(shù)棧公眾號

99riav一区二区三区| 69成人精品免费视频| 日韩国产高清一区| 天天综合精品| 国产精品日韩专区| 美女扒开腿让男人桶爽久久动漫| 亚洲成色777777女色窝| 超碰个人在线| 欧美一区二区三区精品| 精品自拍一区| 欧美一区二区三区四区在线观看| 韩国三级在线观看久| 天天操天天综合网| 一级片在线免费看| 欧美天堂在线观看| 日本成人一区二区三区| 日韩欧美一区二区三区| 日本韩国一区| 欧美婷婷六月丁香综合色| 国产美女性感在线观看懂色av | 日本在线视频1区| 亚洲天堂福利av| 亚洲一区日韩精品| 亚洲欧美日韩精品久久久久| 国产美女玉足交| 亚洲特级片在线| 天堂中文av| 色婷婷精品久久二区二区蜜臀av | 一区二区成人在线| 在线播放你懂的| 91精品国产综合久久久蜜臀图片| av中文字幕在线播放| 精品亚洲一区二区三区在线观看 | 国产又黄又猛又粗| 亚洲日本乱码在线观看| 簧片在线观看| 欧美亚洲国产bt| 丝袜国产在线| 色99之美女主播在线视频| 精品无人区一区二区| 成人黄色av播放免费| 国产欧美日韩亚洲一区二区三区| 欧美xxxx黑人又粗又长密月| 蜜乳av另类精品一区二区| 日韩精品一区二区三区电影| 91蝌蚪porny| 在线观看视频免费| 91精品国产综合久久精品图片| 午夜av成人| 热久久视久久精品18亚洲精品| 91精品国产91久久久久久黑人| 欧美二区三区| av在线综合网| 天天综合入口| 日韩欧美高清在线| 国产午夜精品一区在线观看 | 色94色欧美sute亚洲13| 在线午夜影院| 欧美成人中文字幕在线| 国产精品成人av| 中文字幕日韩精品久久| 亚洲国产精品激情在线观看| 久蕉依人在线视频| 亚洲人成绝费网站色www| 中文精品一区二区| 正在播放一区二区三区| 亚洲激情av在线| zzzwww在线看片免费| 热久久这里只有| 另类欧美日韩国产在线| 少妇高潮露脸国语对白| 日韩激情在线视频| blacked蜜桃精品一区| 国产精品12p| 亚洲va天堂va国产va久| 写真福利精品福利在线观看| 亚洲一区二区三区在线免费观看| 国产成人av电影在线播放| 在线亚洲电影| 久久精品99久久香蕉国产色戒| 在线一区免费| 午夜视频在线瓜伦| 日韩视频123| 日本a级不卡| 国产乱子夫妻xx黑人xyx真爽| 91精品欧美久久久久久动漫| 亚洲精品小区久久久久久| 正在播放亚洲| 欧美亚洲尤物久久| 欧美猛男男男激情videos| 一二三四视频社区在线| 日韩限制级电影在线观看| 精品国产一区二区三区| 韩国日本在线视频| 日韩av一区在线观看| 91久久中文| 伊人资源视频在线| 欧美成人免费大片| 国内成+人亚洲+欧美+综合在线| 国产三级视频在线看| 国产精品久久精品| 国产精品视频在线看| 国产69精品久久| 日本在线观看一区| 欧美日韩国产高清一区二区三区| 精品不卡一区| 男生操女生视频网站| 久久精品久久久久久国产 免费| 日本成人在线一区| jizzjizz在线观看| 国产美女精品视频| 国产精品免费看片| 日本精品久久| 免费高清一区二区三区| 日韩av资源在线播放| 日韩高清不卡一区二区| 高清在线观看av| 成人信息集中地欧美| 亚洲日本成人在线观看| 国产精品高清乱码在线观看| 一区二区三区视频| 精品日韩99亚洲| 久久一区国产| 欧美一级二级三级区| 国产精品久久久久免费| 欧美在线播放高清精品| 一区二区三区福利| 黄色av电影在线播放| 日本一区视频在线播放| 精品美女被调教视频大全网站| 奇米一区二区三区| 校园春色亚洲色图| 国产中文字幕免费观看| 久久久久久久久国产| 国产精品视频一二三| 视频精品在线观看| 欧洲综合视频| 久久婷婷人人澡人人喊人人爽| 欧美一区二区免费观在线| 丝袜诱惑亚洲看片| 国产免费拔擦拔擦8x在线播放| 性高潮久久久久久久久| 日韩精品亚洲精品| 国产99久久精品| 伊人久久亚洲| 五月天最新网址| 国产激情一区二区三区在线观看| 91精品国产91久久久久久一区二区| 男人的天堂久久精品| 国产乱码精品一区二三赶尸艳谈| 波多野结衣 作品| 久久福利视频导航| 亚洲免费看黄网站| 国产大片一区| 成人在线免费观看黄色| 福利视频一二区| 91精品国产色综合久久不卡98| 一区二区三区自拍| 销魂美女一区二区三区视频在线| 黄视频在线免费看| 国产肥臀一区二区福利视频| 欧美又大又粗又长| 欧美日韩国产一级二级| 国产不卡视频一区二区三区| 免费成人蒂法| www红色一片_亚洲成a人片在线观看_| 国产自产在线视频| 国产精品久久久久久久久借妻 | 欧美精美视频| 超碰在线影院| 欧美人与动牲交xxxxbbbb| 国内精品小视频| 日韩欧美国产一区二区| 精品一区二区日韩| 蜜桃a∨噜噜一区二区三区| 免费在线看黄色| 日本福利视频在线| 亚洲影影院av| 一区二区欧美激情| 亚洲在线成人精品| 捆绑紧缚一区二区三区视频| 久久365资源| 爆操欧美美女| 999www人成免费视频| 欧美不卡三区| 欧美精品久久一区二区| 欧美日韩精品系列| 91美女蜜桃在线| 日韩视频一区| aaa国产精品视频| 黄色网址在线免费| 国产福利在线免费| 一区二区三区四区五区视频 | 嫩草影视亚洲| 超碰91在线观看| 黄动漫在线看| 欧美黑人经典片免费观看| 97超碰最新| 久久免费国产视频| 亚洲国产黄色片|