)
Gutenberg 回移植变更日志机制详解从 Core PR 记录到 Layout 类名修复WordPress 7.1 案例 11598【免费下载链接】gutenbergThe Block Editor project for WordPress and beyond. Plugin is available from the official repository.项目地址: https://gitcode.com/GitHub_Trending/gu/gutenberg本文以 Gutenberg 仓库中 backport-changelog/7.1/11598.md 这条回移植Backport记录为线索系统讲解 Gutenberg 插件如何通过独立 Markdown 文件追踪同步回 WordPress Core的每一次代码变更并深入分析该记录所对应的实际改动——Layout 类名应用位置的修复帮助读者理解 Gutenberg 与 WordPress Core 之间的代码同步机制与 Layout 支持系统的底层实现。一、什么是回移植变更日志Backport ChangelogGutenberg 是 WordPress 块编辑器的开发插件大量新特性先在该插件中迭代、测试随后再同步Backport到 WordPress Core 的wordpress-develop仓库随下一版本 WordPress 正式发布。为了让这一过程可追踪、可审计仓库在 backport-changelog/ 目录下维护了一套专门的变更日志体系。其核心规则见 backport-changelog/readme.md当 Gutenberg 插件的改动涉及需要回移植到 Core 的文件例如lib/目录下的 PHP 文件及 PHP 单元测试时该改动在合并进 Gutenberg trunk 之前必须先存在一个对应的 Core PR创建 Core PR 需要先在 Trac 开一个 ticket然后向 WordPress Core 的 GitHub 仓库提交 Pull Request每个 Core PR 对应的 Gutenberg PR 集合需要以独立 Markdown 文件的形式记录在backport-changelog/版本号/目录中。这套机制保证了任何进入 WordPress 下个版本的 Gutenberg 代码都有一条从Gutenberg PR到Core PR的可回溯链路。二、读懂一条回移植记录以 7.1/11598.md 为例先来看本文的主题文档 backport-changelog/7.1/11598.md 的完整内容https://github.com/WordPress/wordpress-develop/pull/11598 * https://github.com/WordPress/gutenberg/pull/77408这是一条典型的回移植记录结构非常精简只有两部分第一行Core PR 的 GitHub URL即wordpress-develop仓库中的 PR 编号11598以*开头的列表被该 Core PR 一并带回 Core 的 Gutenberg PR 列表这里是gutenberg仓库的 PR77408。根据 readme.md 的规范文件名就是 Core PR 编号11598.md文件放在目标 WordPress 版本的子目录下7.1/对应 WordPress 7.1 发布周期内容即Core PR URL 若干个 Gutenberg PR URL。一个 Core PR 可以包含来自一个或多个 Gutenberg PR 的改动本例就是 1:1 的关系。为什么用独立文件而不是单一 changelog 文件这是这套设计的一个关键取舍。多个开发者并行提交回移植记录时如果所有记录都追加到同一个大文件必然产生频繁的 rebase 冲突。改为一个 Core PR 对应一个文件后每个 PR 只创建或修改属于自己的文件互不干扰冲突面被降到最低。这也是backport-changelog/下按版本6.6、6.7、6.8、6.9、7.0、7.1、7.2划分目录的原因——每条记录天然归属于它所在的发布周期。什么情况下可以豁免并非所有被标记需要回移植的 PR 都必须创建 Core PR。readme 中明确列出了两种例外场景PR 只包含无关紧要的注释改动或对应改动已在 Core 中存在通过两个 GitHub label 显式排除Backport from WordPress Core表示该 PR 本身就是从 Core 回移植过来的无需再创建 Core PRNo Core Sync Required表示改动无需同步到 Core。此外如果某些文件或目录永远不应被标记为需要回移植可以在 CI 校验工作流 .github/workflows/check-backport-changelog.yml 与 .github 相关配置区域中维护例外清单。这保证了自动化的 backport 检查不会误报、也不会漏报。三、记录背后的真实改动Layout 类名应用位置修复PR 7740811598 这条 Core PR 带回 Core 的是 Gutenberg PR77408。它在插件主变更日志 changelog.txt 中的记录是Layout: Ensure layout classnames are applied to the inner blocks wrapper and not to its siblings. (77408)即确保 Layout 类名被应用到内部块的包裹元素wrapper上而不是它的兄弟元素siblings上。这是一个典型的渲染标记markup正确性修复如果类名被挂到了错误的节点主题开发者编写的、基于is-layout-flow等类名的样式将无法命中目标元素导致布局样式失效或错位。Layout 类名从哪来useLayoutClassesGutenberg 编辑器端生成 Layout 类名的核心逻辑在 packages/block-editor/src/hooks/layout.jsx 的useLayoutClasses钩子中。它根据块的layout属性与块注册时声明的默认 layout 支持返回一组类名基础类名根据 layout 类型default/flow、constrained、flex、grid生成例如is-layout-flow、is-layout-constrained、is-layout-flex、is-layout-grid同时生成带块名前缀的复合类名如wp-block-group-is-layout-flow全局内边距当主题开启useRootPaddingAwareAlignments且布局需要全局 padding 时追加has-global-padding方向与对齐is-horizontal/is-vertical、is-content-justification-*left/right/center/space-between、is-nowrap等辅助类名。这些类名随后通过withLayoutStyles高阶组件layout.jsx以__unstableLayoutClassNames属性传给BlockListBlock最终渲染到块的 DOM 元素上。PR 77408 修复的正是这一环节的挂载位置保证类名只落在内部块的 wrapper 上而不是错误地扩散到 sibling 元素从而保证 CSS 选择器 .alignleft、 .alignright这类以直接子元素为目标的规则见下文服务端定义始终按预期工作。服务端的对应实现gutenberg_get_layout_definitions类名与样式规则在服务端同样有完整定义。PHP 侧的布局定义集中在 lib/block-supports/layout.php 的gutenberg_get_layout_definitions()函数中每种布局类型都声明了 slug、className、baseStyles 与 spacingStyles例如defaultflow→is-layout-flow其baseStyles定义了 .alignleft的浮动规则、 .aligncenter的居中规则constrained→is-layout-constrained额外通过 :where(:not(.alignleft):not(.alignright):not(.alignfull))约束内容宽度为var(--wp--style--global--content-size)flex→is-layout-flex基础规则为flex-wrap: wrap与align-items: centergrid→is-layout-grid并利用container查询实现响应式列数见gutenberg_get_child_layout_style_rules中关于minimumColumnWidth与columnSpan的容器查询计算逻辑layout.php。PHP 注释明确提醒When making changes or additions to layout definitions, the corresponding JavaScript definitions should also be updated即 JS编辑器端与 PHP前端渲染端的布局定义必须保持同步。这也解释了为什么layout.jsx与layout.php会各自维护一份布局定义——PR 77408 这类修复往往需要两端联动。前端实际输出样式时gutenberg_get_layout_style()layout.php会调用gutenberg_style_engine_get_stylesheet_from_css_rules()将样式规则交给 Style Engine 统一序列化与输出保证生成的 CSS 与编辑器端预览一致。四、如何新增一条回移植记录实操如果你在维护 Gutenberg 相关代码、需要把改动同步回 Core按照 backport-changelog/readme.md 的流程操作在 Trac 创建新 ticket并向 WordPress Core 仓库提交 Core PR在backport-changelog/下找到目标 WordPress 版本的子目录不存在则创建例如backport-changelog/7.1/以 Core PR 编号命名文件例如11598.md写入内容第一行为 Core PR 的 GitHub URL后续每行一个*开头的 Gutenberg PR URL若同名文件已存在只需把新的 Gutenberg PR 追加到已有列表中即可一个 Core PR 可聚合多个 Gutenberg PR 的改动。文件的命名与放置位置没有歧义空间文件名 Core PR 编号目录 目标 WordPress 版本。例如 backport-changelog/7.1/6910.md 就记录了 Core PR 6910 聚合了 5 个 Gutenberg PR59483、60652、62777、63108、63464的多对一场景与本文 11598 的一对一场景形成对照。五、小结一条记录、一整套同步机制回到 backport-changelog/7.1/11598.md 本身——它只有两行链接却指向了一整套完整的工程协作机制回移植流程Gutenberg 改动 → 创建 Core PR → 独立 changelog 文件登记 → CI 校验 → 随下个 WordPress 版本发布具体技术内容Core PR 11598 将 Gutenberg PR 77408Layout 类名应作用于内部块 wrapper 而非兄弟元素带回 WordPress 7.1代码落点编辑器端 packages/block-editor/src/hooks/layout.jsx 的useLayoutClasses/withLayoutStyles与服务端 lib/block-supports/layout.php 的布局定义及样式生成函数共同保证了 Layout 类名与样式在前端、编辑器两端的一致性。理解这类回移植记录既能帮助插件与主题开发者追踪某个布局行为具体在哪个 WordPress 版本生效也能为想向 Gutenberg 贡献代码、并把改动同步进 Core 的开发者提供一条清晰的实践路径。【免费下载链接】gutenbergThe Block Editor project for WordPress and beyond. Plugin is available from the official repository.项目地址: https://gitcode.com/GitHub_Trending/gu/gutenberg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考