plugins/languages/flutter/skills/web/SKILL.md
Flutter Web 规范 — WASM (dart2wasm) 编译、CanvasKit/HTML 渲染选型、响应式 Web 布局、PWA (manifest + service worker)、SEO/Semantics、usePathUrlStrategy。当用户开发 Flutter Web、提到 "Web"、"WASM"、"CanvasKit"、"PWA"、"SEO"、"浏览器" 时加载。
npx skillsauth add lazygophers/ccplugin flutter-webInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
| 引擎 | 推荐场景 | 优势 | 劣势 |
| --- | --- | --- | --- |
| WASM (dart2wasm) | 高性能应用 (Flutter 3.22+ stable) | 最快执行 / 小包体 | 需现代浏览器 (Chromium/Firefox/Safari 16.4+) |
| CanvasKit | 图形密集 / 像素一致 | 跨浏览器一致、复杂动画稳 | 初次加载 ~2MB |
| HTML renderer | (旧) SEO 优先 / 弱设备 | 小包体、原生 DOM | Flutter 3.27 起标记弃用 |
# WASM (推荐)
flutter build web --wasm
# CanvasKit (兜底)
flutter build web --web-renderer canvaskit
LayoutBuilder(
builder: (_, c) => switch (c.maxWidth) {
< 600 => MobileScaffold(child: child),
< 1200 => TabletScaffold(child: child),
_ => DesktopScaffold(child: child),
},
);
// 最大宽度约束 (避免超宽屏拉伸)
Center(
child: ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 1200),
child: content,
),
);
// 用 sizeOf 减少重建
final w = MediaQuery.sizeOf(context).width;
import 'package:flutter_web_plugins/url_strategy.dart';
void main() {
usePathUrlStrategy(); // 路径式 URL (非 #hash)
runApp(const MyApp());
}
// 推迟加载非首屏代码
import 'package:my_app/admin.dart' deferred as admin;
Future<void> openAdmin(BuildContext ctx) async {
await admin.loadLibrary();
Navigator.of(ctx).push(MaterialPageRoute(builder: (_) => admin.AdminPage()));
}
go_router 配置中按路由切分 deferred import 可显著减小首屏 Bundle。
// web/manifest.json
{
"name": "My Flutter App",
"short_name": "MyApp",
"start_url": ".",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#2196F3",
"icons": [
{"src": "icons/Icon-192.png", "sizes": "192x192", "type": "image/png"},
{"src": "icons/Icon-512.png", "sizes": "512x512", "type": "image/png"}
]
}
Service worker flutter_service_worker.js Flutter 默认生成;离线数据用 shared_preferences / hive。
// 语义化
Semantics(label: 'User profile card', child: const UserCard());
// 页面元数据 — web/index.html 配 <meta name="description">
// 动态标题 (TitleNotifier 包 SystemChrome)
CanvasKit/WASM 文本对搜索引擎不可见;SEO 关键页面考虑 SSR/SSG (e.g. jaspr) 或独立 HTML landing。
Image.network(
url,
cacheWidth: 800,
cacheHeight: 600,
loadingBuilder: (ctx, child, p) => p == null ? child : const CircularProgressIndicator(),
);
import 'package:flutter/foundation.dart';
if (kIsWeb) {
// Web 特定
}
// 条件导入处理 dart:html / dart:io
import 'stub.dart'
if (dart.library.js_interop) 'web.dart'
if (dart.library.io) 'native.dart';
| AI 借口 | 实际检查 | 严重度 |
| --- | --- | --- |
| "CanvasKit 就行" | 是否考虑 WASM? | 中 |
| "FCP 不重要" | FCP < 2s? | 高 |
| "不需要响应式" | 手机/平板/桌面三断点是否覆盖? | 高 |
| "hash URL 也行" | 是否 usePathUrlStrategy()? | 中 |
| "图片直接加载" | cacheWidth/cacheHeight 降采样? | 中 |
| "一次加载全部" | 是否 deferred import 拆包? | 中 |
| "SEO 不重要" | Semantics + meta 是否补全? | 中 |
flutter build web --wasm)MediaQuery.sizeOf 降重建ConstrainedBox 限最大宽度usePathUrlStrategy()Semantics 语义化Skills(flutter:core) / Skills(flutter:ui) / Skills(flutter:state)tools
UI/UX 与布局设计——做界面布局/结构/导航/组件/交互的设计决策。触发:做UI/UX/布局/排版/导航/组件/交互/栅格/响应式/图表选型/字体配对。按媒介路由 HTML/Web、原生 App(iOS/Android/桌面)、CLI、TUI。需后端动态系统不适用;配色/主题/色板走姊妹 skill design-color。
tools
主题与配色设计——做颜色搭配/调色板/主题/品牌色阶/暗模式的设计决策。触发:选配色/调色/主题/色板/品牌色/暗模式/对比度/色盲/UI风格。按媒介路由 HTML/Web(CSS变量)、原生App(平台token)、CLI(ANSI)、TUI(真彩/256/16降级)。保证可访问性(对比度/色盲安全)。需后端动态系统不适用;UI/UX 布局/组件/交互走姊妹 skill design-uiux。
tools
跨任意组件(plugin/skill/agent/command)的验证驱动优化循环纪律 skill。当用户要优化某个已有组件却无明确方向、或要防止改了反而更差(自评乐观偏差 / 多维同改归因失效 / 为凑分加废话膨胀)、或要把一套通用「评分→单变量改→改后验证严格更好才留否则回滚→触顶停」的纪律套到任意组件上时使用。管优化过程本身的纪律(validation gate / ratchet / 独立验证 / 触顶停),不评单组件深度(交 skill-dev),不查插件接线(交 plugin-dev)。仅手动 /optimize-any 触发。
data-ai
两层规则记忆 (基于 .skein/spec)。planning 时 recall 召回相关规则、task finish 后 sediment 沉淀学习 + prune 自动精简过期/重复/断链规则。core 常驻硬规 + recall 按需召回, 经判定门自动写盘 (不逐次问用户)。产出 .skein/spec 下 core/recall 规则文件 + index。另支持空仓 bootstrap 播种规则基线、记忆大面积失效 (大重构/换栈) 时 reconstruct 可逆归档后按项目类型分型重建、maintain 手动体检 (超预算/stale/断链/重复/废弃, --apply 自动修复)、auto-fix (Stop hook 写 .pending-fix 标记 → main 派 skein-specer bg 跑 maintain --apply 全自动修, 断链只报告)。