提供块定义库的插件是与 Blockly 社区分享可重复使用的块的绝佳方式。为了让您的功能块库尽可能多样化且实用,我们制定了以下准则。
指南
- 让用户能够轻松安装所有块,并能够让用户仅安装他们选择的特定块或特定块。
- 轻松安装所有内容:为此,您可以提供一个函数,用于安装单个块定义所需的每个部分(例如修饰符、扩展程序、混入项、字段等)。您还可以提供一个函数,用于一次性安装您的插件提供的所有代码块。
- 支持选择特定部分:您应单独导出代码块定义的所有部分,以便用户仅导入他们需要的部分,以便创建自己的类似自定义代码块。
- 避免在插件中使用副作用。
- 不应在加载插件的过程中安装代码块、字段、扩展程序和其他部分。用户应该能够控制安装哪些组件以及安装时间。这样,用户就可以导入所需的部分,而不必担心系统会安装不需要的部分。
使用 JSON 字段注册表,而不是直接实例化新字段。
不推荐 - 直接实例化新字段:
const myCustomBlock = { init: function() { this.appendDummyInput() .appendField(new Blockly.FieldNumber(123), 'NAME'); } }
推荐 - JSON 字段注册表:
export const myCustomBlock = { init: function() { this.appendDummyInput() .appendField(Blockly.fieldRegistry.fromJson({ name: 'field_number', value: 123, }), 'NAME'); } }
通过使用字段注册表,用户可以更轻松地替换您的块中使用的字段的实现,而无需更改块定义。
不要对用户已安装的内容做出假设。
- 如果您的插件需要自定义字段或其他插件,请自行在提供的
install
函数中注册这些字段。 - 很快,Blockly 将提供一些工具,让您能够顺利注册已注册的项目。在此之前,您可能需要先检查已注册的内容,然后再自行注册扩展程序、修饰符、混入或字段。
- 明确说明您的插件或代码块定义所需的所有前提条件或依赖项。
- 如果您的插件需要自定义字段或其他插件,请自行在提供的
考虑为您提供的每个代码块提供生成器函数。
- 提供开箱即用的生成器函数可让用户更轻松地使用您的块,而无需了解其结构和设计。如果他们必须编写自己的生成器函数,这可能会导致每位用户都执行多余的工作。
- JavaScript 是 Blockly 中最常用的语言,因此,如果您只选择一种语言来提供,我们建议您使用 JavaScript,除非您的代码块是针对特定语言(例如实现 Python 库)构建的。
- 考虑针对您无法实现生成器函数的语言发布“需要帮助”问题,并在用户贡献此类请求时接受针对这些语言的拉取请求。
如果您为块提供安装函数,则可以接受可选的
generators
参数。如果用户传递您支持的生成器实例,您可以自动安装块代码生成器函数并执行相关工作,例如添加保留字:// Your plugin's install function export const installMyCustomBlock(generators = {}) { Blockly.defineBlocks({my_custom_block: myCustomBlock}); if (generators.javascript) { generators.javascript.forBlock['my_custom_block'] = myCustomGeneratorFunction; generators.javascript.addReservedWords('specialReservedWord'); } } // How a user may install your block import {javascriptGenerator} from 'blockly/javascript'; import {installMyCustomBlock} from 'blockly-cool-blocks-plugin'; // installs the block definition and the javascript block-code generator installMyCustomBlock({javascript: javascriptGenerator});
反馈
如果您对如何在插件中最好地遵循这些准则有任何疑问,请在论坛中告诉我们!我们非常期待看到您的代码块库,并对其提供反馈。
请注意,目前并非所有提供屏蔽功能定义的第一方插件都遵循这些准则,但新插件将遵循这些准则,我们也计划迁移现有插件。