Aleph.js 实战:用 Deno 打造 React 全栈应用并部署到 Deno Deploy
后端【免费下载链接】aleph.jsThe Full-stack Framework in Deno.项目地址https://gitcode.com/gh_mirrors/al/aleph.js点击查看免费下载本指南以仓库中 examples/react-app 目录下的 React 示例应用为完整范例讲解如何在 Aleph.jsThe Full-stack Framework in Deno中搭建一个具备 SSR、文件路由、数据加载与变更data/mutation能力的 React 应用并配置 Deno Deploy 插件完成云端部署。读完本文你将掌握 Aleph.js React 应用的标准目录结构、serve()插件式服务端入口的写法、useData驱动的数据流模式以及面向无动态导入环境的部署适配原理。一、示例应用概览一个麻雀虽小、五脏俱全的全栈应用仓库根目录 README.md 将 examples/react-app 列为 Aleph.js 新架构下部署到 Deno Deploy 的演示应用之一该示例自身的 README.md 明确其定位A React demo application powered by Aleph.js in Deno, deploy to Deno Deploy。整个应用由四个页面级模块组成通过文件系统路由自动映射路由文件路由路径职责routes/_app.tsx/_app全局布局组件包裹所有页面routes/index.tsx/首页展示品牌信息与入口routes/todos.tsx/todosTodos 待办应用含数据与变更逻辑routes/_404.tsx/_404404 兜底页面路由聚合文件 是部署层的路由清单它将上述四个模块按路径名映射导出/_404、/_app、/、/todos。该文件头部注释明确说明其作用——Exports router modules for serverless env that doesnt support the dynamic import且在开发模式下会自动更新不应手工编辑详见后文部署插件源码分析。首页 routes/index.tsx 展示了框架的两个核心 APIHead在页面级声明式注入title与meta标签SSR 与客户端渲染均会正确处理LinkAleph.js 内置的客户端路由导航组件rolebutton、to/todos替代原生a实现无刷新页面切换。404 页面 routes/_404.tsx 同样使用Link提供返回首页的导航。二、从 HTML 入口到 React 挂载启动链路拆解1. 静态 HTML 骨架examples/react-app/index.html 是标准的 Aleph.js 应用入口页!DOCTYPE html html langen head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 link relicon href./assets/logo.svg link relstylesheet href./style/app.css /head body div idroot/div script typemodule src./main.ts/script /body /html关键点在于div idroot容器与./main.ts模块脚本——这是 bootstrap 挂载 React 应用的目标节点也是 SSR 产物 hydration 的落点。2. 客户端启动bootstrapexamples/react-app/main.ts 极其精简只有两行核心逻辑import { bootstrap } from aleph/react; bootstrap();bootstrap的实现位于 framework/react/client.ts它默认查询#root元素创建 CSR 上下文createCSRContext然后根据页面是否存在script idssr-data来决定走hydrateRootSSR 水合还是createRoot().render纯客户端渲染。这正是 Aleph.js 实现同构的关键分支逻辑。3. React 配置与依赖管理仓库根目录的 deno.json 为整个工作区含该示例声明了编译选项jsx: react-jsx、jsxImportSource指向 React 18.2.0并指定importMap为 import_map.json。后者是 Aleph.js 与 React 集成的枢纽aleph/react→./framework/react/mod.tsReact 框架模块aleph/plugins/react→./framework/react/plugin.tsReact 插件aleph/plugins/deploy→./plugins/deploy.ts部署插件react/react-dom→ esm.sh 上的 React 18.2.0也就是说示例中出现的import { bootstrap } from aleph/react、import react from aleph/plugins/react等语句均由该 import map 解析到仓库内对应的真实源码文件。三、服务端入口serve() 与插件化配置examples/react-app/server.ts 是整个应用的服务端心脏全文如下/** format */ import { serve } from aleph/server; import react from aleph/plugins/react; import denoDeploy from aleph/plugins/deploy; import modules from ./routes/_export.ts; serve({ plugins: [ denoDeploy({ moduleMain: import.meta.url, modules }), react({ ssr: true }), ], });serve()定义于 server/mod.ts其执行流程清晰可循加载插件遍历options.plugins逐个调用plugin.setup(config, { isDev })其中isDev取决于Deno.args是否包含--dev注入全局配置将剩余配置写入globalThis.__ALEPH_CONFIG创建请求处理器createHandler(config)生成最终 HTTP handler生产构建分支若参数包含--build则执行build(handler)后直接返回用于产出静态构建产物开发监听分支若为开发模式则调用watch()监听应用目录文件变化启动 HTTP 服务支持--port命令行覆盖端口支持 TLSserveTls。React 插件SSR 能力的开关react({ ssr: true })对应 framework/react/plugin.ts 中的ReactPlugin当Deno.args包含--dev时设置环境变量REACT_REFRESHtrue启用 React Fast Refresh热更新当传入ssr选项时将render挂载到aleph.ssr上开启服务端渲染。其render函数plugin.ts使用 React 18 的renderToReadableStream进行流式 SSR并通过 suspense marker 机制支持Suspense 服务端渲染这与仓库中 examples/react-suspense-ssr 示例一脉相承。ssr选项既可以是布尔值也可以是更细粒度的SSROptions对象。Deno Deploy 插件面向 Serverless 的路由预加载denoDeploy({ moduleMain: import.meta.url, modules })对应 plugins/deploy.ts 中的DenoDeployPlugin。其源码注释点明了设计动机A plugin for Deno Deploy which doesnt support the dynamic import——Deno Deploy 这类 Serverless 环境不支持运行时动态import因此必须把路由模块静态化地聚合起来。该插件在非开发模式下会通过moduleMain定位应用根目录__ALEPH_APP_DIR用于后续资源路径解析将_export.ts中聚合的所有路由模块含depGraph依赖图信息预注册到路由表替换aleph.router.modules使请求处理器直接从这份静态清单中查找路由而无需动态 import。而 generateExportTs 负责在开发模式下自动维护_export.ts它遍历路由配置用 esbuild 将各路由模块打包进导出文件并内联依赖图depGraph。因此_export.ts文件头的do NOT edit it manually警告是字面意义的——它是构建管线esbuild watch的产物。四、布局与路由_app 与文件路由约定全局布局 _app.tsxexamples/react-app/routes/_app.tsx 定义了所有页面的公共外壳import Header from ../components/Header.tsx; export default function App({ children }: { children: React.ReactNode }) { return ( Header / {children} / ); }children即当前匹配到的页面组件。Header.tsx 展示了两个常见实践用Link to/实现 Logo 点击回首页的客户端导航用原生a放置 Deno Land / GitHub 图标外链。文件路由的匹配机制从 framework/core/router.ts 的matchRoutes可以看到文件路由的三条核心规则直接匹配优先在routes中寻找与当前pathname完全匹配的路由index 兜底若无直接匹配尝试追加/index匹配如/docs可命中docs/index.tsx嵌套与兜底命中嵌套路由时依次收集父级布局最终若完全未命中则推入/_404路由并把/_app布局置于匹配栈顶部。这解释了_export.ts中为什么是/: $2、/_404: $0、/_app: $1的固定形态——路径名即路由标识。客户端导航与路由监听Link组件底层依赖 listenRouter它同时监听navigation/popstate历史事件并在导航时重新执行matchRoutes、按需加载路由模块、拉取页面数据fetchRouteData最后通过回调更新 React 状态。此外它还能响应 HMR 事件hmr:create/hmr:remove在开发中新增或删除路由文件时热更新路由表——与 deploy 插件自动重写_export.ts形成闭环。五、数据层实战data mutation 模式Todos 应用todos.tsx 是本示例最有价值的部分完整演示了 Aleph.js 的同文件数据层模式在同一个路由文件中同时导出data读、mutation写和默认组件渲染。1. 服务端数据源data 导出export const data () { return Response.json(store); };store是一个简单的内存数据源初始化时从localStorage恢复变更后写回。data导出返回Response由框架统一接管SSR 时在服务端调用并把结果序列化进页面以ssr-datascript 注入客户端则通过GET /todos?_data_以 JSON 方式拉取。这一点在集成测试中有直接验证见第七节。2. 服务端变更处理mutation 导出export async function mutation(req: Request): PromiseResponse { const { id, message, completed } await req.json(); switch (req.method) { case PUT: { store.todos.push({ id: Date.now(), message, completed: false }); store.save(); break; } case PATCH: { const todo store.todos.find((todo) todo.id id); if (todo) { todo.completed completed; store.save(); } break; } case DELETE: { store.todos store.todos.filter((todo) todo.id ! id); store.save(); } } return Response.json(store); }mutation是一个标准Request Response处理器按 HTTP 方法分发PUT新增、PATCH切换完成状态、DELETE删除每次变更后返回最新完整数据。注意它同时被同文件的路由模块复用PUT、PATCH、DELETE请求/todos时由它处理GET /todos?_data_时由data导出处理读写同源、同文件职责一目了然。3. 客户端消费useData组件内部通过useData获得数据与变更能力const { data: { todos }, isMutating, mutation, } useData{ todos: Todo[] }();其实现位于 framework/react/data.ts 的DataProvider上下文useData返回data含 Promise 场景的 Suspense 支持、reload、mutation、isMutating。mutation提供post/put/patch/delete四个方法内部统一走action流程data.ts支持optimistic update先本地浅拷贝数据并应用乐观更新再等待服务端响应支持replace策略响应成功后用服务端返回的新数据整体替换本地状态失败回滚若请求失败res.status 400自动恢复rollbackData缓存 TTL根据响应头Cache-Control: max-age计算dataExpires实现客户端缓存时效。4. 三种更新策略示例// 新增乐观更新 replace 替换 await mutation.put( { message }, { optimisticUpdate: (data) ({ todos: [...data.todos, { id: 0, message, completed: false }], }), replace: true, }, ); // 勾选完成字符串简写 replace mutation.patch({ id: todo.id, completed: !todo.completed }, replace); // 删除同样使用 replace mutation.delete({ id: todo.id }, replace);optimisticUpdate让新增操作先渲染后落盘输入框通过disabled{!!isMutating}防止提交期间重复操作。整套模式的底层send函数data.ts会把对象载荷序列化为 JSON 并设置Content-Type: application/json; charsetutf-8对字符串、FormData、Blob 等也有对应的编码分支。六、SSR 与 Head搜索引擎可见性的基石本示例开启了react({ ssr: true })因此首次请求即返回完整的服务端渲染 HTML。集成测试断言了这一点title ssrAleph.js/title、meta namedescription ... ssr证明Head组件framework/react/head.ts在 SSR 阶段会把title、meta、link等标签收集进ssrHeadCollection并注入 HTML客户端水合时再接管为动态管理并清理带ssr标记的残留节点。这种首屏完整 HTML 后续客户端导航的组合让 routes/index.tsx 中这段代码在实际页面中同时服务于 SEO 与 SPA 体验Head titleAleph.js/title meta namedescription contentThe Fullstack Framework in Deno. / /Head七、测试与运行验证仓库为 examples/react-app 提供了完整的集成测试 tests/integration_react_app_test.tsx通过MockServerappDir 指向./examples/react-app、ssr: { render }复用 React 插件渲染逐场景断言GET /返回 200HTML 包含header、SSR 版title/meta、Todos App Demo链接、router-manifest与ssr-data注入脚本PUT PATCH /todos新增Better Call Saul!待办后标记完成校验 JSON 响应状态与内容GET /todos?data验证数据接口返回待办数组GET /todos验证 SSR 页面包含渲染后的待办数据DELETE /todos删除后数据归零{ todos: [] }GET /404返回 404 状态码并渲染_404.tsx文案。运行方式可从仓库脚本与 server/mod.ts 推导开发模式执行deno run -A dev.ts --dev触发文件监听与 React Refresh生产构建执行deno run -A dev.ts --build均可通过--port指定端口。测试执行deno test tests/integration_react_app_test.tsx即可复现上述全部断言。八、小结一条可复制的 React 全栈应用模板回顾整个示例Aleph.js 的 React 全栈开发范式可以概括为四条可复制的心智模型同文件数据层data读mutation写 默认导出组件一个路由文件承载完整页面能力服务端与客户端共享同一份逻辑插件式服务编排serve({ plugins: [denoDeploy(...), react({ ssr: true })] })声明式组合部署适配 渲染引擎文件路由约定_app布局、_404兜底、index 路由兜底与嵌套匹配路由清单_export.ts由工具链自动维护SSR 优先的部署策略Deno Deploy 插件通过静态聚合路由模块绕开动态 import 限制让 React SSR 应用可以完整部署到 Serverless 平台。若需进一步参考可对比仓库内同架构示例examples/react-mdx-appMDX 内容路由、examples/react-suspense-ssrSuspense 流式渲染进阶、examples/with-unocss/react-app接入 UnoCSS 样式方案以探索不同场景下的组合用法。赞分享后端【免费下载链接】aleph.jsThe Full-stack Framework in Deno.项目地址https://gitcode.com/gh_mirrors/al/aleph.js点击查看免费下载相关推荐Aleph.js部署指南Deno Deploy、Docker与生产环境优化Aleph.js部署指南Deno Deploy、Docker与生产环境优化 Aleph.js 是构建在 Deno 之上的全栈框架为现代 Web 开发提供了极后端Deno Deploy 实战部署指南从 deno deploy CLI 到生产环境的全流程配置Deno Deploy 实战部署指南从 deno deploy CLI 到生产环境的全流程配置 导读 本文以 autoskills 仓库内置的 Deno DeUltra部署指南Deno Deploy、Fly.io实战终极教程Ultra部署指南Deno Deploy、Fly.io实战终极教程 Ultra是一个零遗留的Deno/React Suspense SSR框架专为现代Web上一篇10个TimLiu-Android精选UI库让你的应用界面秒变高大上下一篇SwiftUI-MVVM单元测试全攻略MockAPIService与ViewModel测试技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考