FlutterJS:我构建了一个输出真实 HTML(而非 Canvas)的 Flutter 编译器

发布: (2026年2月6日 GMT+8 04:05)
3 min read
原文: Dev.to

Source: Dev.to

没有人谈论的问题

Flutter Web 有一个秘密:它并不是真正的“网页”。
当你构建一个 Flutter Web 应用时,所有内容都会渲染到 <canvas> 元素中。这对复杂的应用来说可以工作,但对网站来说会产生严重的问题:

  • 没有 SEO – Google 无法索引 canvas 像素
  • 体积庞大 – 最低 2–5 MB,即使是简单的应用也如此
  • 可访问性差 – 没有语义化的 HTML 供屏幕阅读器使用
  • 首次渲染慢 – 需要 3–8 秒才能看到内容

我在为客户构建一个营销站点时碰到了这堵墙。页面看起来很漂亮,但 Google Search Console 显示零曝光。站点根本不可见。

如果 Flutter 编译成真实的 HTML 会怎样?

这正是我实现的。FlutterJS 接受你常规的 Flutter/Dart 代码:

Scaffold(
  appBar: AppBar(title: Text('My Site')),
  body: Center(
    child: Text('Hello, World!'),
  ),
)

并输出语义化的 HTML:

<div class="my-site">
  <h1>My Site</h1>
  <p>Hello, World!</p>
</div>

工作原理

  • 编写普通的 Flutter 代码 —— 不需要特殊语法。
  • 一个 Dart CLI 对你的抽象语法树(AST)进行完整的类型解析。
  • 生成带有轻量级 VNode 运行时的 JavaScript。
  • 输出搜索引擎可以索引的语义化 HTML。
  • JavaScript 运行时负责 diff 和更新,类似于 React 的虚拟 DOM,但针对 Flutter 的 widget 模型进行了优化。

指标对比

指标Flutter WebFlutterJS
包体大小2–5 MB50–100 KB
首次渲染时间3–8 s注意: 目前尚未完全支持外部 pub.dev 包。纯 UI 代码表现良好。

路线图

  • 动画
  • 高级 Material 组件(Tabs、Dialog、BottomSheet)
  • Cupertino 组件
  • CustomPainter

架构已经支持这些功能,只是还没有实现。

入门指南

# 克隆仓库
git clone --recursive https://github.com/flutterjsdev/flutterjs.git
cd flutterjs

# 激活 Dart CLI
dart pub global activate --source path .
dart pub get
dart run tool/init.dart

# 使用 flutterjs 命令
flutterjs --help

打开 http://localhost:3000 并检查页面——你会看到真实的 HTML 元素。

  • 网站:
  • GitHub:
  • pub.dev:

我需要你的帮助

这是开源项目,我正在寻找贡献者。如果你关心 Flutter 在 Web 上的表现:

  • 测试并报告 bug
  • 为缺失的组件贡献代码
  • 帮助完善文档

你在使用场景中需要哪些组件?在评论中告诉我吧。

Back to Blog

相关文章

阅读更多 »

语义化HTML:初学者 第1部分

非语义示例 想象一下,你是 HTML 初学者,并且因为想快速做一个非功能性的旅行应用,你在 body 中写下以下内容: html Traveling Ap...

CSS 选择器 101

CSS 选择器 – 如何定位元素 您已经编写了一些 HTML。现在您想用 CSS 让它看起来更好。但您如何告诉 CSS 哪些元素需要样式?T...

HTML (骨架)

封面图片:HTML The Skeleton https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.a...