模块化

WordPress块编辑器基于这样一种思想,即可以将独立的块组合在一起来撰写文章或构建页面。块也可以相互使用和交互。这使得它非常模块化和灵活。

但块编辑器并不仅仅因为其行为和输出而采用模块化。Gutenberg存储库也是作为几个可重用的独立模块或包从头开始构建的,这些模块或包组合在一起,就形成了我们都知道的应用程序和界面。这些模块称为WordPress包并定期在npm包存储库中发布和更新。

这些软件包用于支持块编辑器,但可以用于支持WordPress管理员或外部的任何页面。

为什么?

使用模块化体系结构对所有参与者都有几个好处:

  • 每个包都是一个独立的单元,有一个定义良好的公共API,用于与其他包和第三方代码交互。这样更容易核心贡献者对代码库进行推理。他们可以一次关注一个包,了解它并进行更新,同时确切地知道这些更改会如何影响依赖于给定包的所有其他部分。
  • 模块方法也有利于最终用户它允许有选择地在不同的WordPress管理页面上加载脚本,同时保持包含的包大小。例如,如果我们使用组件包来支持插件的设置页面,则无需在该页面上加载块编辑器包。
  • 该体系结构还允许第三方开发人员通过将这些包用作npm或WordPress脚本依赖项,在WordPres上下文内外重用这些包。

程序包类型

古腾堡仓库中的几乎所有内容都内置在一个包中。我们可以将这些软件包分为两种不同的类型:

生产包

这些是WordPress本身作为JavaScript脚本提供的包。这些构成了在浏览器上运行的实际生产代码。举个例子组件包作为一组可重用的React组件,用于快速原型化和构建接口。还有一个api获取可用于调用WordPress Rest API的包。

第三方开发人员可以用两种不同的方式使用这些生产包:

  • 如果您正在构建一个在WordPress上下文之外运行的JavaScript应用程序、网站和页面,您可以像使用npm注册表中的任何其他JavaScript包一样使用这些包。
npm安装@wordpress/components
从“@wordpress/components”导入{Button};函数MyApp(){return<Button>好看的按钮</Button>;}
  • 如果你正在构建一个在WordPress上运行的插件,你可能更喜欢使用WordPres本身附带的包。这允许多个插件重用相同的包并避免代码重复。在WordPress中,这些包以WordPres脚本的形式提供,其句柄遵循以下格式wp-package名称(例如。wp-组件). 一旦您将脚本添加到自己的WordPress插件脚本依赖项中,该包将在水处理全局变量。
//我的插件.php//依赖于“组件”和“元素包”的脚本注册示例。wp_register_script('myscript','pathtomyscript.js',数组('wp-components',“react”));
//在脚本中使用包const{Button}=wp.components;函数MyApp(){return<Button>好看的按钮</Button>;}

脚本依赖项定义对于开发人员来说可能是一项繁琐的任务。错误和疏忽很容易发生。如果您想了解如何自动化此任务。检查@wordpress/脚本@wordpress/dependency-extraction-webpack-plugin语言文档。

带有样式表的包

一些生产包提供样式表以正常工作。

  • 如果您将包用作npm依赖项,则样式表将在建筑风格包的文件夹。确保在应用程序中加载此样式文件。
  • 如果您在WordPress的上下文中工作,则必须将这些样式表排队或添加到样式表依赖项中。样式表句柄与脚本句柄相同。

在现有WordPress页面的上下文中,如果你省略了正确定义脚本或样式依赖关系,如果WordPress或其他插件已经在那里加载了这些脚本和样式,你的插件可能仍然可以正常工作,但如果您想避免在未来版本中出现潜在的破坏,强烈建议您彻底定义所有依赖项。

带有数据存储的包

一些WordPress生产包定义了数据存储来处理它们的状态。第三方插件和主题也可以使用这些存储来检索和操作数据芯/包名称(例如@wordpress/块编辑器包定义并使用核心/块编辑器数据存储)。

如果你正在使用这些存储来访问和操作插件中的WordPress数据,不要忘记将相应的WordPRES脚本添加到你自己的脚本依赖项中,这样你的插件才能正常工作。(例如,如果您从核心/块编辑器商店,您应该添加wp-块编辑器包到脚本依赖项,如上图所示)。

开发包

这些是在开发模式下使用的包,用于帮助开发人员完成开发、构建和发布JavaScript应用程序、WordPress插件和主题的日常任务。它们包括用于提取代码库、构建代码库、测试代码库的工具…

编辑器包

Post Editor模块体系结构

不同编辑器包之间的区别是什么?每个包的目的是什么?

新的贡献者经常会惊讶地发现,post编辑器是作为三个独立包的分层抽象构建的@文字新闻/编辑-帖子,@wordpress/编辑器,以及@wordpress/块编辑器.

以上内容为什么?本节应该提供一些上下文,说明单个包如何满足特定的要求。这也适用于这些包:

  • @wordpress/块编辑器提供用于实现块编辑器的组件,对块对象数组的基本值进行操作。它不假设这个值是如何保存的,也不知道(或要求)WordPress站点。
  • @wordpress/编辑器是WordPress文章块编辑器的增强版本。它使用来自@wordpress/块编辑器包裹。了解WordPress帖子的概念后,它将表示块的值的加载和保存机制与帖子及其内容相关联。它还提供了与在编辑器上下文中使用post对象相关的各种组件(例如,post title输入组件)。这个包可以支持编辑任何类型的帖子,并且不假设渲染发生在任何特定的WordPress屏幕或布局安排中。
  • @文字新闻/编辑-帖子是WordPress管理员中“New Post”(“Edit Post”)屏幕的实现。它负责提供的各种组件的布局@wordpress/编辑器@wordpress/块编辑器,完全了解它是如何在WordPress管理仪表板的特定屏幕中显示的。

通过这种结构,这些软件包可以在“New Post”屏幕使用范围之外的多种组合中使用:

  • A类@wordpress/编辑网站@wordpress/edit-widgets编辑包可以作为“站点编辑器”或“小工具编辑器”的类似实现,其方式与@文字新闻/编辑-帖子.
  • @wordpress/编辑器可以用于“可重用块”块的实现,因为它本质上是一个与post类型相关联的嵌套块编辑器wp_块.
  • @wordpress/块编辑器可以独立于WordPress使用,也可以使用完全不同的保存机制。例如,它可以用于网站帖子的评论编辑器。

走得更远