Simon Willison 最近做了一件有点反常的事:他把 Datasette 最古老、已经 8 年没动过 的可视化插件 datasette-vega 给更新了。这个插件上一次发布 0.6.2 版本还要追溯到 2018 年 7 月。在 Datasette 1.0 正式版发布前夕,他发布了 datasette-vega 0.7,不仅补齐了对 Datasette 1.0a42 的兼容,还顺手打通了纯浏览器运行环境 Datasette Lite 的 JS 插件加载。
发生了什么:8 年老插件的极速交割
如果只看表象,这只是一次例行的依赖版本升级。但把它压成一张速读卡片,变化其实相当直接:

- 核心更新.全面兼容 Datasette 1.0a42,将底层依赖升级至 Vega 6、Vega-Lite 6 与 vega-embed 7。
- 架构调整.构建系统全面切换为 esbuild,通过 GitHub Actions 自动化发布,运行环境强制要求 Python 3.11 或更高版本。
- 终端突破.配合 Datasette Lite,首次实现了在纯前端 WebAssembly 环境中即插即用加载渲染可视化图表。
一个已经在 GitHub 上吃灰 8 年的插件,为什么值得在 1.0 前夕重新拿出来重构?答案不在 Vega 本身,而在 Datasette 过去两年对浏览器端的下注。
浏览器里的 Python:前端插件如何被无声装载
在过去,要在 Python Web 应用里用前端插件,离不开后端服务器渲染页面并注入 JS。但 Datasette Lite 走了一条完全不同的路:它把 Python 解释器打成 WebAssembly 包,直接在浏览器里跑起来。
要在这种环境跑通前端插件,并非简单加个标签。Datasette 巧妙拼凑了一套无服务端运行管线:
底层由 Pyodide 在 Web Worker 里运行完整的 ASGI 应用,中间靠 Service Worker 拦截浏览器发出的静态资源与网络请求,最后在 iframe 页面里动态拉取并执行 JS/CSS 插件。这意味着用户不需要配置任何服务器,只要打开网页,就能在本地浏览器跑 Python 数据分析并顺畅出图。
精神续作接不了盘,老将被迫重回战场
如果梳理开源路线就会发现,Simon Willison 本不打算救活 datasette-vega。在 2023 年底,他就推出了基于 Observable Plot 的新插件 datasette-plot,试图将其打造为全新的可视化基础设施。

然而新方案并没能顺利交棒。工程实践中的现实骨感得多:datasette-plot 在后续迭代中屡屡碰壁,不仅日期解析受限,交互筛选状态也无法持久化保存;到了 2024 年 9 月,甚至在 Datasette 1.0a16 上出现了基础控制按钮失效的兼容事故。
“明者因时而变,知者随事而制。”当试图构建的新工具迟迟无法承载生产环境的稳定性,最务实的选择就是回头修复经过几年验证的老地基。datasette-vega 虽然架构古老,但其封装的 Vega-Lite 语法天然稳固,这才是它在 8 年后重获青睐 的核心原因。
开源社区里没有永恒的先进技术,只有经受住兼容性考验的稳定代码。
欢呼之外:藏在 Issue #33 里的采样陷阱
用上了纯浏览器端出图,并不代表分析结果绝对可靠。在使用 datasette-vega 0.7 时,有个机制上的硬伤必须警惕。

开源社区很早就记录过这个问题(Issue #33):datasette-vega 默认仅绘制当前视图/分页中的数据,而非经过筛选条件过滤后的全量数据。
- 风险.若数据表设置了单页 50 条的默认分页,生成的折线图或散点图仅反映这 50 条样本的分布。若直接据此做趋势归纳,得出的结论很可能与真实数据集完全背离。
在本地 CLI 或服务端模式下,开发者还能通过修改 URL 参数调整单页数据量;而在浏览器端无痕模式或受限网络下,Service Worker 甚至可能无法正常运行,导致插件彻底失效。
工程上的折中永远带有代价。Simon Willison 用 0.7 版本帮 Datasette 1.0 补齐了发布前的最后一块可视化拼图,但分析者在使用这类轻量级前端分析工具时,依然要把眼光从好看的图表落回底层的采样规则。
