FlutterWeb渲染模式及提速

背景

在使用Flutter Web開發的網站過程中,常常會遇到不同瀏覽器之間的兼容性問題。例如,在Google瀏覽器中動畫和交互都非常流暢,但在360瀏覽器中卻會出現卡頓現象;在Google瀏覽器中動態設置圖標顏色正常顯示,而在Safari瀏覽器中顏色會缺失變成黑色;甚至在某些電腦的Google瀏覽器中也會出現動畫卡頓和頁面報錯的問題。

優化方案

這些問題的根源在于渲染模式的選擇。將渲染模式從HTML改為CanvasKit后,大部分問題得以解決,動畫變得流暢,畫面也變得順滑,圖標顯示正常,兼容性也得到了提升。

渲染模式

  • HTML渲染模式:Flutter使用HTML的custom elementCSSCanvasSVG來渲染UI元素。
  • CanvasKit渲染模式:Flutter將Skia編譯成WebAssembly格式,并使用WebGL進行渲染。
HTMLCanvasKit
命令行–web-renderer html–web-renderer canvaskit
優點體積更小渲染性能強,多端一致
缺點渲染性能差,跨端兼容差體積相較HTML多2.5M

盡管CanvasKit模式提供了更流暢的體驗,但它也帶來了一些新的問題。

由CanvasKit引起的問題

圖片跨域

報錯描述:
Access to XMLHttpRequest at ‘https://…/icon/setting_228.webp’ from origin ‘https://…’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

在CanvasKit模式下,圖片請求類型變為xhr,不支持跨域,導致跨域問題。解決方法是將圖片放到與服務同域的目錄下。

首次打開加載慢

首次加載CanvasKit模式的網站時,會下載大量文件,包括CanvasKit繪制引擎和字體。解決方法是將引擎和字體文件存放到自己的服務器,以加快下載速度。

  1. 引擎本地化:下載引擎文件并放到項目中,然后在運行或打包時指定本地路徑。

    --dart-define=FLUTTER_WEB_CANVASKIT_URL=assets/canvaskit/
    
  2. 字體本地化:下載字體文件并放到本地,替換構建后的main.dart.js中的字體路徑。

字體需下載

Skia自繪引擎需要字體庫支持,導致首次加載時出現字體亂碼。解決方法是在pubspec.yaml中設置本地字體包。

main.dart.js 切片化

以上兩步只是加快了下載速度,但所需要下載的內容大小沒變,好在Flutter 官方提供 deferred as 關鍵字來實現 Widget 的懶加載,而 dart2js 在編譯過程中可以將懶加載的 Widget 進行按需打包,這樣的拆包機制叫做 Lazy Loading。借助 Lazy Loading,我們可以在路由表中使用 deferred 引入各個路由(頁面),以此來達到業務代碼拆離的目的。具體的代碼請看這篇文章《JS 分片優化》,很詳細。

試驗拆分后,main.dart.js由8.5M縮減至5.5M。

加載時提示

為了解決首次加載時白屏的問題,可以在白屏時加個提示。

html復制
<style>body {width: 100vw;height: 100vh;display: flex;justify-content: center;align-items: center;}
</style>
<div id="text">靜態資源加載中...</div>
瀏覽器刷新后頁面加載兩次

刷新頁面時會加載兩次,是由于serviceWorker注冊失敗導致。解決方法是注釋掉注冊邏輯,直接調用loadMainDartJs()

路由包裝url地址方式失效

在CanvasKit模式下,刷新后不會停留在當前頁面。解決方法是在刷新時記錄當前頁面,并在初始化時還原。

最后

盡管CanvasKit模式在動畫和交互體驗上優于HTML模式,但其加載速度較慢。在內部使用的網站中,可以優先考慮交互體驗。

參考

  1. Flutter web內網網站如何發布?解決外網下canvaskit.js和字體無法加載問題
  2. serviceWorker 服務器與瀏覽器之間的代理
  3. Flutter 開啟web構建以及web的兩種渲染模式

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

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

相關文章

8-阿里云服務器 ECS配置R及Studio Server

目錄 查看服務器系統 關于linux系統 安裝R 1,查看官方教程 2,安裝R ①修改sources.list文件 ②安裝R:點擊Y ③更新最新版R ④安裝 RStudio(省略此步驟) ?編輯 ⑤安裝 RStudio Server 登錄rstudio-server 1,添加賬號(root賬號不能登錄) 2,開啟8787端口訪…

SpringBoot+OSS實現文件上傳

創建spring boot項目 pom依賴 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version></dependency><dependency><groupId>javax.xml.bind</groupI…

SpringBoot項目練習

文章目錄 SpringBootVue后臺管理系統所需軟件下載、安裝、版本查詢Vue搭建一個簡單的Vue項目 Spring項目1項目架構 SpringBootVue后臺管理系統 學習視頻&#xff1a; https://www.bilibili.com/video/BV1U44y1W77D/?spm_id_from333.337.search-card.all.click&vd_sourcec…

深入Laravel事件系統:創建與使用事件的指南

Laravel的事件系統是一種強大的機制&#xff0c;它允許你將應用程序的行為封裝成事件&#xff0c;然后在適當的時候觸發這些事件。這不僅有助于代碼的解耦&#xff0c;還提高了應用程序的可維護性和可擴展性。本文將詳細介紹如何在Laravel中創建和使用事件&#xff0c;包括事件…

2024年7月6日隨筆

期末考試全部結束了&#xff0c;這個月是真累啊&#xff0c;一堆事&#xff0c;好在都熬過來了&#xff0c;上次參加的那個碼題杯自己居然進國賽了&#xff0c;我看了一下職業賽道和本科賽道的題&#xff0c;本科賽道的感覺要難上不少&#xff0c;比賽時間是一周后&#xff0c;…

Pytorch(筆記7損失函數類型)

前言 損失函數&#xff08;Loss Function&#xff09;&#xff1a;是定義在單個樣本上的&#xff0c;是指一個樣本的誤差&#xff0c;度量模型一次預測的好壞。 代價函數&#xff08;Cost Function&#xff09;成本函數經驗風險&#xff1a;是定義在整個訓練集上的&#xff0c…

集成學習(三)GBDT 梯度提升樹

前面學習了&#xff1a;集成學習&#xff08;二&#xff09;Boosting-CSDN博客 梯度提升樹&#xff1a;GBDT-Gradient Boosting Decision Tree 一、介紹 作為當代眾多經典算法的基礎&#xff0c;GBDT的求解過程可謂十分精妙&#xff0c;它不僅開創性地舍棄了使用原始標簽進行…

virtualbox窗口和win10窗口的切換

1、問題&#xff1a; 從windows切換到虛擬機可以用快捷鍵 ALTTAB&#xff0c;但是從虛擬機到windows使用 ALTTAB 無法成功切換 2、解決方法&#xff1a; 按下圖操作 按上面步驟設置之后&#xff0c;每次要從虛擬機窗口切換到windows窗口 只需要先按 CtrlAlt 跳出虛擬機窗口&…

【已解決】“import ... =“ 只能在 TypeScript 文件中使用

現象 在使用 import 語法的時候&#xff0c;代碼報紅&#xff0c;提示&#xff1a;“import ... “ 只能在 TypeScript 文件中使用 原因 代碼被 VSCode 解析成 TypeScript 語法 解決方案&#xff1a; 關閉 JavaScript 的驗證啟用即可。 mac 快捷方式&#xff1a;comman s…

微機原理與單片機 知識體系梳理

單片機筆記分享 我個人感覺單片機要記的東西很多&#xff0c;也很瑣碎&#xff0c;特別是一些位、寄存器以及相關作用等&#xff0c;非常難以記憶。因此復習時將知識點整理在了一起做成思維導圖&#xff0c;希望對大家有所幫助。內容不是很多&#xff0c;可能有些沒覆蓋全&…

vue-tabs標簽頁引入其他頁面

tabs頁面 <template> <div class"app-container"> <el-tabs v-model"activeName" type"card" tab-click"handleClick"> <el-tab-pane label"套餐用戶列表" name"first"> <user-list r…

VMware CentOS7 Linux 網絡配置

本文主要描述VMware虛擬機的網絡配置。 如上所示&#xff0c;在CentOS Linux虛擬機中設置網絡連接使用橋接模式&#xff0c;該模式對接主機物理網絡&#xff0c;直接由主機的物理網絡的DHCP服務器動態分配IP地址&#xff0c;或者在CentOS Linux的操作系統的網絡配置中設置靜態的…

HACCP體系認證:守護食品安全的黃金標準

在食品生產過程中&#xff0c;食品安全始終是重中之重。為了確保食品的安全性和質量&#xff0c;越來越多的企業開始采用HACCP&#xff08;危害分析關鍵控制點&#xff09;體系認證。這個體系不僅能幫助企業預防食品安全問題&#xff0c;還能顯著提升產品質量和市場競爭力。 HA…

android新聞app(二)

新聞詳細頁&#xff1a; 歷史瀏覽記錄SQList&#xff1a; 分類&#xff1a; 歷史瀏覽記錄主體UI和詳細&#xff1a; 側邊欄&#xff1a; 參考&#xff1a;浩宇開發

如何給gitlab其他訪問者創建賬號并增加權限

嗨&#xff0c;今天創建了項目之后&#xff0c;我想把項目鏈接發送給其他人&#xff0c;讓他下載這個項目&#xff0c;結果發現對方打開顯示登錄的界面&#xff0c;沒錯&#xff0c;他要想使用這個git下載項目&#xff0c;首先他的有一個git賬號 接下來我找有權限的相關人員給他…

網絡“ping不通”,如何排查和解決呢?

網絡問題往往復雜且難以預測&#xff0c;其中“ping不通”是常見的網絡故障之一。 1. 確認問題現象 首先&#xff0c;明確問題是完全無法ping通(無響應)還是ping通但有高延遲或丟包。這有助于縮小問題范圍。 2. 本地檢查 網絡接口狀態&#xff1a;使用ifconfig(Linux)或ipc…

認識并理解webSocket

今天逛牛客&#xff0c;看到有大佬分享說前端面試的時候遇到了關于webSocket的問題&#xff0c;一看自己都沒見過這個知識點&#xff0c;趕緊學習一下&#xff0c;在此記錄&#xff01; WebSocket 是一種網絡通信協議&#xff0c;提供了全雙工通信渠道&#xff0c;即客戶端和服…

策略為王股票軟件源代碼-----如何修改為自己軟件61----資訊菜單修改-----舉例---------調用同花順網頁------

http://stock.sina.com.cn 將原來的新浪行情,修改為同花順, 搜索 stock.sina.com.cn... StkUI\View\InfoView.cpp(58):char

AI防損員的應用:正確率高達90%背后的真相與挑戰

1. AI防損員的工作原理 AI防損員利用圖像識別技術來判斷商超中的行為是否異常。它將所有觀察到的行為分為兩類&#xff1a;正常行為和異常行為。這是一種二分類問題。 2. 數據不平衡問題 在現實中的商超環境中&#xff0c;正常行為占絕大多數&#xff0c;異常行為&#xff08;…

MySQL——備份

為什么要備份&#xff1f; 保證重要的數據不丟失 方便數據轉移 MySQL數據庫備份方式&#xff1a; 1. 直接拷貝物理文件 2. 在可視化工具中手動導出 —— 在想要導出的表或者庫中&#xff0c;右鍵選擇備份或導出 3. 使用命令行導出 mysqldump ——cmd打開命令行 —…