Cheatsheet del desarrollo de plugins

Cuando desarrollamos un plugin a menudo nos preguntamos "¿en qué archivo va esto y qué API debo usar?". Esta chuleta sirve para localizarlo rápido.

Estructura del directorio del plugin

Al crear un plugin con yarn pm create @my-project/plugin-name se genera la siguiente estructura. No cree los directorios a mano, ya que podría omitir los pasos de registro y el plugin no funcionaría. Para más detalles, consulte Crear el primer plugin.

plugin-name/
├── src/
   ├── client-v2/              # Código del cliente (v2)
   ├── plugin.tsx          # Entrada del plugin del cliente
   ├── locale.ts           # Hooks de traducción useT / tExpr
   ├── models/             # FlowModel (bloques, campos, acciones)
   └── pages/              # Componentes de página
   ├── client/                 # Código del cliente (v1, compatibilidad)
   ├── plugin.tsx
   ├── locale.ts
   ├── models/
   └── pages/
   ├── server/                 # Código del servidor
   ├── plugin.ts           # Entrada del plugin del servidor
   └── collections/        # Definiciones de Collection
   └── locale/                 # Archivos de traducción multilingües
       ├── zh-CN.json
       └── en-US.json
├── client-v2.js                # Entrada en la raíz (apunta al artefacto del build)
├── client-v2.d.ts
├── client.js
├── client.d.ts
├── server.js
├── server.d.ts
└── package.json

Cliente: qué quiero hacer → cómo se escribe

Qué quiero hacerEn qué archivoQué API usoDocumentación
Registrar una ruta de páginaload() de plugin.tsxthis.router.add()Router
Registrar una página de configuraciónload() de plugin.tsxpluginSettingsManager.addMenuItem() + addPageTabItem()Router
Registrar un bloque personalizadoload() de plugin.tsxthis.flowEngine.registerModelLoaders()FlowEngine → Extensión de bloques
Registrar un campo personalizadoload() de plugin.tsxthis.flowEngine.registerModelLoaders()FlowEngine → Extensión de campos
Registrar una acción personalizadaload() de plugin.tsxthis.flowEngine.registerModelLoaders()FlowEngine → Extensión de acciones
Hacer que una tabla interna aparezca en la lista del bloqueload() de plugin.tsxmainDS.addCollection()Collections
Traducir los textos del pluginlocale/zh-CN.json + locale/en-US.jsonInternacionalización (i18n)

Servidor: qué quiero hacer → cómo se escribe

Qué quiero hacerEn qué archivoQué API usoDocumentación
Definir una tablaserver/collections/xxx.tsdefineCollection()Collections
Extender una tabla existenteserver/collections/xxx.tsextendCollection()Collections
Registrar un endpoint personalizadoload() de server/plugin.tsthis.app.resourceManager.define()ResourceManager
Configurar permisosload() de server/plugin.tsthis.app.acl.allow()ACL
Cargar datos iniciales en la instalacióninstall() de server/plugin.tsthis.db.getRepository().create()Plugin

Cheatsheet de FlowModel

Qué quiero hacerDe qué clase base heredaAPI claves
Bloque puramente de presentaciónBlockModelrenderComponent() + define()
Bloque ligado a una Collection (renderizado personalizado)CollectionBlockModelcreateResource() + renderComponent()
Bloque de tabla completo (personalización sobre el de fábrica)TableBlockModelfilterCollection() + customModelClasses
Componente de presentación de campoClickableFieldModelrenderComponent(value) + bindModelToInterface()
Botón de acciónActionModelstatic scene + registerFlow({ on: 'click' })

Cheatsheet de métodos de traducción

EscenarioQué usarDe dónde se importa
Dentro de load() del Pluginthis.t('key')Incluido en la clase base Plugin
Dentro de un componente Reactconst t = useT(); t('key')locale.ts
Definición estática de FlowModel (define(), registerFlow())tExpr('key')locale.ts

Cheatsheet de llamadas a APIs habituales

Qué quiero hacerEn el PluginEn un componente
Hacer una petición APIthis.context.api.request()ctx.api.request()
Obtener una traducciónthis.t()useT()
Acceder al loggerthis.context.loggerctx.logger
Registrar una rutathis.router.add()
Navegar entre páginasctx.router.navigate()
Abrir un diálogoctx.viewer.dialog()

Enlaces relacionados