编码指南

这份活的文件规定了针对古腾堡项目的编码指南。基本编码准则遵循WordPress编码标准以下各节概述了古腾堡项目中使用的其他模式和约定。

CSS公司

命名

为了避免类名冲突,类名必须遵循以下准则,这些准则的灵感来源于BEM(块、元素、修改器)方法.

分配给元素的所有类名必须以包的名称为前缀,后跟破折号和组件所在目录的名称。组件根元素的任何后代都必须附加一个以破折号分隔的描述符,用两个连续下划线与基元素分隔__.

  • 根元素:package目录
  • 子元素:包-目录_脚本-工具栏

根元素被视为中默认导出返回的最高祖先元素索引.js。值得注意的是,如果文件夹包含多个文件,每个文件都有自己的默认导出组件,则只有索引.js可以被视为根。所有其他人都应被视为后代。

例子:

考虑位于的以下组件软件包/组件/src/notification/index.js:

导出默认函数Notice({children,onRemove}){返回(<div className=“components-notice”>{childrens}<按钮className=“components-notice_dismiss”icon={check}label={__('撤销此通知')}onClick={onRemove}/></div>);}

可以为组件分配指示状态的类名(例如,“活动”选项卡或“打开”面板)。这些修饰符应作为单独的类名应用,前缀为形容词表达式是-(处于活动状态已打开). 在极少数情况下,您可能会遇到修饰符前缀的变体,通常是为了提高可读性(有警告). 由于修饰符类名没有上下文化到特定组件,因此它应该始终与被修改的组件一起写入样式表(.components-panel.is-opened).

例子:

再次考虑通知示例。我们可能希望对可驳回通知应用特定样式。这个clsx公司包裹对于有条件地应用修饰符类名,这是一个有用的实用程序。

从“clsx”导入clsx;导出默认函数Notice({children,onRemove,isDismissible}){const classes=clsx('components-notice'{“is-dimissible”:是不允许的,} );return<div className={classes}>{/*…*/}</div>;}

组件的类名应该从未在自己的文件夹外使用(很少有例外,例如_z索引.scss). 如果需要在自己的组件中继承另一个组件的样式,则应呈现该其他组件的实例。在最坏的情况下,您应该在自己组件的样式表中复制样式。这旨在通过将共享组件隔离为可重用接口来提高可维护性,通过调整一组有限的通用组件以支持一组不同的用例来减少类似UI元素的表面积。

块的SCSS文件命名约定

当Webpack运行时,构建过程会将块库目录中的SCSS拆分为两个单独的CSS文件。

放置在样式.scss文件将内置到块/build/style.css,加载到前端主题以及编辑器中。如果需要特定于块在编辑器中显示的其他样式,请将其添加到编辑.scss.

出现在主题和编辑器中的样式示例包括图库列和首字下沉。

JavaScript脚本

古腾堡的JavaScript使用了ECMAScript语言规范以及JSX语言语法扩展。这些是通过预设配置的组合启用的,特别是@wordpress/babel预设在项目的巴别塔配置。

分阶段工艺引入新的JavaScript语言功能提供了在新功能被认为完整之前使用新功能的机会,古腾堡项目和@wordpress/babel预设配置将仅针对已达到第4阶段(“完成”)的提案提供支持.

进口

在古腾堡项目中,我们使用ES2015导入语法使我们能够创建模块化代码,在特定功能的代码、不同WordPress功能之间共享的代码以及第三方依赖项之间有明确的分隔。

这些分隔由文件顶部的多行注释标识,该文件从另一个文件或源导入代码。

外部依赖

外部依赖项是WordPress贡献者不维护的第三方代码,而是作为默认脚本包含在WordPress中或从外部包管理器引用,如净现值法.

例子:

/***外部依赖项*/从“时刻”导入时刻;

WordPress依赖项

为了鼓励功能之间的重用性,我们的JavaScript被划分为特定于域的模块,这些模块出口一个或多个函数或对象。在古腾堡项目中,我们在顶级目录下区分了这些模块。每个模块都有一个独立的用途,代码通常在它们之间共享。例如,为了本地化其文本,编辑器代码需要包含来自国际18n模块。

例子:

/***WordPress依赖项*/从'@wordpress/i18n'导入{__};

内部依赖性

在特定功能中,代码被组织到单独的文件和文件夹中。与外部依赖项和WordPress依赖项一样,您可以使用进口关键字。这里的主要区别是,当导入内部文件时,应该使用特定于您正在工作的顶级目录的相对路径。

例子:

/***内部依赖性*/从“..”导入VisualEditor/可视化编辑';

传统的实验API、仅插件API和专用API

遗留的实验API

历史上,古腾堡使用__实验性的__不稳定的前缀表示给定的API尚不稳定,可能会发生更改。这是一个传统的约定,应该避免使用只支持插件的API模式或下面描述的私有API模式。

使用前缀的问题是,这些API很少得到稳定或删除。截至2022年6月,WordPress Core包含280个公开导出的实验API,这些API是在WordPress主要版本中从Gutenberg插件合并而来的。许多插件和主题开始依赖这些实验性的API来实现其他方式无法访问的基本功能。

遗产__实验性的API再也不能随心所欲地删除了。它们成为WordPress公共API的一部分,属于WordPress向后兼容性策略。删除它们需要一个弃用过程。对于某些API来说,这可能相对容易,但对于其他API来说,可能需要付出努力并跨越多个WordPress版本。

总之,不要使用__实验性的新API的前缀。使用插件式API和专用API。

仅插件API

仅插件API是从模块中导出的临时值,该模块的存在要么等待将来的修订,要么提供了立即结束的方法。

外部消费者:

仅插件API没有支持承诺。它们可以并且将在没有预先警告的情况下被删除或更改,包括作为次要版本或修补程序版本的一部分。作为外部消费者,您应该避免使用这些API。

致项目贡献者:

仅插件API是一个计划最终公开的版本,但还需要进一步的实验、测试和讨论。应使其稳定或尽早移除。

只有插件的API不包括在WordPress Core中,仅在Gutenberg插件中可用:

//使用globalThis。IS_GUTENBERG_PLUGIN允许Webpack排除此//从WordPress核心导出:如果(globalThis.IS_GUTENBERG_PLUGIN){从“”导出{doSomethingExciting}/api’;}

此类API的公共接口尚未最终确定。除了代码中的引用之外,它们的API既不应该被文档化,也不应该在任何CHANGELOG中提及。从外部角度来看,应该有效地认为它们不存在。在大多数情况下,只应公开它们以满足此存储库中维护的包之间的需求。

虽然仅限插件的API通常可以稳定为公开可用的API,但不能保证它会稳定。

专用API

每个@文字出版社想要私有访问或公开私有API的包可以
通过选择@文字新闻/私人广告:

//在packages/block-editor/private-apis.js中:从“@wordpress/private-apis”导入{__dangerousOptInToUnstableAPIsOnlyForCoreModules};导出常量{锁定,解锁}=__危险的OptInTo不稳定AP仅适用于核心模块(“我承认私有功能不适用于主题或插件,这样做会在下一版本的WordPress中中断。”,“@wordpress/block-editor”//调用__dangerousOptInToUnstableAPIsOnlyForCoreModules的包的名称,//(不是要访问其API的包的名称));

每个@文字出版社包只能opt-in一次。该过程清楚地传达了不应该使用的扩展器
本文档将重点介绍用法示例,但您可以了解更多关于@文字新闻/私人广告README.md中的包.

一旦选择了包,就可以使用锁定()解锁()实用程序:

//假设此对象是从包中导出的:导出const publicObject={};//但是,此字符串是内部字符串,不应公开:const privateString='私有信息';//解决方案:锁定对象的“内部”字符串:锁(publicObject,privateString);//字符串未嵌套在对象中,无法从中提取:console.log(publicObject);// {}//访问字符串的唯一方法是“解锁”对象:console.log(解锁(publicObject));//“私人信息”//lock()接受所有数据类型,而不仅仅是字符串:导出constantanotherObject={};lock(另一个对象,函数privateFn(){});console.log(解锁(另一个对象));//函数privateFn(){}

继续阅读以学习如何使用锁定()解锁()避免公开出口
不同种类的私有的API。

私有选择器和操作

您可以将专用选择器和操作附加到公用存储:

//在packages/package1/store.js中:从'导入{privateHasContentRoleAttribute}/民选;从'导入{privateToggleFeature}/私人行动;//“lock”函数从内部privateapis.js文件导出,其中//调用了opt-in函数。从'导入{lock,unlock}/锁定-解锁';export const store=registerStore(/*…*/);//将私人操作附加到导出的存储:解锁(存储).registerPrivateActions({私有切换功能,} );//将私人操作附加到导出的存储:解锁(存储).registerPrivateSelectors({privateHasContentRoleAttribute属性,} );
//在packages/package2/MyComponent.js中:从“@wordpress/package1”导入{store};从“@wordpress/data”导入{useSelect};//“unlock”函数从内部private-apis.js文件导出,其中//调用了opt-in函数。从'导入{unlock}/锁定-解锁';函数MyComponent(){const hasRole=使用选择((选择)=>//使用专用选择器:解锁(选择(存储)).privateHasContentRoleAttribute()//请注意,需要unlock()。这一行行不通://选择(存储).privateHasContentRoleAttribute());//使用私人操作:解锁(useDispatch(store)).privateToggleFeature();// ...}
私有函数、类和变量
//在packages/package1/index.js中:从'导入{lock}/锁定-解锁';导出const privateApis={};/*将私有数据附加到导出的对象*/锁(私人Apis{privateCallback:函数(){},privateReactComponent:函数PrivateComponent(){返回<div/>;},privateClass:class privateClass{},privateVariable:5,} );
//在packages/package2/index.js中:从“@wordpress/package1”导入{privateApis};从'导入{unlock}/锁定-解锁';常数{私人回拨,私有反应组件,privateClass、,私有变量,}=解锁(privateApis);

请记住始终在已注册商店。

有时这很简单:

export const store=createReduxStore(store_NAME,storeConfig());//“register”使用从“createReduxStore”创建的相同“store”对象。寄存器(存储);解锁(存储).registerPrivateActions({// ...} );

然而,有些软件包可能同时调用创建ReduxStore 寄存器存储。在这种情况下,请始终选择注册的商店:

export const store=createReduxStore(store_NAME{…storeConfig,persist:[“首选项”],} );const registeredStore=寄存器存储(STORE_NAME{…storeConfig,persist:[“首选项”],} );解锁(registeredStore).registerPrivateActions({// ...} );

私有函数参数

要向稳定函数添加私有参数,您需要
准备该函数的稳定版本和私有版本。
然后,导出稳定函数并锁定()不稳定函数
在里面:

//在@wordpress/package1/index.js中:从'导入{lock}/锁定-解锁';//私有函数包含所有逻辑函数privateValidateBlocks(公式,privateIsStrict){let isValid=false;// ...复杂的逻辑,我们不想重复。。。if(privateIsStrict){// ...}// ...复杂的逻辑,我们不想重复。。。返回有效;}//稳定公共函数是调用//禁用专用功能的专用功能导出函数validateBlocks(块){privateValidateBlocks(块,false);}导出const privateApis={};锁(privateApis,{privateValidateBlocks});
//在@wordpress/package2/index.js中:从“@wordpress/package1”导入{privateApis作为package1PrivateApis};从'导入{unlock}/锁定-解锁';//给定稳定的功能,私有功能可能会被“解锁”:const{privateValidateBlocks}=解锁(package1PrivateApis);privateValidateBlocks(块,true);

Private React组件属性

要向稳定组件添加私有参数,您需要
准备该组件的稳定版本和私有版本。
然后,导出稳定函数并锁定()不稳定函数
在里面:

//在@wordpress/package1/index.js中:从'导入{lock}/锁定-解锁';//私有组件包含所有逻辑const PrivateMyButton=({title,privateShowIcon=true})=>{// ...复杂的逻辑,我们不想重复。。。返回(<按钮>{privateShowIcon&&<图标src={someIcon}/>}{title}</按钮>);};//稳定公共组件是调用//禁用专用功能的专用组件export const MyButton=({title})=>(<PrivateMyButton title={title}privateShowIcon={false}/>);导出const privateApis={};锁(privateApis,{PrivateMyButton});
//在@wordpress/package2/index.js中:从“@wordpress/package1”导入{privateApis};从'导入{unlock}/锁定-解锁';//给定稳定组件,私有组件可能会“解锁”:const{PrivateMyButton}=解锁(privateApis);导出函数MyComponent(){return<PrivateMyButton data={data}privateShowIcon={true}/>;}

私人编辑器设置

WordPress扩展器无法自行更新私有块设置。这个更新设置()的操作@wordpress/块编辑器存储将筛选出以下所有设置公共API的一部分。实际存储它们的唯一方法是通过私人操作__实验更新设置().

要私有化块编辑器设置,请将其添加到私人设置中的列表/packages/block-editor/src/store/actions.js:

const privateSettings=['插入媒体类别',//在此处列出块编辑器设置以使其私有];

私有block.json和主题.json API

截至目前,没有办法限制块.json主题.jsonAPI(应用编程接口)
到古腾堡代码库。然而,在未来,新的私有API
只适用于核心WordPress块,插件和主题不适用
能够访问它们。

在thunks中内联小动作

最后,与其引入新的动作创建者,不如考虑使用砰的一声:

导出函数toggleFeature(scope,featureName){返回函数({dispatch}){调度({type:'__private_BEFORE_TOGGLE'});// ...};}

公开公开私有API

一些私有API可以从社区反馈中受益,将它们公开给WordPress扩展器是有意义的。同时,将它们变成WordPress核心中的公共API是没有意义的。你该怎么办?

您可以将该私有API重新导出为仅包含插件的API,以便仅在Gutenberg插件中公开:

//此函数不能由任何上下文中的扩展器使用:函数privateEverywhere(){}//此函数可以由带有Gutenberg插件的扩展器使用,但不能在vanilla WordPress Core中使用:函数privateInCorePublicInPlugin(){}//古腾堡在内部将这两种功能视为私有API:const privateApis={};锁(privateApis,{privateEverywhere,privateInCorePublicInPlugin});//privateInCorePublicInPlugin函数显式导出,//但由于以下原因,此导出不会合并到WordPress核心中//全球This。IS_GUTENBERG_PLUGIN检查。if(全局This.IS_GUTENBERG_PLUGIN){导出常量privateInCorePublicInPlugin=解锁(privateApis).privateInCorePublicInPlugin;}

物体

如果可能,使用速记符号定义对象属性值时:

常数a=10;//错误:常量对象={a: a、,performAction:函数(){// ...},};//好:常量对象={a、,执行操作(){// ...},};

字符串文字应使用单引号声明除非字符串本身包含需要转义的单引号&在这种情况下:使用双引号。如果字符串包含单引号如果是双引号,则可以使用ES6模板字符串来避免转义引号。

注:单引号字符(')决不能用撇号代替()例如它是还没有在用户界面字符串中。对于测试代码,仍然鼓励使用真正的撇号。

通常,避免使用反斜杠引号:

//错误:const name=“马特”;//良好:const name='Matt';//错误:const pet=“马特的狗”;//同样糟糕(不使用撇号):const pet=“马特的狗”;//良好:const pet=“马特的狗”;//也很好:const oddString=“她说‘这很奇怪。’”;

应尽可能在字符串连接上使用ES6模板字符串:

const name='Stacey';//错误:alert('我的名字是'+name+'.');//良好:alert(`我的名字是${name}。`);

可选链接

可选链接是ECMAScript规范2020版中引入的新语言功能。虽然该功能可以非常方便地访问可能为空的对象的属性(无效的未定义),在使用可选链接时,有许多常见的陷阱需要注意。这些问题可能是线头和/或类型选择在将来某个时候可以帮助防止的。在此期间,您需要谨慎对待以下事项:

  • 否定时(!)使用可选链接评估的值的结果,您应该注意,如果可选链接到达无法继续的点,它将生成一个假值将转换为真的当被否定时。在许多情况下,这并不是预期的结果。
    • 例子:const hasFocus=!节点参考电流?。包含(document.activeElement);将屈服真的如果节点Ref.当前未分配。
    • 参见相关问题:#21984
    • 参见类似的ESLint规则:无不安全否定
  • 分配布尔值时,注意可选链接可能会产生以下值虚伪的(未定义,无效的),但不严格。当值以预期为布尔值的方式传递时,这可能会成为一个问题(真的). 虽然布尔值很常见,因为布尔值通常用于逻辑广泛考虑真实性和虚假性的方式,但当急切地假设属性访问链末端产生的类型时,其他可选链也会出现这些问题。类型检查可能有助于防止此类错误。
    • 例子:document.body.classList.togle('has-focus',nodeRef.current?.contains(document.activeElement));可能是错误的添加班级,因为第二个参数是可选的.如果未定义传递时,它不会像在以下情况下那样取消设置类已通过。
    • 例子:<input value={state.selected?.value.trim()}/>通过在以下两者之间切换,可能会无意中导致React中出现警告受控和非受控输入。当急切地假设修剪()将始终返回一个字符串值,忽略了可选链接可能导致计算提前中止的事实未定义.

反应组分

最好将所有组件实现为功能组件,使用挂钩管理组件状态和生命周期。除了误差边界,不应该遇到必须使用类组件的情况。请注意WordPress代码重构指南适用于这里:不需要集中精力批量更新类组件。相反,将其视为一个很好的重构机会,并结合其他一些更改。

使用JSDoc的JavaScript文档

古腾堡遵循WordPress JavaScript文档标准,以及与其不同用途相关的附加指南导入语义在组织文件时TypeScript工具的使用用于类型验证,以及使用@wordpress/docgen公司.

有关其他指导,请参阅以下资源:

自定义类型

使用JSDoc文件@typedef(类型定义)标签.

自定义类型应包含描述,并且应始终包含其基类型。

自定义类型的命名应尽可能简洁,同时仍保持含义清晰,并避免与其他全局或作用域类型冲突。A类可湿性粉剂前缀应该应用于所有自定义类型。避免多余或冗余的前缀和后缀(例如类型后缀,或自定义前缀)。默认情况下,自定义类型不是全局的,因此自定义类型不需要过于特定于特定的包。然而,它们的命名应该具有足够的特异性,以避免在与另一种类型进入同一范围时出现歧义或名称冲突。

/***块选择对象。**@typedef WPBlockSelection**@property{string}clientId块客户端ID。*@property{string}attributeKey块属性键。*@property{number}offset属性值偏移量,基于富*文本值。*/

请注意,没有{对象}之间@typedef(类型定义)和类型名称。作为@财产下面的s告诉我们它是对象的类型,建议不要使用{对象}当您想要定义对象的类型时。

自定义类型也可用于描述一组预定义选项。类型联合可以将文本值用作内联类型,因此很难在对齐标记的同时仍然遵守80个字符的最大行长度。使用自定义类型定义联合类型可以提供描述这些选项用途的机会,并有助于避免这些行长度问题。

/***命名断点大小。**@typedef{“巨大”|“宽”|“大”|“中等”|“小”|“移动”}WPBreakpoint*/

请注意在定义一组字符串文字时使用引号。正如在JavaScript编码标准,在将字符串文本指定为类型或默认函数参数,或何时指定路径导入类型的。

导入和导出类型

使用类型脚本进口功能从其他文件或第三方依赖项导入类型声明。

由于导入的类型声明可能会占用多余的可用行长度,并且在多次引用时会变得冗长,因此建议您使用@typedef(类型定义)声明位于文件顶部,紧跟其后这个进口分组.

/**@typedef{import('@wordpress/data').WPDataRegistry}WPDataRegustry*/

请注意,可以导入其他文件中定义的所有自定义类型。

当考虑从WordPress包中提供哪些类型时@typedef(类型定义)应该将包入口点脚本中的语句视为与其公共API相同的有效语句。了解这一点很重要,既可以避免无意中在公共接口上公开内部类型,也可以作为公开项目公共类型的一种方式。

//包/data/src/index.js/**@typedef{import('./registry').WPDataRegistry}WPDataRegustry*/

在这个代码段中@typedef(类型定义)将支持使用前面的示例导入(“@wordpress/data”).

外部依赖

许多第三方依赖项将分发自己的TypeScript打字员。对于这些进口语义应该“有效”。

<img src=“https://user-images.githubusercontent.com/1779930/70167742-62198800-1695-11ea-9c21-82a91d4a60e2.png“alt=”工作示例:进口键入“/>

如果您使用TypeScript集成对于您的编辑器,通常可以看到,如果类型解析为除回退之外的任何内容,那么这是有效的任何类型。

对于不分发自己的TypeScript类型的包,欢迎您安装和使用已明确键入社区维护类型定义(如果存在)。

泛型类型

记录泛型类型时,例如对象,功能,承诺等,始终包含有关预期记录类型的详细信息。

//错误:/**@类型{对象}*//**@type{Function}(类型{函数})*//**@类型{Promise}*///良好:/**@type{Record<string,number>}*//*或*//*@type{{[setting:string]:任意}}*//**@type{(key:string)=>布尔}*//**@type{Promise<string>}*/

当对象用作字典时,可以用两种方式定义其类型:可索引接口({[设置:字符串]:任意})或记录。当对象的键名称为开发人员提供了操作提示时设置,使用可索引接口。如果不是,请使用记录.

此处的函数表达式使用TypeScript的函数类型语法,这对于提供有关预期参数的名称和类型的更详细信息非常有用。有关更多信息,请参阅类型脚本@类型标签功能建议.

在更高级的情况下,可以使用类型脚本@模板标签.

与关于类型联合和文字值的“自定义类型”建议类似,您可以考虑创建自定义类型@typedef(类型定义)更好地描述对象记录的预期键值,或提取复杂的函数签名。

/***apiFetch中间件处理程序。传递了获取选项,中间件是*期望在“下一个”中间件完成处理后调用该中间件。**@typedef{(选项:WPAPIFetchOptions,下一个:WPAPIFetchMiddleware)=>void}*/
/***命名断点大小。**@typedef{“巨大”|“宽”|“大”|“中等”|“小”|“移动”}WPBreakpoint*//***具有像素宽度的断点名称散列,在该散列处生效。**@type{Record<WPBreakpoint,number>}*/常量断点={巨大:1440/*,…*/};

可为null、未定义和void类型

可以使用前导来表示可为null的类型?。仅当描述类型或显式无效的值。不要将可为null的形式用作可选参数的指示符。

/***返回给定键的配置值(如果存在)。如果返回null*没有配置的值。**@param{string}key要检索的配置密钥。**@return{?*}配置值(如果存在)。*/函数getConfigurationValue(键){return config.hasOwnProperty(密钥)?config[key]:空;}

类似地,使用未定义仅当需要显式值时才键入未定义.

/***如果下一个HTML标记关闭当前标记,则返回true。**@param{WPHTMLToken}currentToken要比较的当前标记。*@param{WPHTMLToken|undefined}nextToken要比较的下一个标记。**@return{boolean}如果`nextToken`关闭`currentToken',则为True,否则为false。*/

如果参数是可选的,请使用平方拍记法。如果可选参数的默认值可以表示为默认参数在函数表达式中,不需要在JSDoc中包含该值。如果函数参数具有有效的默认值,该值需要复杂的逻辑,并且无法使用默认参数语法表示,则可以选择在JSDoc中包含默认值。

/***渲染工具栏。**@param{Object}props组件props。*@param{string}[props.className]要在容器`<div/>`上设置的类。*/

当函数不包含返回声明,据说它有一个空隙返回值。没有必要包含@返回标记,如果返回类型为空隙.

如果函数有多个代码路径,其中某些(但不是所有)条件导致返回语句,您可以将其记录为联合类型,包括空隙类型。

/***返回给定键的配置值(如果存在)。**@param{string}key要检索的配置密钥。**@return{*|void}配置值(如果存在)。*/函数getConfigurationValue(键){if(config.hasOwnProperty(键)){返回配置[key];}}

记录时函数类型,必须始终包含空隙返回值类型,否则将推断该函数返回混合(“any”)值,而不是void结果。

/***apiFetch中间件处理程序。传递了获取选项,中间件是*预计在完成处理后调用next中间件。**@typedef{(选项:WPAPIFetchOptions,下一个:WPAPIFetchMiddleware)=>void}*/

记录示例

因为使用@wordpress/docgen公司该工具将包括@示例如果定义了标记,则最好包括函数和组件的使用示例。这对于包的公共API的文档成员来说尤其重要。

记录示例时,使用标记\`\`\`代码块来划分代码示例的开头和结尾。示例可以跨越多行。

/***给定已注册存储的名称,返回存储的*选择器。选择器函数已预先绑定以传递当前*自动状态。作为消费者,您只需要传递*选择器(如果适用)。**@param{string}name存储名称。**@示例*```js*select('my-shop').getPrice('hammer');* ```**@return{Record<string,WPDataSelector>}包含存储的*选择器。*/

记录React组件

如果可能,所有组件都应实现为功能组件,使用挂钩用于管理组件生命周期和状态。

记录功能组件应与其他任何功能一样对待。记录组件时的主要注意事项是,该函数通常只接受一个参数(“props”),其中可能包含许多属性成员。使用参数属性的点语法记录单个道具类型。

/***将块的配置标题呈现为字符串,如果标题*无法确定。**@示例**```jsx*<BlockTitle clientId=“afd1cb17-2c08-4e7a-91be-007ba7ddc3a1”/>* ```**@param{Object}道具*@param{string}props.clientId块的客户端ID。**@return{?string}块标题。*/

对于类组件,不建议记录组件的属性。古腾堡不使用或认可propTypes(项目类型)静态类成员.

菲律宾比索

我们使用
个人电脑(PHP_CodeSniffer)使用WordPress编码标准规则集对该项目中的所有PHP代码运行大量自动检查。这确保了我们与WordPress PHP编码标准保持一致。

使用PHPCS的最简单方法是当地环境。安装后,可以通过运行以下命令检查PHPnpm运行lint:php.

如果您喜欢在本地安装PHPCS,您应该使用作曲家.安装作曲家然后运行编写器安装。这将安装个人电脑WordPress编码标准然后您可以通过它运行作曲家林特.