用途:Marko Run 是基于 Vite 的 Marko 应用框架,采用文件式路由、流式 SSR、零配置。适用于构建或编辑 src/routes 下的路由文件。
主要能力:src/routes 下仅 + 前缀文件可路由,其余文件被忽略,可自由放置组件与测试。请求流程为中间件(根到叶)→ handler → 布局(根到叶)→ 页面,布局与页面编译为一个组件。ctx(handler/中间件)等同 $global(模板),ctx.params 与 ctx.url 默认序列化到浏览器,其他需通过 ctx.serializedGlobals 添加。数据经 next({...}) 向下传递到 ctx.data / $global.data(浅合并),可传 Promise 并在页面用 <await> 等待,提前 await 会破坏流式渲染。Run 为全局对象无需导入,提供 Run.GET/HEAD/POST/PUT/DELETE/PATCH/OPTIONS/QUERY/ALL、Run.href 及类型 Run.Context、Run.Platform。
文件与路径:+page.marko 处理 GET 返回 HTML;+layout.marko 包裹嵌套布局与页面,input.content 为子内容;+handler.ts 导出 Run.X(...);+middleware.ts 默认导出 Run.ALL(...) 或 Run.POST(...);+meta.json/+meta.ts 提供静态 ctx.meta;+404.marko、+500.marko 仅限根目录。路径段支持静态、_admin 无路径、$id 参数、$$rest 捕获全部;支持扁平路由、多路径、分组、可选段,控制字符用反引号转义。
用法:handler 中可用 Run.POST({ json: Schema }, async (ctx, next) => {...}),ctx.body 为 Promise,校验失败返回 422 或 next({ issues }) 重渲染。选项含 params、search、json、form(含 maxBytes、maxParts、maxFiles 等限制)。ctx 提供 fetch、render、redirect、back。Run.href 在 .marko-run/routes.d.ts 纳入 tsconfig 时提供类型化 URL。
配置与部署:无需 vite.config,需要时使用 marko({ adapter, routesDir, trailingSlashes })。适配器解析顺序为选项、依赖名匹配、内置 Node;提供 node、static、netlify 适配器。可嵌入 @marko/run/router 的 fetch/match/invoke。CLI 命令 marko-run 支持 dev、build、preview,均可带 -c 配置与 -e dotenv。
限制与常见错误:GET 中提前 await 数据会阻塞整个响应;成功 POST 返回 next() 会导致刷新重复提交,应改用重定向;异步 Standard Schema 校验器运行时会抛错,仅支持同步;ctx.body 是 Promise 而非函数;始终返回自有 Response 的 handler 不会渲染页面;$$catch-all 目录内不可嵌套路由文件;客户端默认仅序列化 params/url,切勿序列化密钥。