发布块库

提供块定义库的插件是与 Blockly 社区共享可重复使用的块的绝佳方式。为了让您的块库尽可能灵活且实用,我们制定了这些准则。

指南

  • 让用户能够轻松安装您的所有块,并让用户仅可安装他们选择的特定块或块。
    • 简化安装所有项:为此,您可以提供一个函数,安装单个块定义所需的每一部分(例如赋值函数、扩展项、mixin、字段等)。您还可以提供一个函数,用于一次性安装您的插件提供的所有块。
    • 可以选择特定部分:您应单独导出块定义的所有部分,以便用户仅导入他们需要的部分以便创建自己的类似自定义块。
  • 避免在插件中使用副作用。
    • 不应在加载插件时安装块、字段、扩展程序和其他部分。用户应能够控制安装哪些内容和安装时间。这样,用户便可以导入所需组件,而无需担心自己不会安装的应用组件。
  • 使用 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 将提供相关工具,帮助您注册已注册的项,而不会出现错误。在此之前,您可能需要先检查已注册扩展程序、赋值函数、mixin 或字段,然后再自行注册。
    • 明确您的插件或代码块定义需要的所有前提条件或依赖项。
  • 建议您为您提供的每个块提供生成器函数。

    • 提供开箱即用的生成器函数可让用户更轻松地使用您的块,而无需了解其结构和设计。如果他们必须自行编写生成器函数,可能会导致每个用户进行多余的工作。
    • 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});
      

反馈

如果您对如何在插件中更好地遵循这些准则有疑问,请在论坛中告诉我们!我们希望查看您的块库并提供反馈。

请注意,目前并非所有提供块定义的第一方插件都遵循这些准则,但新插件和我们计划迁移现有插件。