我现在明白了,它与ES5/ESNext无关
是的,没错。
我同意雅各布在回答中所说的一切,但我特别想回答你问题的第三次修订,所以我决定写下这个答案,而不是通过评论来回答。
但在回应该修订之前,让我首先引用我在评论中最初所说的话:
即使使用ESNext方法,最终结果仍然是inES5,那么为什么使用ESNext是不安全的呢?但如果您在ESNext中构建,那么您需要运行build
setup它将您的代码转换为ES5,以最大限度地兼容不同的浏览器。如果修改构建脚本(已转换为ES5的脚本),则需要确保不使用ESNext代码/语法,否则块很可能是;“已终止”;在不支持您使用的ESNext代码的浏览器上运行时。
其次,是的,关于下面的后一句话,你是对的:
ES Next方法在进行更改后立即有效地“终止”了块。因此,您必须遍历此块的每个实例并对其进行更改。
然而,这实际上是因为block validation 而不是使用ESNext或ES5-摘自块编辑器手册:
在编辑器初始化期间,使用从post\'scontent解析的属性,为每个块生成已保存的标记。如果新生成的标记与post内容中已存储的标记不匹配,则该块将标记为无效。这是因为我们假设,除非用户进行编辑,否则标记应该与保存的内容保持一致。
因此,对于您的3个rd问题的修订版:
在查看了最近的视频后,似乎使用WordPress的“首选”方法开发自定义块仍然是一个问题。
可能吧,但如果您经常更改块代码,那么您可能会首选带有服务器端生成的输出的动态块,而不是带有客户端生成的输出的非动态块。
如果继续使用服务器侧渲染块,代码是否会遇到问题?
从上述块验证的角度来看,没有,因为块编辑器手册says:
对于许多动态块save
回调函数应返回为null
和
当你回来的时候null
, 编辑器将跳过块标记验证过程,避免频繁更改标记的问题。
如果您实际上没有经常更改块标记,那么正如另一个答案所说,您可以避免“更改块代码中的任何内容,并且您必须在编辑器中再次添加该块”(或块验证)问题,使用deprecated
所有物
摘自;How to preserve backward compatibility for a Block"E;在块编辑器手册中:
标记更改应限制在尽可能小的范围内,但如果一个锁需要更改其保存的标记,使以前的版本无效,则deprecated
version应添加块的。
ESNext+JSX示例:
块的旧版本:
registerBlockType( \'my-blocks/foo-bar\', {
title: \'Foo Bar\',
icon: \'megaphone\',
category: \'widgets\',
attributes: {},
save( props ) {
return <p>foo bar</p>;
},
} );
新版本-在此版本中,我们更新了块的标记以使用
div
而不是
p
<我们更新了块以使用新的
useBlockProps
钩住
block API version 2 (WordPress 5.6+):
registerBlockType( \'my-blocks/foo-bar\', {
apiVersion: 2,
title: \'Foo Bar\',
icon: \'megaphone\',
category: \'widgets\',
attributes: {},
edit( props ) { // define \'edit\' so that the block is centered and clickable
const blockProps = useBlockProps(); // here it\'s not useBlockProps.save()
return <div { ...blockProps }>foo bar</div>;
},
save( props ) {
const blockProps = useBlockProps.save();
return <div { ...blockProps }>foo bar</div>;
},
deprecated: [ {
attributes: {},
save( props ) {
return <p>foo bar</p>;
},
} ],
} );
附加说明
注册动态块时,应在两种PHP中定义块属性(使用
register_block_type()
) 和JavaScript(使用
registerBlockType()
)。
否则,你会遇到这样的问题this.