Vortigern同构数据加载深度解析:redux-thunk + asyncConnect客户端服务器双端取数
Vortigern同构数据加载深度解析redux-thunk asyncConnect客户端服务器双端取数【免费下载链接】vortigernA universal boilerplate for building web applications w/ TypeScript, React, Redux, Server Side Rendering and more.项目地址: https://gitcode.com/gh_mirrors/vo/vortigernVortigern 是一款基于 TypeScript、React、Redux 构建的通用 Web 应用脚手架它的同构数据加载机制由两把钥匙组成用redux-thunk处理异步取数用redux-connect 的 asyncConnect实现客户端与服务器端的双端取数。本文带你走通服务端先取数 → 序列化状态 → 客户端水合复用的完整链路快速看懂 Vortigern 同构渲染SSR下的数据层设计 一、什么是同构数据加载为什么需要双端取数在纯客户端渲染CSR的 SPA 里页面要等 JS 下载执行完才开始请求数据首屏空白、SEO 也不友好。而同构Universal应用的思路是服务器端先执行路由匹配和异步取数把带有真实数据的首屏 HTML 直接返回客户端加载后通过水合hydrate复用服务器已经取好的状态不重复发请求交互无缝衔接。Vortigern 把这套流程开箱即用地封装好了核心角色如下组件在双端取数中的职责所在文件redux-thunk编写异步 action按请求中/成功/失败分步 dispatchsrc/app/redux/store.tsasyncConnectredux-connect在组件上声明异步数据需求服务端执行、客户端复用src/app/containers/Stars/index.tsxloadOnServer让服务器等所有异步数据就绪后再渲染 HTMLsrc/server.tsxisomorphic-fetch统一浏览器与服务端的 fetch APIsrc/server.tsx、src/client.tsxreduxAsyncConnect reducer缓存已解析的异步结果是客户端不再重取的关键src/app/redux/reducers.ts二、redux-thunk把异步取数写成三步动作Vortigern 的官方示例是 Stars 页面——请求 GitHub API 获取仓库 star 数。数据模块位于src/app/redux/modules/stars/index.ts它定义了三种 action 类型stars/GET_REQUEST发起请求isFetching置为 truestars/GET_SUCCESS拿到stargazers_count写入countstars/GET_FAILURE记录错误信息error置为 true。对应的异步 action creator 就是一个 thunkexport function getStars() { return (dispatch) { dispatch(starsRequest()); return fetch(https://api.github.com/repos/barbar/vortigern) .then(res res.ok ? res.json().then(d dispatch(starsSuccess(d.stargazers_count))) : res.json().then(d dispatch(starsFailure(d)))) .catch(err dispatch(starsFailure(err))); }; }这种一个取数流程 三个可预测的 action的写法让状态变化模型定义在src/app/models/stars.ts完全可测试。而 redux-thunk 正是让dispatch(getStars())得以接收函数的中间件它与routerMiddleware一起在src/app/redux/store.ts中注册。三、asyncConnect客户端服务器双端取数的关键光有 thunk 还不够——谁来触发它、谁来保证两端行为一致答案是组件上的asyncConnect装饰器。src/app/containers/Stars/index.tsx的核心只有寥寥几行asyncConnect([{ promise: ({ store: { dispatch } }) dispatch(getStars()), }]) connect(state ({ stars: state.stars })) class Stars extends React.Component { /* ... */ }它的工作机制非常精巧服务端渲染到该组件时asyncConnect会执行promise回调把取数挂起取数结果被 redux-connect 缓存进独立的reduxAsyncConnect状态块该 reducer 在src/app/redux/reducers.ts中通过combineReducers注册客户端水合同一组件时检测到状态里已有缓存结果直接跳过取数逻辑。也就是说同一段asyncConnect声明在两端语义自动切换为取数与复用这就是双端取数零重复请求的秘密 ⚡四、服务端流程loadOnServer 先取数、后渲染服务器入口src/server.tsx对每个请求做了 4 件事用createMemoryHistory(req.originalUrl)创建内存路由并调用configureStore(memoryHistory)生成每请求独立的 store避免请求间状态串扰通过 react-router 的match匹配路由路由表在src/app/routes/index.tsx共/、/about、/counter、/stars四条调用loadOnServer(asyncRenderData).then(...)——等待全部 asyncConnect 的 promise 解析才执行ReactDOMServer.renderToString此时输出到浏览器的 HTML 已经包含了真实数据。顺序不能颠倒如果跳过loadOnServer直接渲染SSR 页面只会输出Fetching Stars的占位文案首屏数据就丢了。五、客户端流程window.INITIAL_STATE水合服务器渲染完页面后还要把状态交棒给浏览器src/app/containers/Html/index.tsx使用 serialize-javascript 把整个 store 状态序列化为window.__INITIAL_STATE__...内联进 HTML客户端入口src/client.tsx读出该状态作为初始参数传给configureStore(browserHistory, window.__INITIAL_STATE__)最后用ReactDOM.hydrate而非render让 React 复用服务器生成的 DOM 节点。完整链路可以浓缩为一句话浏览器请求 → 服务端路由匹配 → asyncConnect 触发 getStarsthunk→ loadOnServer 等待解析 → 输出带数据 HTML → 状态序列化进INITIAL_STATE→ 浏览器水合 → 客户端命中缓存、不再重复请求六、快速上手克隆 Vortigern 并启动想亲眼验证双端取数按下面命令即可本地跑起来git clone https://gitcode.com/gh_mirrors/vo/vortigern cd vortigern npm install npm start启动后访问/stars路由页面显示的数字正是服务器端经 GitHub API 取回的 star 数——你可以打开浏览器网络面板确认数据请求发生在服务端客户端并未重复发起。开发模式下 store 还自动挂上了 logger 与 Redux DevTools见src/app/redux/store.ts能直观看到三个 action 依次流过。七、如何测试同构取数逻辑异步取数的正确性靠单测保障Vortigern 提供了完整示例src/app/redux/modules/stars/index.test.ts用fetch-mock分别 mock 200 与 400 两种响应配合redux-mock-store断言 action 序列必须是GET_REQUEST → GET_SUCCESS或GET_FAILUREsrc/app/helpers/TestHelper.tsx封装了带 thunk 中间件的mockStore与组件渲染工具可直接复用执行npm test即可运行全部用例Karma Mocha Chai。八、常见问题 FAQQ为什么客户端水合后不会再次请求 GitHub APIAasyncConnect 的结果缓存在state.reduxAsyncConnect中注册于src/app/redux/reducers.ts客户端水合时 redux-connect 判定数据已存在即跳过 promise 执行。Q为什么服务端要为每个请求新建 storeAsrc/server.tsx中每个请求独立创建 store保证并发请求之间状态隔离互不污染。Q为什么用 serialize-javascript 而不是 JSON.stringifyA前者能安全处理 undefined、函数等值并规避内联脚本的 XSS 风险见src/app/containers/Html/index.tsx。QRedux DevTools 在生产环境会存在吗A不会。src/app/redux/store.ts仅在开发环境注入 logger 与 DevTools 增强生产构建自动剔除。一句话总结Vortigern 用 redux-thunk 把异步取数变成可预测、可测试的 action 流再用 asyncConnect 让同一段声明在服务端取数、在客户端复用配合 loadOnServer 与INITIAL_STATE序列化构成了一套简洁而完整的同构数据加载方案——这也是学习 SSR 应用数据层设计的一份优质样板。【免费下载链接】vortigernA universal boilerplate for building web applications w/ TypeScript, React, Redux, Server Side Rendering and more.项目地址: https://gitcode.com/gh_mirrors/vo/vortigern创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

离线LLM应急调度协议:边缘AI自主决策与动态优先级调度实现

离线LLM应急调度协议:边缘AI自主决策与动态优先级调度实现

这次我们来看一个专门为本地部署的大语言模型(LLM)设计的“离线应急调度协议”草案规范。这个项目并非一个具体的软件或工具,而是一套技术设计草案,旨在解决一个核心痛点: 当设备完全离线、网络中断时,如何…

2026/8/23 17:21:25 阅读更多 →
Java八股文的价值与高效学习路径

Java八股文的价值与高效学习路径

1. 关于Java八股文的现状讨论 最近两年在技术社区经常看到一种论调:"Java八股文已经没用了"、"背面试题不如刷算法"、"框架原理背了也用不上"。作为一个经历过三次技术周期更替的老Javaer,今天想从几个维度聊聊这个话题。…

2026/8/23 17:21:25 阅读更多 →
AI面试系统架构与2026年企业招聘趋势

AI面试系统架构与2026年企业招聘趋势

1. 为什么AI面试将在2026年成为企业标配 1.1 招聘效率的革命性提升 传统面试流程平均耗时27天才能完成一个岗位的招聘,而AI面试系统可以将这个周期压缩到72小时以内。我们团队去年在金融行业实测的数据显示,AI初筛环节能过滤掉83%明显不符合要求的候选人…

2026/8/23 17:21:25 阅读更多 →

最新新闻

论文AI率过高怎么办?2026年12款免费降AI率工具实测指南

论文AI率过高怎么办?2026年12款免费降AI率工具实测指南

现在毕业论文答辩前,“AI率超标”已经彻底取代“查重率过高”,成了同学们的头号难题!不少同学只是用AI润色了摘要和结论,AI率直接飙升到离谱,纯手动修改根本不管用——这说明AIGC检测系统抓的不是个别词语,…

2026/8/23 23:59:54 阅读更多 →
Marketch:从Sketch画板直接量取CSS

Marketch:从Sketch画板直接量取CSS

Marketch:从Sketch画板直接量取CSS 【免费下载链接】marketch Marketch is a Sketch 3 plug-in for automatically generating html page that can measure and get CSS styles on it. 项目地址: https://gitcode.com/gh_mirrors/ma/marketch 设计稿交付还在…

2026/8/23 23:59:54 阅读更多 →
如何在ThinkPad X390上安装macOS:OpenCore EFI完整指南

如何在ThinkPad X390上安装macOS:OpenCore EFI完整指南

如何在ThinkPad X390上安装macOS:OpenCore EFI完整指南 【免费下载链接】ThinkpadX390-Opencore-EFI macOS Catalina & Big Sur & Monterey on ThinkPad X390 (Hackintosh) 项目地址: https://gitcode.com/gh_mirrors/th/ThinkpadX390-Opencore-EFI …

2026/8/23 23:59:54 阅读更多 →
WechatHook 终极指南:5大核心能力详解,3分钟看懂微信自动化

WechatHook 终极指南:5大核心能力详解,3分钟看懂微信自动化

WechatHook 终极指南:5大核心能力详解,3分钟看懂微信自动化 【免费下载链接】WechatHook Enjoy hooking wechat by Xposed....Accessibility...and so on... 项目地址: https://gitcode.com/gh_mirrors/we/WechatHook WechatHook 是一个基于 Xpos…

2026/8/23 23:59:54 阅读更多 →
OpenModScan:免费跨平台 Modbus 主站调试工具,让现场通讯验证一键搞定

OpenModScan:免费跨平台 Modbus 主站调试工具,让现场通讯验证一键搞定

OpenModScan:免费跨平台 Modbus 主站调试工具,让现场通讯验证一键搞定 【免费下载链接】OpenModScan Open ModScan is a Free Modbus Master (Client) Utility 项目地址: https://gitcode.com/gh_mirrors/op/OpenModScan OpenModScan 是一款开源免…

2026/8/23 23:59:54 阅读更多 →
Gin-JWT认证与授权方案从Token到RBAC权限控制

Gin-JWT认证与授权方案从Token到RBAC权限控制

Gin-JWT认证与授权方案从Token到RBAC权限控制 文章导语 JWT(JSON Web Token)是现代Web服务的身份认证标准。在Gin框架中集成JWT看似简单,但涉及Token刷新、黑名单、多设备登录、RBAC权限控制等实际需求时,就需要更完善的设计。本文…

2026/8/23 23:57:54 阅读更多 →

日新闻

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →