Flutter 3.44 & Dart 3.12重磅发布!这些新特性太香了

哈喽大家好,随着Google I/O的进行,Flutter 3.44不出意外地发布了,与之一同发布的还有Dart 3.12。这次Flutter的发布可以说是一个重要的里程碑了,核心的更新包括:

  • 1. Android 混合渲染再进化 Hybrid Composition++ 正式上线,Android 端的渲染性能又上了一个台阶。

  • 2. iOS/macOS 迎来新管家 Swift Package Manager 正式成为 iOS 和 macOS 的默认包管理工具,开发体验更丝滑。

  • 3. Vulkan 支持大提升 Impeller 的 Vulkan 支持全面增强,图形渲染更高效。

与此同时,很多人关注的桌面端也在很大的动作,Flutter正和Canonical 合作预览多窗口桌面支持功能,Canonical 也正式成为桌面端的牵头维护方。这意味着 Flutter 在桌面端的布局将更加完善。

而在架构层面,Material 和 Cupertino 组件库正在从核心框架中解耦,这是 Flutter 架构演进的重要一步,未来会更加灵活。

而在AI方面,Flutter一直持积极态度,这次也带来了AI相关的更新

  • GenUI:重新定义智能体交互的用户体验
  • Agentic Hot Reload:开发效率再升级
  • Dart & Flutter Agent Skills:让 AI 成为你的编程助手

无处不在的 Flutter

2026 款丰田 RAV4 车载系统 ,到即将推出的 LG webOS SDK,Flutter 正在赋能下一代全平台应用。

我相信很多人过一段时间就会看到类似的文章:"Flutter凉了吗?""你为什么放弃了Flutter?"然后实际情况和你想像的不一样,有数据可以证实这一点:

  • 📦 pub.dev 生态热度空前,近 30 天包下载量突破 13 亿次
  • 📊 Flutter 已成为两大应用商店中第二大热门移动开发 SDK
  • 👨‍💻 月活开发者超 150 万 ,一年内增长 50%

而社区始终是 Flutter 的生命线,让它真正成为"众人共建,普惠众人"的项目。

1,700+ 位热心贡献者是 Flutter 前进的动力引擎。过去一年,核心仓库合并了 5,800 个变更。

仅本次发布周期内:

  • 972 个 commit 来自 178 位独立贡献者
  • 🆕 其中 61 位是新面孔,完成了他们的首次贡献

下面我为大家简单介绍一下Flutter 3.44 & Dart 3.12的一些重要更新。

Dart

为什么先说Dart呢?因为Dart这一更新简直太合我胃口了,必须排一个!

私有命名参数(Private named parameters)

在我的代码库时目前充斥着大量类似下面的代码,简直是太丑陋了:

dart 复制代码
class Hummingbird {
  final String _petName;
  final int _wingbeatsPerSecond;

  Hummingbird({required String petName, required int wingbeatsPerSecond})
    : _petName = petName,
      _wingbeatsPerSecond = wingbeatsPerSecond;
}

每当我看到这样的代码我都迫切地想改成required this._petName,但无奈Dart不支持啊,现在好了Dart 3.12可以完美支持这一特性了:

dart 复制代码
class Hummingbird {
  final String _petName;
  final int _wingbeatsPerSecond;

  // OK with "Private Named Parameters"! :D
  Hummingbird({required this._petName, required this._wingbeatsPerSecond});
}

这段代码的运行效果和之前的例子完全相同。

关键点:

  • 初始化字段是私有的(带下划线)
  • 但构造函数参数和调用处的参数名仍使用公开的命名
dart 复制代码
void main() {
  print(Hummingbird(petName: 'Dash', wingbeatsPerSecond: 75));
}

主构造函数(Primary constructors)

我在之前的文章有提到过这一些相关特性,可以参看Flutter.Dart的主构造函数(primary constructor)可能马上就要来了。目前这是牌实验阶段的特性,需要我们手动开启:

css 复制代码
dart run --enable-experiment=primary-constructors bin/main.dart

可以说这是开发者最想要的特性之一,简单说,向Kotlin、Swift等语言看齐,以前我们这样定义一个类:

dart 复制代码
class Point {
  final int x;
  final int y;
  Point(this.x, this.y);
}

现在,你可以这样写:

dart 复制代码
class Point(final int x, final int y);

评价:你不觉得来的有点晚吗?

开发者体验相关

Flutter DevTools 更稳、更快

由于引入了更细粒度的分析机制,大幅提升分析效率。特别是对于文件或目录较多的项目,性能提升尤为明显------大型项目的开发体验从此告别卡顿。

DevTools 迎来多项稳定性和性能优化,其中最大的变化是:

默认启用 WASM(WebAssembly)运行

这意味着 DevTools 启动更快、操作更流畅、响应更灵敏,整体体验"丝滑"了不少。

组件预览(实验性)

本次发布对 Widget Preview 环境带来了进一步的性能优化和新功能:

预览检测重写

检测逻辑现已接入 Dart Analysis Server ,大幅降低了 flutter tool 的内存占用。对于 IDE 用户来说,整体内存使用量最高可降低 50%------从此告别内存焦虑。

预览过滤

现在支持按分组、名称、脚本及包 URI 对预览进行筛选,项目预览再多也能快速定位,工作效率直接拉满。

告别 Rosetta,原生支持 Apple Silicon

Mac 开发者们,好消息来了!

运行 Apple Silicon 芯片的 Mac 不再需要安装 Rosetta 转译层 即可使用 Flutter。所有 macOS 命令行工具------包括 iOS 设备通信相关的二进制文件------都已更新为 ARM 原生运行

苹果计划在未来弃用 Rosetta 转译支持 ,Flutter已经提前完成了适配,确保你的开发环境在 Apple 硬件上面向未来,无后顾之忧

⚠️ 重要提醒

未来的 Flutter 版本将完全终止对 Intel x86 Mac 的支持

如果你的团队仍在使用 Intel 芯片的 Mac 进行开发,建议尽早规划硬件迁移,避免到时候措手不及。

AI 时代,重新定义开发体验

Flutter & Dart始终积极拥抱AI。

过去一年,Dart 和 Flutter 生态迎来了智能体工具的大爆发 ------Antigravity、Gemini CLI、Claude Code、Cursor 等工具层出不穷,作为开发者,我们的角色正在从"写代码"转变为架构设计与智能体协作

🔥 Agentic Hot Reload:智能体无缝集成

这是 AI 辅助开发领域的一次重大飞跃!

MCP 服务器现在能自动发现并连接正在运行的 Dart/Flutter 应用。 这意味着你常用的编程智能体(如 Antigravity)可以开箱即用地进行热重载

工作流程是这样的:

你告诉 AI 助手修改 UI → 智能体编写代码 → 自动触发热重载 → 即时看到效果

全程零配置,无需任何手动操作。赶紧试试吧!

🛡️ 更多增强

还有两项重要优化:

  • 依赖搜索加固:智能体现在可以安全地读取和搜索包依赖中的文件,无需开放本地 pub cache 的完整访问权限
  • 工具整合精简 :统一了 MCP 工具定义,大幅降低智能体工作流的 token 消耗

当然还有适用于 Flutter和Dar和的Agent Skills。这块不多说了,可以去看看Fluter & Dart的Skill介绍.

AI相关的更新还有很多,我也不一一介绍了,毕竟我用的少,比如Gemma 4、LiteRT-LM for Flutter、A2UI等等。

Android支持

📕 Googlebook 及外设支持

Googlebook------这款搭载 Gemini 的新款笔记本,Flutter 已经准备好了!

得益于 Flutter 对 Android 大屏幕设计规范的适配,应用对外部硬件输入的支持天然就位:

  • ✅ 触控板滚动
  • ✅ 鼠标悬停状态
  • ✅ 右键菜单
  • ✅ 键盘快捷键

全部开箱即用,无需额外配置。

更重要的是,Flutter 在 macOS、Windows 和 Linux 上已经积累了成熟的桌面端支持经验。因此 Flutter 应用在 Googlebook 上运行时会呈现出原生般流畅的体验,而不会像那种简单拉伸的手机端移植应用。

你现有的移动端应用在 Googlebook 上也能"如鱼得水",无需大规模重写代码。

🤖 Android 17

Android 17 即将来袭,团队已经在积极针对最新的 Android 17 Beta 版本进行测试,确保你的应用平稳运行、不受影响

同时,我们也在主动适配 Android 17 的最新安全与易用性特性,包括:

  • 🔒 本地网络保护(Local Network Protections)
  • 🛡️ 安全动态代码加载(Safe Dynamic Code Loading)

让你的应用在享受新系统特性的同时,安全性也同步升级。

🚀 Hybrid Composition++:Android 嵌入体验全面升级

在 Flutter 应用中嵌入原生 Android 组件(如 WebView、地图)时,开发者过去一直面临一个两难抉择:要帧率还是要保真度?

旧的渲染策略总是问题不断:

  • 😫 滚动时画面撕裂
  • 😫 文本输入异常
  • 😫 CPU 开销居高不下

Flutter 3.44 推出了 Hybrid Composition++(HCPP),作为可选功能正式解决这些痛点。

🔧 原理是什么?

传统方案依赖离屏缓冲区,或强制 Flutter 引擎处理原生视图,而 HCPP 换了一种思路:

将图层合成直接委托给 Android 系统本身。

具体来说,它利用 Vulkan 图形库的底层能力,通过硬件缓冲区交换链SurfaceControl 事务,实现 Flutter UI 与原生 Android 视图的精准同步。

🎯 效果如何?
  • 高性能滚动,告别卡顿和撕裂
  • 👆 精准的触摸输入,操作丝滑跟手
  • 📺 可靠的 SurfaceView 支持,旧模式下的老大难问题迎刃而解

当然了,HCCP不是你想就能用的,因为HCPP 对 Android API 和硬件有一定要求,因此即使开启了该功能,也并非所有设备都能使用。

不过好消息是------无需学习任何新 API,只需启用一个标志位,就能让现有的平台视图自动升级。

🧪 如何体验?

在 HCPP 成为默认渲染模式之前,你可以通过以下两种方式提前尝鲜:

方式一:命令行参数

bash 复制代码
flutter run --enable-hcpp

方式二:配置文件

AndroidManifest.xml 中添加配置标志即可。

💡 建议尽早测试,提前排查兼容性问题,为未来的默认切换做好准备。

📐 Android 屏幕圆角适配

现代手机的屏幕越来越"圆",如何让 UI 精准适配?

Flutter 现在直接对接 Android 硬件层,原生支持屏幕圆角半径

通过 MediaQuery 即可获取设备的物理和逻辑圆角半径信息,你的 UI 能够精确匹配硬件几何形状,确保内容在圆角屏幕上永远不会被裁切

🎯 像素级精准布局,从此告别"差一点"的尴尬。

🔧 Android Gradle Plugin 9.0 与内置 Kotlin

一个重要的破坏性变更,请注意!

在 AGP 9.0 之前,Android 应用和插件开发者需要手动在构建文件中添加 Kotlin Gradle 插件(KGP),系统才能编译 Kotlin 代码。

但从 AGP 9.0 开始,Android 构建系统原生内置了 Kotlin 支持。这意味着:

⚠️ 再手动添加 KGP,反而会产生冲突,导致构建失败

🛡️ 临时兼容方案

Flutter 团队已添加了临时向后兼容层,确保现有项目仍能正常构建。但请注意,手动应用 KGP 的支持将在未来版本中被移除

📝 应用开发者需要做什么?

如果你是 Flutter 应用开发者,请更新你的 Android 构建文件,移除单独的 Kotlin Gradle 插件(KGP)配置

💡 趁早处理,避免未来升级时踩坑。

📦 插件开发者需要做什么?

插件作者的迁移流程与应用类似,同样需要修改 Gradle 文件,但还有一个关键步骤

pubspec.yaml 中将 Flutter 最低版本约束更新为 3.44

yaml 复制代码
environment:
  flutter: ">=3.44.0"

这一步至关重要,确保你的插件与新版构建系统完全兼容

💡 如果你是插件作者,建议尽快完成适配,避免用户升级 Flutter 3.44 后出现构建问题。

iOS支持

Swift Package Manager成为默认的依赖管理器

Cocoapods已经进入维护模式了,从Flutter 3.44开始,Swift Package Manager成为默认的依赖管理器。具体可以参看我的另一篇文章再见吧CocoaPods,Swift Package Manager(SPM)即将在Flutter 3.44中成为默认依赖管理器

Flutter 支持 UIScene

从 iOS 13 开始,Apple 引入了基于 "Scene" 的生命周期机制,以支持多窗口体验。

WWDC 2025 上,Apple 进一步宣布:使用最新 SDK 构建的应用即将强制要求通过 UIScene 生命周期来启动。

⚠️ 这是一次关键更新,务必及时适配,以确保你的应用满足未来 iOS 版本的上线要求。

当然了,Flutter 3.44在这方面其实并没有新的变更,只是提醒你一下,你要做迁移了。

⌨️ iOS 原生预测文本(实验性)

Flutter为文本输入框引入了原生 iOS 内联预测文本的实验性支持。

该功能默认关闭 ,你可以通过启用 TextField.enableInlinePrediction 来体验:

dart 复制代码
TextField(
  enableInlinePrediction: true,
  // ...
)

开启后,用户在应用中输入时,可以像原生 iOS 体验一样按空格键接受系统预测文本

例如输入 "My n",系统会预测 "ame",按空格即可直接补全为 "My name"。

Web

♿ 无障碍体验升级

无障碍访问与用户偏好适配迎来大幅增强:

  • 🎬 自动响应 prefers-reduced-motion:开箱即用,当用户在浏览器中开启了"减少动画"设置时,Flutter Web 会自动禁用动画效果
  • 🗣️ 表单验证即时朗读 :通过 aria-description,屏幕阅读器能够在表单验证出错时立即播报错误信息

The user wants me to translate this Flutter 3.44 release note section about platform and tooling improvements for web, into a WeChat public account (公众号) style in Chinese. 以下是适合公众号风格的翻译:


🌐 平台与工具链

开发工作流和浏览器集成体验从未如此顺畅!

iOS 26 Safari 自动填充优化

引擎现在通过在焦点切换时复用 DOM 表单来处理自动填充,让用户在 Safari 中的表单填写体验更加自然流畅。

Web 滚动与键盘事件增强

Web 端的滚动行为和键盘事件合成经过精细调优,可靠性大幅提升。

CLI 新增 --base-href 支持

flutter run 命令现在直接支持 --base-href 参数,与生产环境构建配置保持一致,Web 应用的开发调试更加便捷:

bash 复制代码
flutter run --base-href /my-app/

桌面支持

Flutter正式官宣,Canonical 正式成为 Flutter 桌面端的牵头方,将主导 Flutter Desktop 的路线图规划,并负责 Linux、Windows 和 macOS 三大平台嵌入器的维护工作。

🪟 窗口管理 API(实验性)

⚠️ 注意: 窗口管理相关功能目前仅在 main 分支上可用,暂不建议用于生产环境。

✏️ Windows 触控笔支持

Windows 平台的 Flutter 应用迎来了一项重大升级,数字艺术家和手写笔记用户的福音来了!

感谢社区贡献者 CodeDoctorDE 的出色工作,Flutter Windows 现已支持触控笔输入,包括:

  • 🔄 笔触旋转的精准追踪
  • 📏 压力感应的细腻识别

🙏 再次感谢社区贡献者的力量!Flutter 的每一次进步,都离不开大家的热情参与。

嵌入式平台

丰台的Rav 4也在使用Flutter,而LG也即将推出 webOS SDK ,帮助开发者轻松构建面向 WebOS 设备的 Flutter 应用,让 Flutter 在大屏端大放异彩。

图形与引擎增强

本次发布对 Impeller 渲染后端带来了多项针对性的渲染和性能优化。

Impeller 改进

Vulkan 优化

  • 🧠 缓存内存管理优化:更高效地利用 GPU 显存
  • GPU/CPU 同步效率提升:在丢帧场景下表现尤为明显

SDF 渲染更纯净的圆形

圆形渲染的数学模型已更新,采用**有符号距离函数(SDF)**来绘制更干净的圆形。之前某些场景下出现的锯齿问题现已彻底解决。

阴影与透视修复

Impeller 对透视矩阵的处理方式进行了改进,修正了阴影渲染和透视投影变换中的异常行为。

🎨 FragmentShader 改进

编写片段着色器现在更加直观、不易出错,得益于以下增强:

按名称获取 Uniform API

现在可以通过名称而非手动偏移量来绑定着色器中的 uniform 变量,大幅简化了着色器代码的配置流程:

glsl 复制代码
// 之前:手动计算偏移量,容易出错
// 现在:直接按名称绑定,清晰明了
dart 复制代码
void setUp(ui.FragmentShader shader) {  
shader.getUniformFloat('foobar').set(1.234);  
}

🏗️ 框架层

本次发布在重大架构演进质量打磨之间取得了平衡。随着 Material 和 Cupertino 库开始战略性地解耦为独立包,核心框架持续走向成熟,Web 渲染、基础稳定性以及平台集成均迎来重要更新。

🎨 Material 与 Cupertino 更新

这是 Material 和 Cupertino 库发展史上一个里程碑式的时刻

从本次发布起,这两个库在核心框架中的版本正式冻结 ------这是它们迁移到独立包 material_uicupertino_ui 之前的最后一次更新。

⚠️ 重要时间线:

  • 当前版本:核心框架中的 Material/Cupertino 冻结
  • 下一个稳定版 :框架内版本将被标记为弃用(Deprecated)
  • 届时 :你可以迁移到全新的、独立版本管理的包

这意味着未来 Material 和 Cupertino 将拥有自己的发布节奏,不再受 Flutter 框架版本的束缚,迭代更加灵活。

尽管版本已冻结,本次发布依然带来了大量打磨和优化。

其中一大亮点是 Cupertino 库的菜单现代化改造

全新的 CupertinoMenuAnchor 组件,基于灵活的 RawMenuAnchor 基础构建,为 iOS 应用提供了更健壮、更贴近原生体验的菜单交互。

而Material 这边,菜单体验同样迎来了打磨升级。

MenuAnchor 新增了 Material 3 动画效果 ,让菜单的展开和收起更加流畅、更有响应感。同时,SubmenuButton 增加了 hoverOpenDelay 参数,让你可以精细控制子菜单的交互延迟。

此外,本次发布还优化了 CupertinoSheetRoute可滚动内容与拖拽动画的协同体验

现在,在底部弹窗中滚动内容时,滚动与关闭弹窗之间的切换更加自然流畅,不再有生硬的割裂感。

对于需要自定义拖拽区域的开发者,新增的 scrollableBuilder 允许你将托管的 ScrollController 传递给内容区的可滚动组件,由框架自动协调滚动与弹窗拖拽的交互逻辑。

CarouselView 轮播组件大升级

本次发布中,CarouselView 组件迎来了多项功能性增强:

  • ♾️ 无限滚动:支持无缝循环轮播,告别到头回弹的生硬体验
  • 📢 onIndexChanged 回调:实时监听轮播位置变化
  • 🎯 leadingItem 属性:通过控制器获取当前首项,对轮播状态的掌控更加精准

🧩 新设计原语

全新设计原语让复杂 UI 效果的实现变得更加简单。

ShapedInputBorder

Material 组件现在可以通过指定任意 ShapeBorder 来创建自定义形状的输入框边框。比如,你可以用 RoundedSuperellipseBorder 让 Material 输入框呈现出 iOS 风格的外观。

CupertinoFocusHalo

同时,CupertinoFocusHalo 也新增了超椭圆形状支持,确保不同组件几何形态下的焦点指示器保持一致。

📎 了解更多:ShapedInputBorder

✨ 现有组件打磨

Expansible 组件增强

驱动 ExpansionTile 的底层组件 Expansible 变得更加强大。ExpansibleControllerExpansionTileController 现在都提供了 toggle() 方法,同时文档和示例也进行了全面优化。

ListTile 系列组件

RadioListTileCheckboxListTileSwitchListTile 等组件现在正确支持 WidgetStatesController,让你可以通过编程方式更精细地控制它们的视觉状态。


♿ 无障碍:让每一位用户都被关怀

打造人人可用的应用始终是 Flutter 框架的核心使命。本次发布在平台无障碍设置集成、语义播报精度以及常见 UI 组件的无障碍体验上均取得了重要进展。

iOS 无障碍新特性

针对 iOS 开发者,本次发布新增了多项无障碍动态特性支持:

  • 🖼️ 自动播放动画图片偏好检测:识别用户是否希望暂停自动播放的 GIF 等动画内容
  • 🎬 自动播放视频预览偏好检测:感知用户是否关闭了视频预览的自动播放
  • 📌 非闪烁光标偏好:为觉得闪烁光标分散注意力或难以追踪的用户,提供稳定不闪烁的文本光标

这些设置通过 AccessibilityFeatures 对象暴露,让你能够构建更懂用户偏好的 iOS 应用。

进度指示器优化

ProgressIndicator 现在支持使用百分比字符串(如 "50%")作为 SemanticsValue,屏幕阅读器将以更自然、更易读的方式播报进度,告别干巴巴的小数数值。

核心组件语义打磨

  • 🎚️ Slider 滑块:语义节点经过重构,更准确地反映其尺寸和位置,改善了触控探索和辅助设备导航体验
  • 📜 滚动视图修复:修复了不可见的无障碍元素错误地出现在可滚动内容之前的问题,导航流程更加清晰可预测

🌟 这些改进共同确保 Flutter 应用在所有平台上都能提供高质量、包容性的用户体验。

🛡️ 零宽高组件的健壮性提升

本次发布投入了大量精力来提升框架在 "0x0 环境" 下的稳定性------即组件被赋予零宽度或零高度的场景。过去这种情况可能触发布局错误甚至意外崩溃。

感谢社区贡献者 ahmedsameha1 的持续投入,我们为多个核心组件添加了零尺寸覆盖,包括:

  • 🦸 Hero
  • 🎨 Icon
  • 📐 AnimatedPadding
  • 📏 GridPaper

这些更新确保你的应用在复杂布局过渡或高度受限的视口内依然稳如泰山


✂️ SelectableRegion 改进

我们修复了 SelectableRegion 中的两个关键问题,提升了原生和 Web 平台上的布局保真度及文本选择行为:

Web 端布局约束保持

此前 SelectableRegion 在 Web 端渲染时可能导致子组件意外收缩。现在所有布局约束会原封不动地传递给子组件,确保尺寸行为一致。

多行复制精度提升

SelectableRegion 中选择并复制跨行文本时,换行符现在会被正确保留,不再丢失。


⚠️ 破坏性变更与弃用

当然了,不能仅推新,还要去旧。Flutter 3.44中也包含了几项重要的弃用和破坏性变更。

RawMenuAnchor 回调调整

RawMenuAnchor 部分回调的调用顺序进行了调整,以支持更灵活、更可预测的自定义行为。

主要弃用项:

CupertinoSheetRoute

showCupertinoSheetCupertinoSheetRoute 中的 builderpageBuilder 参数现已弃用,推荐使用 scrollableBuilder 替代。这一变更让可滚动内容与弹窗拖拽动画的协同更加顺畅。

ReorderableListView

onReorder 回调已弃用,推荐使用更精确的 onReorderItem。新回调提供的 newIndex 会正确考虑项目先移除再插入的逻辑,行为更加可预测。

工具链

  • --web-hot-reload 标志已弃用,Web 端热重载现已通过更现代的机制处理
  • plugin_ffi 模板已弃用,推荐使用更完善的、内置 FFI 支持的 plugin 模板

💡 升级时请逐一排查这些弃用项,利用 IDE 的弃用提示快速定位并迁移。

最后

Flutter Flutter 3.44 & Dart 3.12带来的更新还是不少的,你准备好更新了吗?

复制代码
flutter upgrade

Flutter,无处不在,日日相伴。

Flutter,众人共建,普惠众人。

相关推荐
星栈9 小时前
Rust WASM 文件上传全链路:从浏览器到 S3,一个字节都不能少
前端·前端框架·开源
濮水大叔9 小时前
告别 Django Admin!这个 NodeJS 全栈框架让你在 DTO 中直接配置 Table/Form 渲染
前端·typescript·node.js
竹林8189 小时前
用Viem替换ethers.js:一次合约交互的"减负"实战,我总算把TypeScript类型搞明白了
前端·javascript
To_OC9 小时前
一个让我懵了半小时的时钟 Bug,注重前端三权分立落地
前端·代码规范
归故里9 小时前
harmony-next.skills 为 AI 而生!
前端·后端·github
threelab9 小时前
Three.js 3D 热力图效果 | 三维可视化 / AI 提示词
开发语言·前端·javascript·人工智能·3d·着色器
vivo互联网技术9 小时前
VAPD AgentKit:可组合 Agent 前端通用库实践
前端·ai·架构·agent
lichenyang4539 小时前
鸿蒙聊天 Demo 练习 02:AI 回复打字机输出与 ForEach 刷新问题
前端
Hello--_--World9 小时前
利用CDN进行首屏优化。能不能看CDN与本地服务器谁快用谁?
运维·服务器·前端·javascript·vite