php - Gutenberg Blocks:使用 `register_block_type_from_metadata()` 注册多个块会在控制台中引发错误
问题描述
我正在练习如何创建古腾堡块插件。我使用@wordpress/create-block来创建一个块插件。
编辑:我没有像最初所说的那样使用 wp-cli 脚手架,我的意思是我使用了@wordpress/create-block。
脚手架上只有一个块,所以,如果你想要多个块,你必须修改结构,这并不难,但是,我希望块使用 block.json 来注册块register_block_type_from_metadata()
,我实现了,但问题是如果我在主插件的 PHP 文件中使用此代码(register_block_type_from_metadata两次):
function blocks_boilerplate_block_init() {
register_block_type_from_metadata( __DIR__ . '/src/blocks/example');
register_block_type_from_metadata( __DIR__ . '/src/blocks/example2');
}
add_action( 'init', 'blocks_boilerplate_block_init' );
要注册这些块,这些块会被注册并且它们可以正常工作,但 Chrome 控制台显示两个错误。
块“create-block/boilerplate-example”已经注册。
块“create-block/guten-block-example2”已经注册。
如果我register_block_type_from_metadata()
只使用一次,错误就会消失。
关于如何使错误消失的任何想法?
解决方案
问题是,当你@wordpress/create-block
用来创建一个包含块的插件,然后你npm start
用来运行所有东西时,webpack 会将所有块 JavaScript 代码编译到一个文件中,这很好,实际上是需要的,那样你就不需要了不必将一堆文件排入队列。block.json 文件包含一行"editorScript": "file:../build/index.js"
(或类似的东西)用于将主编译的 JS 文件排入队列,如果您只有一个块,则该行在 block.json 文件中是可以的,但是当您将插件的结构修改为包含更多块,每个块都有自己的 block.json 文件,包括editorScript
行,然后块被注册多次,每个 block.json 文件都有一个,所以,作为临时解决方案,我editorScript
从所有文件中删除了该行block.json
除了一个文件,错误消失了,我不喜欢那个解决方案,因为它破坏了一致性,所以,我将以下代码放在插件主 php 文件中:
function qas_enqueue_blocks_scripts() {
$asset_file = require plugin_dir_path( __FILE__ ) . 'build/index.asset.php';
wp_enqueue_script( 'qas-main', plugins_url( '/build/index.js', __FILE__ ), $asset_file['dependencies'], 1.0, false);
}
add_action( 'enqueue_block_editor_assets', 'qas_enqueue_blocks_scripts');
上面的代码将主index.js
文件排入块编辑器并获取文件依赖项,/build/index.asset.php
当您运行初始命令以创建插件和初始块时,会自动生成文件依赖项。使用该代码,您无需在editorScript
任何地方使用该行,因此您可以从所有 block.json 文件中删除它。
解决这个问题的其他方法是修改 webpack 配置,只将特定块的代码编译到主 JS 文件中,然后editorScript
在 every中继续使用block.json
,但我还没有尝试过。
推荐阅读
- javascript - 无法通过控制器中的 URL 获取 Id
- this - 'this' 关键字不引用它自己的对象
- python - python - 包含图像中像素(R,G,B,X,Y)的np数组
- javascript - HTML/JS - 从 Markdown 转换时无法呈现 HTML
- python - 用python第3章练习项目自动化无聊的东西
- batch-file - 批处理 - 使用移位和循环发送标准错误/输出
- javascript - 错误是否总是需要被 Promise 拒绝?快速路由异常处理
- python - 如何修复 macOS Hight Sierra 上的 sigabrt 错误?
- linux - 你可以在两个不同的目录中有一个文本文件吗?
- javascript - 如何使用 jquery 将表单值发送到 api