Como usar as APIs do Blockly

Introdução

Esta página descreve as práticas recomendadas para chamar funções e acessar no núcleo do Blockly. Esses princípios se aplicam à criação de plug-ins para Blockly ou integração do Blockly com um aplicativo independente.

Criação de subclasses e extensão

O Blockly tem vários paradigmas para adicionar funcionalidades, incluindo:

  • Subclasses (por exemplo, criação de um novo renderizador)
  • Mixins (por exemplo, adição de uma extensão de bloqueio ou mutador)
  • Definições de bloqueio (por exemplo, definições de bloqueio de procedimento)

Para os fins deste documento, todos os três casos são equivalentes a a subclassificação.

Como injetar subclasses

É possível substituir determinadas classes com o método Blockly.inject. Esses as subclasses precisam estender a classe de base ou implementar as interface gráfica do usuário.

É possível transmitir a subclasse no método de injeção.

Blockly.inject('blocklyDiv', {
  plugins: {
    'metricsManager': CustomMetricsManagerClass
  }
}

Ou você pode registrar sua classe usando Blockly.registry e usar o para injetar a classe. Isso é útil se você armazena como JSON puro.

Blockly.registry.register(Blockly.registry.Type.METRICS_MANAGER, 'YOUR_NAME', SubClass);

Blockly.inject('blocklyDiv', {
  plugins: {
    'metricsManager': 'YOUR_NAME'
  }
}

As seguintes classes podem ser substituídas:

Nome do registro Interface/classe base
blockDragger Blockly.IBlockDragger
connectionChecker Blockly.IConnectionChecker
connectionPreviewer Blockly.IConnectionPreviewer
flyoutsVerticalToolbox Blockly.IFlyout
flyoutsHorizontalToolbox Blockly.IFlyout
metricsManager Blockly.IMetricsManager
renderer Blockly.blockRendering.Renderer
toolbox Blockly.IToolbox

Para mais informações sobre o uso de interfaces, consulte a seção de interfaces. da documentação.

Visibilidade

Usamos modificadores de acesso TypeScript. para marcar a visibilidade na biblioteca principal como public, private ou protected. Algumas propriedades podem receber a anotação @internal na Comentários do TsDoc.

Todas as propriedades public e protected estão documentadas na Seção Referências do site do Blockly. Você também pode verificar a visibilidade lendo o código.

público

Tudo o que estiver marcado com public faz parte da nossa API pública. Qualquer propriedade em um módulo que não tem um modificador de visibilidade é considerado público.

Tentamos não mudar nossa API pública com frequência ou sem um bom motivo. aviso. Exceção: podemos tornar uma nova API pública em uma versão e modificá-lo na próxima versão em resposta ao feedback antecipado. Depois disso, você pode uma função pública ou propriedade estável.

As funções públicas podem ser chamadas de qualquer lugar e substituídas em subclasses como desde que a assinatura não mude.

protegia

As funções e propriedades protegidas só podem ser acessadas pela classe ou uma subclasse.

As subclasses têm permissão para substituir funções e propriedades protegidas, sem alteração de assinaturas de tipo.

Por exemplo, um renderizador personalizado que estende a classe de renderizador base pode acessar das propriedades protegidas.

Em cada caso, você deve entender como a função ou propriedade está usada no restante do código.

privado

Eles só podem ser acessados por código no mesmo arquivo da definição. Diretamente acessar essas propriedades pode resultar em um comportamento indefinido.

As subclasses não têm permissão para substituir funções e propriedades particulares.

As propriedades particulares estão sujeitas a alterações sem aviso prévio, pois não estão considerada parte da API pública do Blockly.

Algumas funções no Blockly não têm anotações de visibilidade porque são não exportados do módulo. Essas funções são essencialmente variáveis locais e não pode ser usado fora do módulo de definição. Elas devem ser consideradas equivalentes às propriedades privadas.

interno

As funções e propriedades internas destinam-se ao uso no sistema biblioteca, mas não externamente. Eles são designados com o TsDoc @internal uma anotação.

As propriedades internas estão sujeitas a alterações sem aviso prévio, pois não estão considerada parte da API pública do Blockly.

As propriedades internas podem ser acessadas de qualquer lugar do principal e substituídas em subclasses no núcleo, desde que a assinatura não mude. Elas não podem ser acessados de fora da biblioteca principal.

descontinuado

Tudo o que estiver marcado como @deprecated não deve ser usado. A maioria das descontinuações inclui instruções sobre o código preferido, seja em um aviso do console ou no TSDoc.

Sempre que possível, as funções descontinuadas registrarão um aviso que inclui o a data de exclusão pretendida e uma recomendação para uma função de substituição a ser chamada.

Perguntas frequentes

E se a função que eu quero usar não for pública?

Enviar uma solicitação de recurso no Blockly de base. Inclua uma descrição do seu caso de uso e uma declaração do que que você quer tornar públicas.

Usaremos o recurso para solicitar a definição do conteúdo como público ou se há outras formas de obter as mesmas informações.

Se decidirmos torná-la pública, você ou a equipe do Blockly alteração apropriada, e ela será ativada na próxima versão do Blockly.

Se você optar por usar um membro não público em um plug-in, marque o seu plug-in como Beta e inclua as informações no seu README.

E quanto ao monkeypatch?

Leia mais sobre monkeypatch.

O Monkeypatch não é seguro, porque os patches podem parar de funcionar sem aviso prévio ao uso de partes não públicas da API Blockly. Aplicar o patch em um plug-in é especialmente perigoso, porque seu código pode interagir mal com qualquer outro plug-in que aplica monkeypatch o mesmo código. Por isso, nós altamente não recomendam o monkeypatching em aplicativos e plug-ins de terceiros, e não a aceitarão em plug-ins primários.

Posso substituir funções públicas?

Ao criar subclasses: sim. Caso contrário: não, trata-se de monkeypatch.

Posso substituir funções protegidas?

Ao criar subclasses: sim. Caso contrário: não, trata-se de monkeypatch.

Posso substituir funções internas ou privadas?

Não, isso é monkeypatch.

Quando posso acessar as propriedades diretamente? Quando devo usar um getter ou um setter?

Se publicarmos um getter ou setter, use-o em vez de diretamente acessar a propriedade. Se a propriedade não for pública, definitivamente use getters e setters.

E se uma propriedade não tiver uma anotação?

Por padrão, é público, mas envie-nos um comentário caso queiramos colocar um getter/setter para você.

E se uma função não tiver uma anotação?

É público por padrão.

E se eu ainda não tiver certeza?

Faça uma pergunta no fórum e entraremos em contato, geralmente em até um dia útil.