解决 Flutter Web 加载慢的问题

最近在做一个 Flutter 2.0 for Web 的项目,在项目打开第一次运行的时候,总是要等很久才能看到效果.
经过一番研究发现是 Flutter 使用的一个渲染引擎 Canvaskit 下载太慢导致的.

解决方法

Canvaskit 是一个 js 框架,Flutter 定义默认是从 https://unpkg.com 去加载的,在国内最好是改变这个地址,让它通过镜像地址去加载.

编译发布修改

在 {SDK_PATH}/bin/cache/flutter_web_sdk/lib/_engine/engine/canvaskit/initialization.dart 文件中有定义:

/// The URL to use when downloading the CanvasKit script and associated wasm.
///
/// The expected directory structure nested under this URL is as follows:
///
///     /canvaskit.js              - the release build of CanvasKit JS API bindings
///     /canvaskit.wasm            - the release build of CanvasKit WASM module
///     /profiling/canvaskit.js    - the profile build of CanvasKit JS API bindings
///     /profiling/canvaskit.wasm  - the profile build of CanvasKit WASM module
///
/// The base URL can be overridden using the `FLUTTER_WEB_CANVASKIT_URL`
/// environment variable, which can be set in the Flutter tool using the
/// `--dart-define` option. The value must end with a `/`.
///
/// Example:
///
/// ```
/// flutter run \
///   -d chrome \
///   --web-renderer=canvaskit \
///   --dart-define=FLUTTER_WEB_CANVASKIT_URL=https://example.com/custom-canvaskit-build/
/// ```
///
/// When CanvasKit pushes a new release to NPM, update this URL to reflect the
/// most recent version. For example, if CanvasKit releases version 0.34.0 to
/// NPM, update this URL to `https://unpkg.com/canvaskit-wasm@0.34.0/bin/`.
const String canvasKitBaseUrl = String.fromEnvironment(
  'FLUTTER_WEB_CANVASKIT_URL',
  defaultValue: 'https://unpkg.com/canvaskit-wasm@0.24.0/bin/',
);

意思是可以通过 FLUTTER_WEB_CANVASKIT_URL 这个环境变量改变默认的下载地址.
所以我们只要在 flutter 命令后面加上 --dart-define=FLUTTER_WEB_CANVASKIT_URL=https://cdn.jsdelivr.net/npm/canvaskit-wasm@0.24.0/bin/ 就可以了.

flutter run -d chrome --dart-define=FLUTTER_WEB_CANVASKIT_URL=https://cdn.jsdelivr.net/npm/canvaskit-wasm@0.24.0/bin/ --release

又经过一番折腾之后,发现在本地运行或调试的时候使用的其实是 {SDK_PATH}/bin/cache/flutter_web_sdk/kernel/{MODE}/dart_sdk.js 里面的值:

/*_engine.canvasKitBaseUrl*/get canvasKitBaseUrl() {
  return "https://unpkg.com/canvaskit-wasm@0.24.0/bin/";
},

这些值被固定成 https://unpkg.com/canvaskit-wasm@0.24.0/bin/, 经过验证只要改掉里面的地址,运行模式也能走我们改掉后的镜像地址了.
但是呢,这些文件为了匹配不同的环境所以有很多个,并且每个文件都很长很巨大,我用 IDEA 编辑一度内存溢出报警,于是写了个 Shell 脚本来帮助修改:

#!/bin/bash

export flutter_path=$(which flutter)
export flutter_web_sdk_folder=${flutter_path%flutter}cache/flutter_web_sdk

if [ ! -d $flutter_web_sdk_folder ]; then
  echo Flutter web sdk folder not found!
  read -n1 -p "Press any key to exit..."
  exit
fi

echo Find flutter web sdk folder: 
echo $flutter_web_sdk_folder
echo
read -n1 -p "Press any key to continue..."

echo "Start performing the replacement..."
find $flutter_web_sdk_folder/kernel -name dart_sdk.js | xargs sed -i 's?//unpkg.com/?//cdn.jsdelivr.net/npm/?g'
echo "Complete replacement!"
read -n1 -p "Press any key to exit..."

将上面的内容保存为 sh 脚本文件,Unix 系统可以使用终端直接运行,Windows 系统可以使用 Git 的 bash 运行.
正常情况下这段脚本会自动找到 Flutter SDK 中 Flutter Web SDK 目录下的 kernel 子目录下所有的 dart_sdk.js, 并将原本的 //unpkg.com/ 替换为 //cdn.jsdelivr.net/npm/, 实现依赖加速的目的.

其他的镜像源

知乎

--dart-define=FLUTTER_WEB_CANVASKIT_URL=https://unpkg.zhimg.com/canvaskit-wasm@0.24.0/bin/

饿了么

--dart-define=FLUTTER_WEB_CANVASKIT_URL=https://npm.elemecdn.com/canvaskit-wasm@0.24.0/bin/

jsDelivr

--dart-define=FLUTTER_WEB_CANVASKIT_URL=https://cdn.jsdelivr.net/npm/canvaskit-wasm@0.24.0/bin/

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
是指在应用程序启动之前提前某些页面或资源,以提高应用程序的响应速度和用户体验。在Flutter中,预可以通过创建预Flutter引擎来实现。引用\[1\]指出,当创建预Flutter引擎时,必须指定的路由,如果不指定,则会默认的根路由。这意味着在使用预Flutter引擎时,无法重新定义路由。 预的使用场景通常是在需要固定页面路由且对打开速度要求较高的情况下。例如,首页是一个常见的预页面,因为它是用户首次打开应用程序时看到的页面。引用\[2\]提到,预的页面最好是对打开速度要求较高的页面,而将其他优先级较低的页面提前预可能会影响应用程序的启动速度。 需要注意的是,预Flutter引擎除了是否使用预之外,还可以指定初始化的路由。这一点在某些情况下非常关键,因为通过指定路由可以确定显示哪个页面。然而,这也导致了在某些应用程序中无法进行Flutter引擎的预,比如在少儿词典中。引用\[3\]指出,少儿词典无法进行Flutter引擎的预,可能是因为需要根据用户的输入动态确定显示哪个页面。 综上所述,预是一种提前页面或资源以提高应用程序响应速度的技术。在Flutter中,预可以通过创建预Flutter引擎来实现。然而,预的使用场景和限制需要根据具体应用程序的需求来确定。 #### 引用[.reference_title] - *1* *2* *3* [Flutter Engine预分析](https://blog.csdn.net/HelloMagina/article/details/106091381)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Amoour

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值