參考資料
Flutter for Web 首次首屏優化 ——JS 分片優化_main.dart.js-CSDN博客文章瀏覽閱讀1.4k次。本文介紹了如何通過延遲加載組件和js分片優化Flutter for Web應用的加載速度。在實踐中,通過按需加載減少js文件大小,使用并行加載提升加載效率。通過延遲加載組件功能,將各頁面代碼拆分,減少初始加載體積。此外,通過在index.html中預加載分片js實現并行加載,進一步減少加載時間。實測結果顯示,優化措施顯著提升了頁面加載速度。https://blog.csdn.net/u012181546/article/details/128355930一個編譯問題帶你了解 Flutter Web 的打包構建和分包實現_flutter web js分包-CSDN博客文章瀏覽閱讀1.4k次。Flutter Web 作為 Flutter 框架中最特殊的平臺,由于 Web 平臺的特殊性,它默認就具備了兩種不同的渲染引擎:html : 通過平臺的 canvas 和 Element 完成布局繪制;canvaskit : 通過 Webassembly + Skia 繪制控件;雖然都知道 canvavskit 更接近 Flutter 的設計理念,但是由于它構建的 wasm 文件大小和字體加載等問題帶來的成本考慮,業界一般會選用更輕量化的 html 引擎,而今天的問題也是基于 html 引擎來展開。_flutter web js分包
https://blog.csdn.net/qq_39221436/article/details/123802726?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-123802726-blog-128355930.235^v43^pc_blog_bottom_relevance_base2&spm=1001.2101.3001.4242.1&utm_relevant_index=2Flutter for web 首次加載過慢問題優化_flutter web 字體-CSDN博客文章瀏覽閱讀6.8k次。本文針對Flutter for Web應用首次加載出現長時間白屏問題進行優化,主要從兩個方面著手:一是通過更換Canvaskit的加載地址,使用國內CDN加速;二是處理字體加載,避免在線加載Noto字體導致的延遲和亂碼,可選擇自定義字體并精簡資源。此外,刪除不必要的系統資源包和添加加載動畫也能提升用戶體驗。
https://blog.csdn.net/Bright_TY/article/details/120225419?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7EPaidSort-1-120225419-blog-128355930.235%5Ev43%5Epc_blog_bottom_relevance_base2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7EPaidSort-1-120225419-blog-128355930.235%5Ev43%5Epc_blog_bottom_relevance_base2&utm_relevant_index=1
deferred_helper | Flutter packageA plugin to help manage deferred content of a flutter ap
https://pub.dev/packages/deferred_helper
web性能查看工具
Debug performance for web apps | Flutter 中文文檔 - Flutter 中文開發者網站 - Flutter
官方給的優化方案
https://medium.com/flutter/best-practices-for-optimizing-flutter-web-loading-speed-7cc0df14ce5c
1、聲明 延遲(deferred)?導入包
如:
import 'package:myapp/hello.dart' deferred as hello;Future<void> loadHelloLibrary() async {await hello.loadLibrary();hello.sayHi();
}
2、圖片資源修改為webp格式
一、核心優化方向
1.?關鍵資源體積最小化
-
啟用 Tree Shaking 和壓縮:聲明html方式官方已不支持
-
Web 渲染器 | Flutter 中文文檔 - Flutter 中文開發者網站 - Flutter
-
canvaskit
?和?skwasm
flutter build web --release --web-renderer skwasm?
-
僅打包首屏必要代碼:
-
使用路由懶加載(如?
AutoRoute
?或手動?import()
)。 -
將非首屏組件(如彈窗、二級頁面)拆分為獨立模塊
-
-
移除冗余依賴:
-
檢查?
pubspec.yaml
,刪除未使用的包。 -
使用?
dependency_validator
?工具掃描未使用的依賴: -
flutter pub global activate dependency_validator
?使用
dart pub global run dependency_validator
2.?關鍵資源預加載
-
預加載主 JS 和字體:
在?web/index.html
?的?<head>
?中添加: -
<link rel="preload" href="main.dart.js" as="script"> <link rel="preload" href="fonts/Roboto.woff2" as="font" type="font/woff2" crossorigin>
-
?預連接 CDN 或域名(如使用 CDN 托管 CanvasKit):
-
<link rel="preconnect" href="https://unpkg.com">
3.?優化資源加載順序
-
延遲非關鍵資源:
-
將統計腳本、廣告 SDK 等移至頁面底部或用?
async
/defer
?加載: -
<script src="analytics.js" defer></script>
-
按需加載 CanvasKit(若必須使用):
-
# 構建時指定 CDN 路徑,避免打包到主資源 flutter build web --web-renderer canvaskit --dart-define=FLUTTER_WEB_CANVASKIT_URL=https://cdn.example.com/canvaskit/
-
二、渲染優化
1.?優先展示骨架屏
-
添加 Loading 占位圖:
-
在 Flutter 初始化完成前,通過 HTML/CSS 顯示一個簡單的骨架屏:
-
<!-- web/index.html --> <div id="skeleton" style="background: lightgray; width: 100%; height: 100vh;"></div> <script>window.addEventListener('load', function() {document.getElementById('skeleton').style.display = 'none';}); </script>
-
2.?優化字體加載
-
使用?
font-display: swap
:
在?web/styles.css
?中定義字體: -
@font-face {font-family: 'CustomFont';src: url('fonts/CustomFont.woff2') format('woff2');font-display: swap; /* 先顯示備用字體,再替換 */ }
-
子集化字體(僅保留必要字符)。
免布局抖動
-
固定圖片尺寸:
-
為?
Image
?組件明確指定?width
?和?height
,避免瀏覽器重排:
-
-
Image.asset('assets/logo.png', width: 200, height: 100)
三、服務端優化
1.?啟用 HTTP/2 和 Brotli 壓縮
-
Nginx 配置示例:
-
server {listen 443 ssl http2;gzip on;gzip_types text/plain text/css application/json application/javascript;brotli on; # 需要安裝 Brotli 模塊brotli_types text/plain text/css application/json application/javascript; }
-
Brotli 比 Gzip 壓縮率提高 20-30%。
2.?CDN 加速靜態資源
-
將以下內容托管到 CDN:
-
main.dart.js
-
CanvasKit 文件(
canvaskit.wasm
、canvaskit.js
) -
字體和圖片
-
3.?緩存策略
-
設置強緩存(
Cache-Control: max-age=31536000
)和哈希文件名: -
<!-- 在構建流程中為文件名添加哈希 --> <script src="main.dart.js?hash=abcd1234"></script>
四、深度優化技巧
1.?分析關鍵請求鏈
-
使用 Chrome DevTools 的?Network?面板:
-
過濾?
initiator
?為?parser
?的請求(關鍵鏈請求)。 -
優化最長任務(Long Tasks)和 TTI(Time to Interactive)。
-
2.?Service Worker 緩存
-
實現離線緩存和資源預加載:
// web/service-worker.js
self.addEventListener('install', (event) => {event.waitUntil(caches.open('v1').then((cache) => {return cache.addAll(['/', '/main.dart.js', '/styles.css']);}));
});
3.?動態加載渲染引擎
-
根據設備能力動態選擇渲染器:
-
// 在 web/index.html 中檢測設備性能 if (isLowEndDevice) {window.flutterWebRenderer = "html"; } else {window.flutterWebRenderer = "canvaskit"; }
五、效果驗證
優化項 | 優化前 (3G 網絡) | 優化后 (3G 網絡) |
---|---|---|
首屏加載時間 | 4.8s | 1.2s |
LCP (最大內容渲染) | 5.1s | 1.5s |
JS 總體積 (gzip) | 2.1MB | 680KB |
操作步驟總結:
-
構建優化:啟用 Release 模式,選擇 HTML 渲染器,代碼分割。
-
資源預加載:預加載主 JS、字體,預連接 CDN。
-
服務端加速:啟用 HTTP/2 + Brotli,CDN 分發。
-
渲染策略:骨架屏、字體?
swap
、固定圖片尺寸。 -
深度優化:Service Worker 緩存、動態渲染引擎。
通過以上步驟,首屏加載時間可減少?60-80%。最終效果取決于具體場景,建議使用?Lighthouse?和?WebPageTest?持續跟蹤指標。
調試
看網絡資源請求,按照耗時排序
先將有外網鏈接的資源 下載下來,替換成本地鏈接(不只是字體文件 還有client 文本文件,需要注意類型)
替換步驟是
1、將外網資源下載下來,放入模版web目錄下(會自動拷貝到打包的web目錄下)
2、根據找到的文件名,在打包產物全局搜索,替換為本地路徑
搜索關鍵字
KFOmCnqEu92Fr1Me5WZLCzYlKw
accounts.google.com