WordPress.com Calypso 暂存站点状态 Reducer 深度解析:从 automated-transfer 到 React 状态树
前端CMS【免费下载链接】wp-calypsoThe JavaScript and API powered WordPress.com项目地址https://gitcode.com/gh_mirrors/wp/wp-calypso点击查看免费下载暂存站点Staging Site是 WordPress.com 在发布前进行内容验证、代码测试与回滚演练的关键能力。本文聚焦 Calypso 前端状态管理库中负责「暂存站点自动化迁移/回滚状态」的 reducer 模块围绕 client/state/staging-site/README.md 展开逐层拆解状态值语义、reducer 数据流、selector 查询 API 与持久化机制。读完你将掌握如何基于stagingSite状态子树判断一次暂存站点创建transfer或删除revert是否正在进行、是否已完成并能在自己的组件中安全、准确地消费这些状态。一、模块定位为「进行中的迁移」而生的独立 reducer在 Calypso 庞大的client/state状态树中stagingSite是一个刻意「瘦身」的 reducer它只关心一件事——暂存站点的 automated-transfer自动化迁移状态。README 开宗明义地写道In this reducer, we store the automated-transfer status for the staging site.之所以要从完整的 automated-transfer 状态中拆出独立 reducerREADME 给出了两个核心动机数据简化真实的后端迁移状态机非常复杂而 UI 层真正关心的是start - in progress - end这一段线性序列因此 reducer 只保留这一最小必要信息归属对象特殊状态被写入生产站点production siteID之下而不是暂存站点自身。原因在于迁移transfer一开始暂存站点就处于不可用状态the staging site is unavailable from the start of the transferring process客户端无法以暂存站点的 ID 为 key 去查询它的状态只能把状态挂到生产站点上。从源码结构看该模块共由 6 个文件组成职责划分清晰reducer.jsreducer 定义与持久化包装actions.js唯一 action creatorsetStagingSiteStatusconstants.ts状态枚举StagingSiteStatusschema.js持久化 JSON Schema 校验init.js向 Redux store 注册 reducerselectors/4 个状态查询 selector。二、状态值语义六种状态 一个空值README 用一张表格完整定义了status字段的全部取值及其含义这也是理解整个模块的钥匙。结合 constants.ts 的源码实现各状态值整理如下StatusMeaningREADME 原文语义StagingSiteStatus 中的实际值COMPLETERecords exist for a transfer, and it has previously finished. 存在迁移记录且此前已成功完成transferStates.COMPLETEREVERTING后端返回信息表明暂存站点回滚删除流程正在进行revertingREVERTED暂存站点已被成功删除transferStates.REVERTEDTRANSFERRING迁移至 AtomicWordPress.com 托管运行时正在进行中transferringINITIATE_REVERTING回滚操作已发起客户端尚无 automated-transfer 数据initiate revertingINITIATE_TRANSFERRING迁移操作已发起客户端尚无 automated-transfer 数据initiate transferringfalsey如UNSET的Calypso 中不存在任何迁移相关信息值得注意的细节COMPLETE与REVERTED直接复用calypso/state/automated-transfer/constants中transferStates的取值而TRANSFERRING/REVERTING/ 两个INITIATE_*则是本模块自定义的字符串字面量。这正是 README 所说「把 transferStates 对象裁剪为只保留我们关心的状态」的代码体现——constants.ts 的注释进一步说明状态对象到 transferStates 的映射发生在staging-site-card/index.js组件中。从语义上可以把这些值分成三组终态TerminalCOMPLETE、REVERTED以及代表「从未发生迁移」的UNSET与NONE——它们都表示当前没有进行中的操作迁移进行态TransferringINITIATE_TRANSFERRING客户端刚发起、尚无后端数据→TRANSFERRING后端确认迁移进行中回滚进行态RevertingINITIATE_REVERTING→REVERTING。三、Reducer 实现keyedReducer 状态持久化reducer.js 的完整实现如下import { withStorageKey } from automattic/state-utils; import { SITE_STAGING_STATUS_SET as SET_STATUS } from calypso/state/action-types; import { combineReducers, keyedReducer, withSchemaValidation, withPersistence, } from calypso/state/utils; import { StagingSiteStatus } from ./constants; import { stagingSite as schema } from ./schema; export const status withPersistence( ( state StagingSiteStatus.UNSET, action ) { switch ( action.type ) { case SET_STATUS: return action.status || StagingSiteStatus.UNSET; default: return state; } } ); export const siteReducer combineReducers( { status, } ); // state is a map of transfer sub-states // keyed by the associated site id const validatedReducer withSchemaValidation( schema, keyedReducer( siteId, siteReducer ) ); const stagingSiteReducer withStorageKey( stagingSite, validatedReducer ); export default stagingSiteReducer;3.1 内层statusreducer默认状态为StagingSiteStatus.UNSET即空字符串对应 README 表格中的falsey情形仅响应SITE_STAGING_STATUS_SET一种 action 类型处理逻辑为action.status || StagingSiteStatus.UNSET当传入的status为假值时如null、undefined、自动回落为UNSET保证状态树中始终是一个可预期的字符串。3.2 中层siteReducer与 keyedReducersiteReducer通过combineReducers组合出{ status }形状随后keyedReducer( siteId, siteReducer )以 action 中的siteId字段为 key为每个站点生成一份独立的子状态。最终的状态树结构为stagingSite: { 12345: { status: transferring }, 67890: { status: complete }, ... }这正好与 schema.js 中patternProperties: { ^\\d$: ... }的约束对应——顶层对象的 key 必须是数字字符串形式的站点 ID每个站点下的合法字段是status字符串类型。3.3 外层持久化包装withSchemaValidation( schema, ... )在序列化/反序列化时用 schema.js 校验状态树避免非法数据进入持久化存储withStorageKey( stagingSite, ... )指定持久化存储 key 为stagingSite最终由 init.js 调用registerReducer( [ stagingSite ], stagingSiteReducer )注册进 Calypso 的 Redux store。test/reducer.js 中的测试用例验证了这一持久化行为以SITE_ID 12345、status: StagingSiteStatus.COMPLETE构造状态经serialize后root()序列化结果中该站点仍保留status字段经deserialize反序列化后status依然等于COMPLETE——说明status是唯一需要持久化的键且能完整往返。四、Action 与 Action Type模块只暴露一个 action creator actions.jsimport { SITE_STAGING_STATUS_SET } from calypso/state/action-types; import calypso/state/staging-site/init; export const setStagingSiteStatus ( siteId, status ) ( { type: SITE_STAGING_STATUS_SET, siteId, status, } );typeSITE_STAGING_STATUS_SET定义于 client/state/action-types.ts由 reducer 中的SET_STATUS别名消费siteId站点 ID。如前所述这里应当传入生产站点的 ID因为状态被 keyed 到生产站点之下status新的状态值类型为string | null见 JSDoc可为 README 表格中的任意值或nullnull 会被 reducer 兜底为UNSET。在组件中典型用法形如dispatch( setStagingSiteStatus( siteId, StagingSiteStatus.TRANSFERRING ) )用于在 UI 发起迁移/回滚操作时同步本地状态。五、Selector 查询 API如何读取状态selectors/index.ts 统一导出了 4 个查询函数全部通过getStagingSiteInfo( state, siteId )先取出某站点生产站点 ID的子状态再作判断。它们也是组件消费该模块状态的标准入口。5.1 getStagingSiteStatus —— 取原始状态值定义get-staging-site-status.ts签名getStagingSiteStatus( state, siteId ) string | null语义返回stagingSite[siteId].status的原始字符串若siteId为空或该站点无任何记录则回落为StagingSiteStatus.UNSET。对应 README 表格中falsey情形——Calypso 中不存在任何迁移信息。5.2 getIsStagingSiteStatusComplete —— 是否处于「完成/空闲」态定义get-is-staging-site-status-complete.ts签名getIsStagingSiteStatusComplete( state, siteId ) boolean语义当状态为COMPLETE、REVERTED、NONE或UNSET之一时返回true。即迁移已成功结束、站点已删除或从未进行过迁移——UI 可以据此隐藏 loading 态、展示操作按钮。5.3 getIsStagingSiteInTransition —— 是否处于「进行中」态定义get-is-staging-site-in-transition.ts签名getIsStagingSiteInTransition( state, siteId ) boolean语义当状态为INITIATE_TRANSFERRING、TRANSFERRING、INITIATE_REVERTING或REVERTING之一时返回true。这是判断「暂存站点正在创建或删除中」的关键 selector通常用于禁用按钮、展示 spinner 等交互反馈。getIsStagingSiteStatusComplete与getIsStagingSiteInTransition互为补集NONE/UNSET归入前者二者共同覆盖了 README 所述的完整状态序列startINITIATE_*→ in progressTRANSFERRING/REVERTING→ endCOMPLETE/REVERTED。5.4 getStagingSiteInfo —— 底层取数定义get-staging-site-info.ts签名getStagingSiteInfo( state, siteId ) Object语义直接返回state.stagingSite[siteId]当siteId为假值或该站点无记录时返回空对象{}。其余三个 selector 都依赖它做空值兜底因此组件内通常不需要直接调用。六、数据流全景与实战接入要点综合以上实现一次「创建暂存站点」的完整状态流转在客户端可归纳为UI 发起迁移 →dispatch( setStagingSiteStatus( productionSiteId, INITIATE_TRANSFERRING ) )此时客户端尚无后端 automated-transfer 数据后端返回迁移进行中的信息 → 状态更新为TRANSFERRING迁移完成 → 状态更新为COMPLETE发起删除 →INITIATE_REVERTING→ 后端确认回滚中 →REVERTING→ 删除成功 →REVERTED。回滚删除流程与之一一对称。接入新组件时建议遵循以下要点用对 ID所有 action 与 selector 传入的siteId都应是生产站点ID而非暂存站点自身 ID迁移期间暂存站点不可用这是 README 反复强调的设计原因优先用语义 selector判断「能否操作」用getIsStagingSiteStatusComplete判断「正在操作」用getIsStagingSiteInTransition仅在需要展示精确文案时才读取getStagingSiteStatus的原始值借助模块化状态规范模块遵循 Calypso 的 modularized state 约定——actions.js、selectors/index.ts均以import calypso/state/staging-site/init开头确保按需加载时 reducer 已被注册持久化安全status经 schema.js 校验后持久化非法结构会被过滤读取侧无需额外防御非法数据。七、小结stagingSitereducer 用最小的状态面一个status字段支撑了暂存站点创建/删除全生命周期的 UI 呈现其设计精髓在于面向 UI 需要而非后端全量状态、按生产站点 ID 建索引、语义化 selector 屏蔽内部细节。阅读 README 掌握状态语义表结合 constants.ts、reducer.js 与 selectors 理解实现再对照 test/reducer.js 验证持久化行为即可完整掌握该模块并在实际组件中正确使用。赞分享前端CMS【免费下载链接】wp-calypsoThe JavaScript and API powered WordPress.com项目地址https://gitcode.com/gh_mirrors/wp/wp-calypso点击查看免费下载相关推荐wp-calypso Automated Transfer 状态子树解析从 status 语义到 Redux 状态管理实战wp calypso Automated Transfer 状态子树解析从 status 语义到 Redux 状态管理实战 Automated Transfe前端CMS深入解析 wp-calypso 的 Atomic Transfer 状态管理Actions、Reducer 与状态机语义深入解析 wp calypso 的 Atomic Transfer 状态管理Actions、Reducer 与状态机语义 导读 Atomic Transfer前端CMSwp-calypso Site Sync 状态管理从 State 树到 SITE_SYNC_STATUS 状态机全解析wp calypso Site Sync 状态管理从 State 树到 SITE_SYNC_STATUS 状态机全解析 导读 Site Sync站点同步是前端CMS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

e2e Cache 性能指南:如何读懂 replayed、handed off、missed 三种缓存结果

e2e Cache 性能指南:如何读懂 replayed、handed off、missed 三种缓存结果

e2e Cache 性能指南:如何读懂 replayed、handed off、missed 三种缓存结果 【免费下载链接】e2e Next generation e2e testing framework for web and mobile apps. 项目地址: https://gitcode.com/GitHub_Trending/e2e6/e2e e2e 是一款面向 Web 和移动端的下…

2026/10/7 8:31:17 阅读更多 →
如何高效精读一篇顶会前沿论文并写出高质量复现笔记:学者型工程师的方法论

如何高效精读一篇顶会前沿论文并写出高质量复现笔记:学者型工程师的方法论

如何高效精读一篇顶会前沿论文并写出高质量复现笔记:学者型工程师的方法论进入大模型与深度学习的爆发期后,AI 领域的从业者普遍面临前所未有的文献焦虑。arXiv 上每天涌入成百上千篇大模型论文,技术社区与自媒体充斥着“某某团队颠覆 Transf…

2026/10/7 8:30:16 阅读更多 →
复杂 Markdown 列表与引用清洗:消除多级嵌套缩进引发的切片语义断裂

复杂 Markdown 列表与引用清洗:消除多级嵌套缩进引发的切片语义断裂

复杂 Markdown 列表与引用清洗:消除多级嵌套缩进引发的切片语义断裂在企业级技术知识库中,从 Notion、Confluence 或飞书文档导出的 Markdown 文件,最容易让 RAG 切片流水线“暗地翻车”的排版格式,就是层层嵌套的复杂列表&#x…

2026/10/7 8:30:16 阅读更多 →

最新新闻

JAVAWEB校园二手平台毕设源码:部署、模块拆解与避坑指南

JAVAWEB校园二手平台毕设源码:部署、模块拆解与避坑指南

简介:面向JavaWeb课程设计及毕业设计学生的校园二手平台完整项目,覆盖用户注册登录、个人资料修改、商品信息管理、二手商品发布与分类检索等核心模块,适合作为毕设选题、课程项目或练手仿写参考。压缩包为rar格式,约29.02MB&…

2026/10/7 9:33:23 阅读更多 →
腾讯云一键开服实战:Minecraft、饥荒、幻兽帕鲁服务器搭建与配置指南

腾讯云一键开服实战:Minecraft、饥荒、幻兽帕鲁服务器搭建与配置指南

1. 从一条链接说起:游戏开服这件事到底被简化到了什么程度第一次看到“一键开服”这四个字的时候,我脑子里冒出来的画面是那种点一下按钮、进度条走完、控制台刷出一行“Done”的场景。实际用下来,腾讯云这套面向游戏服务器的开服入口&#x…

2026/10/7 9:33:23 阅读更多 →
农产品自主供销小程序毕设源码全解析:从部署到避坑

农产品自主供销小程序毕设源码全解析:从部署到避坑

简介:这是一套面向高校毕业设计与课程设计的农产品自主供销小程序源码,将Java后端与小程序前端结合,完整实现管理员、用户、农户三个角色的业务闭环,包含首页、个人中心、用户管理、农户管理、产品分类管理、农产品管理、咨询信息…

2026/10/7 9:33:23 阅读更多 →
JavaWeb学生成绩管理系统实现:从MySQL建库到Tomcat部署的完整避坑指南

JavaWeb学生成绩管理系统实现:从MySQL建库到Tomcat部署的完整避坑指南

简介:基于JavaWeb技术实现的高分学生成绩管理系统源码与数据库,面向计算机相关专业期末大作业、课程设计学习者,是一款经过导师指导、最终评定98分的完整实训项目。系统采用模块化设计,涵盖学生信息管理、成绩录入与查询、统计分析…

2026/10/7 9:33:23 阅读更多 →
FOC电机控制中的串级PID原理与实战调参

FOC电机控制中的串级PID原理与实战调参

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 9:33:23 阅读更多 →
C23标准中的#embed预处理指令深度实战:编译期零拷贝内嵌二进制资产

C23标准中的#embed预处理指令深度实战:编译期零拷贝内嵌二进制资产

C23标准中的#embed预处理指令深度实战:编译期零拷贝内嵌二进制资产在嵌入式 Linux 系统、Bootloader、工业人机界面(HMI)以及无文件系统的裸机固件开发中,将静态资源直接打包内嵌到只读代码段(.rodata)是一…

2026/10/7 9:32:23 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 8:21:32 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 4:21:51 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 1:18:13 阅读更多 →