marimo 发布到 Cloudflare:用 --include-cloudflare 把 WASM 笔记本一键部署为 Worker 或 Pages 📅 发布时间:2026/9/13 17:13:55 👁 浏览次数: marimo 发布到 Cloudflare用 --include-cloudflare 把 WASM 笔记本一键部署为 Worker 或 Pages【免费下载链接】marimoA reactive notebook for Python — run reproducible experiments, query with SQL, execute as a script, deploy as an app, and version with git. Stored as pure Python. All in a modern, AI-native editor.项目地址: https://gitcode.com/GitHub_Trending/ma/marimomarimo 允许你把笔记本导出为基于 WebAssembly 的自包含 HTML再通过--include-cloudflare标志自动生成 Cloudflare Worker 所需的index.js与wrangler.jsonc配置文件最终用npx wrangler deploy一条命令免费部署到 Cloudflare Workers本文完整覆盖这条发布链路WASM 导出参数、两个自动生成文件的实际内容结合仓库源码逐字段解析、本地预览命令、Worker 部署、以及通过 GitHub 仓库或手动上传两种方式发布到 Cloudflare Pages 的详细步骤。一、前提先导出 WASM 版 HTMLmarimo 的核心卖点之一是存储为纯 Python 文件、运行时完全可移植。当你要把笔记本发布给没有 Python 环境的用户时官方推荐的路径是把笔记本导出为 WebAssemblyWASM驱动的 HTMLPython 直接在浏览器内通过 Pyodide 运行接收者无需安装任何依赖。Cloudflare 发布正是建立在这一步之上的在marimo export html-wasm命令上追加--include-cloudflare标志即可。根据是否允许接收者编辑代码分为两种模式只读应用代码锁定接收者只能交互marimo export html-wasm notebook.py -o output_dir --mode run --include-cloudflare可编辑笔记本接收者可以修改并运行代码marimo export html-wasm notebook.py -o output_dir --mode edit --include-cloudflarehtml-wasm命令的完整参数在 WASM HTML 导出指南中有详细说明与 Cloudflare 发布最相关的选项包括--moderun只读或edit可编辑--output保存 HTML 与所需资源的目录--show-code/--no-show-code导出后是否默认展示代码--watch/--no-watch监视笔记本变化并自动重新导出--include-cloudflare写入部署 Cloudflare 所需的配置文件--execute/--no-execute导出前运行笔记本并嵌入输出作为预览尽可能使用固定到 WASM 兼容包的隔离环境该标志在 CLI 中的定义见 命令注册代码click.option( --include-cloudflare/--no-include-cloudflare, defaultFalse, help( Whether to include Cloudflare Worker configuration files (index.js and wrangler.jsonc) for easy deployment. ), )两点使用限制需要注意来自导出指南与命令源码导出的 HTML 必须通过 HTTP 服务访问不能直接从文件系统file://打开服务器还必须提供assets目录——这正是 Cloudflare 方案要解决的问题wrangler.jsonc会把整个输出目录挂为静态资产导出前建议运行marimo check notebook.py --select MW提前发现 WASM 不兼容的问题如不兼容的导入 MW001、不安全的系统调用 MW002、缺少 WASM 兼容轮的依赖 MW003规则定义见 WASM 限制说明。二、--include-cloudflare到底生成了什么使用--include-cloudflare后marimo 会在输出目录的父目录中创建两个文件index.js一个简洁的 Cloudflare Worker 脚本负责把你的静态资源即输出目录里的 HTML 与 assets伺服出来wrangler.jsoncCloudflare Wrangler CLI 的配置文件生成逻辑的入口在 html_wasm 命令if include_cloudflare: create_cloudflare_files(parse_title(name), out_dir)其中parse_titlemarimo/_convert/common/filename.py会把笔记本文件名去掉扩展名、把下划线替换为空格作为 Worker 的项目名称。2.1 index.js 的实际内容create_cloudflare_filesmarimo/_cli/export/cloudflare.py写入的 Worker 脚本全文如下export default { async fetch(request, env) { const url new URL(request.url); if (url.pathname.startsWith(/health)) { return new Response(JSON.stringify({ made: with marimo }), { headers: { Content-Type: application/json }, }); } return env.ASSETS.fetch(request); }, };它的行为非常直接命中/health前缀的请求返回 JSON{made: with marimo}可直接用作部署后的健康检查探针其余所有请求都转发给env.ASSETS.fetch(request)即 Wrangler 托管的静态资产绑定——对应你导出目录里的index.html、assets/等文件。一个防御性细节如果父目录中已存在index.js或wrangler.jsoncmarimo 会打印提示并跳过覆盖cloudflare.py 第 19-22 行与 43-46 行因此你之前对index.js做的自定义改动不会因重新导出而丢失。2.2 wrangler.jsonc 的实际内容配置模板见 cloudflare.py 第 49-61 行以输出目录output_dir为例生成的内容形如{ name: notebook, // 由笔记本文件名经 parse_title 生成 main: index.js, compatibility_date: 2025-01-01, assets: { directory: ./output_dir, // 即 -o 指定的输出目录相对父目录 binding: ASSETS } }字段含义nameCloudflare 上的项目名默认取笔记本文件名去掉扩展名、下划线转空格mainWorker 入口即上面那个index.jscompatibility_date固定写为2025-01-01assets.directory指向你的导出目录assets.binding为ASSETS与index.js中env.ASSETS.fetch对应。命令行结束后marimo 还会在终端打印下一步指引若配置目录与当前工作目录不同会自动追加--cwd 父目录参数例如npx wrangler dev --cwd ./parent_dir npx wrangler deploy --cwd ./parent_dir该行为由 cloudflare.py 第 63-82 行 的提示逻辑决定。仓库中的集成测试 test_cli_export_html_wasm_cloudflare 验证了这条链路执行导出后断言index.js与wrangler.jsonc确实落在输出目录的父目录下且index.js包含env.ASSETS.fetch(request)。三、本地预览与部署到 Cloudflare Workers3.1 本地运行在生成了wrangler.jsonc的目录下运行npx wrangler devWrangler 会在本地启动模拟的 Worker 环境浏览器打开后提示的本地地址即可看到完整运行的 WASM 笔记本。若父目录不是当前目录记得带上--cwdmarimo 导出时已替你算好。3.2 部署确认本地运行无误后npx wrangler deploy部署成功后你的笔记本就运行在一个 Cloudflare Worker 上任何访问该 URL 的用户都能在浏览器中执行这个 Python 笔记本——服务器端没有任何 Python 运行时全部计算发生在访问者的浏览器里这也是它可以免费托管的关键。3.3 自定义鉴权与自定义端点由于index.js是一个普通的 Worker 模块你可以在部署前自由修改它在fetch入口加入鉴权逻辑保护你的笔记本不被公开访问新增同域 API 端点来伺服数据避免跨域CORS问题。由于重新导出不会覆盖已存在的index.js先改index.js、再反复导出的工作流是安全的若确实需要重置模板手动删除该文件后重新导出即可。四、替代方案发布到 Cloudflare Pages如果不需要 Worker 的逻辑只想要静态托管可以用 Cloudflare Pages 发布有两种方式。4.1 通过 GitHub 仓库自动部署通过 repo.new 创建一个空的 GitHub 仓库进入导出目录初始化并推送cd output_dir git init git remote add origin https://github.com/your-gh-username/repository-name git add . git commit -m Initial commit git branch -M main git push -u origin main登录 Cloudflare 控制台在 Account Home 中选择 Workers Pages Create application Pages Connect to Git选中刚创建的仓库并在 Set up builds and deployments 中填入Project name output-dir Production branch main Framework preset None Build command (optional) exit 0 Build output directory /保存并部署。要点Build command填exit 0表示不做任何构建导出产物已是现成的静态文件输出目录填/即仓库根目录。4.2 手动上传部署不走 Git 的快速路径把output_dir整个文件夹压缩为output_dir.zip登录 Cloudflare 控制台在 Account Home 中选择 Workers Pages Create application Pages Upload asset输入项目名点击 Upload 并选择output_dir.zip保存并部署。五、选型建议与注意事项Workersnpx wrangler deploy适合需要自定义端点、鉴权、健康检查/health已内置的场景且部署一条命令完成推荐作为默认路径Pages GitHub适合希望每次git push自动重建部署、纳入版本管理的工作流Pages 手动上传适合一次性分享、无需 CI 的临时场景。三条路径的共同前提是导出物本身可用笔记本需兼容 Pyodide 的 WASM 环境可用marimo check --select MW预先排查且导出目录中的assets必须与 HTML 一并被伺服——Workers 方案的wrangler.jsonc已自动处理这一点Pages 方案下则要求压缩/推送的是整个output_dir内容.nojekyll等隐藏文件也会随导出生成用于避免静态托管方对资源解析的干扰见 导出命令。如果笔记本含有昂贵的计算单元格或依赖浏览器无法安装的包还可以在导出时追加--execute并结合cache_cells true把单元格缓存打进导出包细节参见 WASM HTML 导出指南中的缓存章节除此之外marimo 还提供 GitHub Pages 发布 与 自托管 WASM 作为同类替代。【免费下载链接】marimoA reactive notebook for Python — run reproducible experiments, query with SQL, execute as a script, deploy as an app, and version with git. Stored as pure Python. All in a modern, AI-native editor.项目地址: https://gitcode.com/GitHub_Trending/ma/marimo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考