Simon Willison 把 Python 的 ASGI 网页应用(比如 FastAPI 和他自己的 Datasette)完全塞进了浏览器。做法是用 Pyodide 把 Python 编译成 WebAssembly,再配合 Service Worker 拦截浏览器请求,直接在本地跑 Python 后端逻辑。这比四年前他做的 Datasette Lite 更进一步:旧方案用 Web Worker 模拟,页面里的 JavaScript 脚本跑不起来,很多插件会挂;新方案用 Service Worker 走完整的 ASGI 协议,脚本能正常执行,兼容性好得多。
代码是让 Claude Opus 4.8 帮忙写的,他给了两个能跑的演示:一个基础 FastAPI 例子,一个 Datasette 1.0a31 完整版。这说明方案不是针对某个应用的特例,对遵循 ASGI 标准的 Python 应用都适用。
不过正文没提性能开销和首屏加载时间。Pyodide 本身初始化就不快,加上 Service Worker 拦截所有请求,实际延迟和内存占用会是多少,目前没有数据。另外,这种方案只适合处理同源请求,跨域场景和需要真实后端数据库的应用还是得老老实实搭服务器。他说等自己搞明白原理后会升级 Datasette Lite,到时候可以看看实际体验到底怎么样。