title: "模块化" post_status: publish comment_status: open taxonomy: category: - gutenberg-docs post_tag: - Architecture - Explanations - Repos
模块化
WordPress 区块编辑器基于这样的理念:你可以将独立的区块组合在一起来撰写文章或构建页面。区块之间也可以相互使用和交互。这使得它非常模块化和灵活。
但区块编辑器不仅在行为和输出上采用模块化。Gutenberg 代码库本身也是由多个可复用且独立的模块(或称包)构建而成,这些模块组合在一起,形成了我们所熟知的应用和界面。这些模块被称为 WordPress 包,并在 npm 包仓库中定期发布和更新。
这些包不仅用于驱动区块编辑器,也可用于驱动 WordPress 后台或外部的任何页面。
为何采用模块化架构?
采用模块化架构对所有参与者都有多重益处:
- 每个包都是独立单元,拥有明确定义的公共 API,用于与其他包和第三方代码交互。这有助于核心贡献者更好地理解代码库。他们可以专注于单个包,理解其逻辑并进行更新,同时清楚知晓这些变更如何影响依赖该包的其他部分。
- 模块化方法对最终用户同样有益。它允许在不同 WordPress 管理页面选择性加载脚本,同时控制打包体积。例如,若使用组件包驱动插件设置页面,则无需在该页面加载区块编辑器包。
- 此架构还使第三方开发者能够通过 npm 或 WordPress 脚本依赖的形式,在 WordPress 内外环境中复用这些包。
包的类型
Gutenberg 仓库中的几乎所有内容都被构建成包。我们可以将这些包分为两种不同类型:
生产包
这些是随 WordPress 本身作为 JavaScript 脚本发布的包。它们构成了在浏览器中运行的实际生产代码。例如,有一个 components 包,作为可复用的 React 组件集,用于快速原型设计和构建界面。还有一个 api-fetch 包,可用于调用 WordPress Rest API。
第三方开发者可以通过两种不同的方式使用这些生产包:
- 如果你正在构建一个在 WordPress 上下文之外运行的 JavaScript 应用程序、网站或页面,你可以像使用 npm 注册表中的任何其他 JavaScript 包一样使用这些包。
npm install @wordpress/components
import { Button } from '@wordpress/components';
function MyApp() {
return <Button>Nice looking button</Button>;
}
- 如果你正在构建一个在 WordPress 上运行的插件,你可能更倾向于使用 WordPress 本身附带的包。这允许多个插件复用相同的包,避免代码重复。在 WordPress 中,这些包以 WordPress 脚本的形式提供,其句柄遵循
wp-package-name格式(例如wp-components)。一旦你将脚本添加到自己的 WordPress 插件脚本依赖项中,该包将在全局变量wp上可用。
// myplugin.php
// 依赖于 "components" 和 "element" 包的脚本注册示例。
wp_register_script( 'myscript', 'pathtomyscript.js', array ('wp-components', "react" ) );
// 在你的脚本中使用包
const { Button } = wp.components;
function MyApp() {
return <Button>Nice looking button</Button>;
}
对于开发者来说,定义脚本依赖项可能是一项繁琐的任务。错误和疏忽很容易发生。如果你想了解如何自动化此任务,请查看 @wordpress/scripts 和 @wordpress/dependency-extraction-webpack-plugin 文档。
包含样式表的软件包
某些生产环境软件包需要样式表才能正常运行。
- 若将软件包作为 npm 依赖项使用,样式表将位于软件包的
build-style文件夹中。请确保在应用程序中加载此样式文件。 - 若在 WordPress 环境中工作,需要将这些样式表加入队列或添加至样式表依赖项。样式表句柄与脚本句柄相同。
在现有 WordPress 页面环境中,若未正确定义脚本或样式依赖项,当这些脚本和样式已由 WordPress 或其他插件加载时,您的插件可能仍能正常工作。但强烈建议详尽定义所有依赖项,以避免未来版本可能出现的故障。
包含数据存储的软件包
部分 WordPress 生产软件包定义了用于处理状态的数据存储。这些存储也可被第三方插件和主题用于检索和操作数据。这些数据存储的名称同样遵循 core/软件包名称 的格式进行规范化(例如,@wordpress/block-editor 软件包定义并使用了 core/block-editor 数据存储)。
若您在插件中使用这些存储来访问和操作 WordPress 数据,请务必将对应的 WordPress 脚本添加至您插件的脚本依赖中,以确保插件正常运行。(例如,若您从 core/block-editor 存储中检索数据,则应如上文所示,将 wp-block-editor 软件包添加至您的脚本依赖中)。
开发包
这些是在开发模式下使用的包,旨在帮助开发者完成日常任务,包括开发、构建和发布 JavaScript 应用、WordPress 插件和主题。它们包含用于代码库检查、构建和测试的工具。
编辑器包

不同编辑器包之间有什么区别?每个包的用途是什么?
新贡献者常常惊讶地发现,文章编辑器是由三个独立包 @wordpress/edit-post、@wordpress/editor 和 @wordpress/block-editor 的分层抽象构建而成。
上面的为什么?部分应该解释了各个包如何旨在满足特定需求。这也适用于这些包:
@wordpress/block-editor提供了用于实现块编辑器的组件,操作块对象数组的原始值。它不假设此值如何保存,并且不了解(也不需要)WordPress 站点。@wordpress/editor是 WordPress 文章的增强版块编辑器。它使用@wordpress/block-editor包中的组件。由于了解 WordPress 文章的概念,它将表示块值的加载和保存机制与文章及其内容关联起来。它还提供了在编辑器上下文中处理文章对象的各种相关组件(例如,文章标题输入组件)。此包支持编辑任何文章类型的文章,并且不假设渲染发生在任何特定的 WordPress 屏幕或布局安排中。@wordpress/edit-post是 WordPress 管理后台中“新建文章”(“编辑文章”)屏幕的实现。它负责@wordpress/editor和@wordpress/block-editor提供的各种组件的布局,完全了解其在 WordPress 管理仪表板特定屏幕中的呈现方式。
通过这种结构,这些包可以在“新建文章”屏幕用例之外的各种组合中使用:
@wordpress/edit-site或@wordpress/edit-widgets包可以作为“站点编辑器”或“小部件编辑器”的类似实现,方式与@wordpress/edit-post非常相似。@wordpress/editor可以用于“可重用块”块的实现,因为它本质上是一个与文章类型wp_block关联的嵌套块编辑器。@wordpress/block-editor可以独立于 WordPress 使用,或者使用完全不同的保存机制。例如,它可以用于站点文章的评论编辑器。