Um plugin nativo é um pacote npm que EmDash importa no mesmo processo do site Astro. Este tutorial cria um plugin que registra salvamentos de conteúdo, instala-o em um site e o registra em astro.config.mjs.
Use o formato nativo quando o plugin precisar de um recurso in-process como componentes de administração React, componentes de renderização Astro ou fragmentos de página confiáveis. Se hooks, rotas, storage e Block Kit cobrirem o recurso, comece com um plugin sandboxed. Escolher um formato de plugin compara os formatos.
Pré-requisitos
Comece com um site EmDash que use pnpm e possa executar seu servidor de desenvolvimento. O site já deve depender de emdash, que fornece o comando emdash usado abaixo.
Os comandos chamam o diretório do site de my-emdash-site e criam plugin-activity ao lado. Substitua my-emdash-site pelo nome do diretório do seu site.
Criar e registrar o pacote
-
Gere um pacote nativo ao lado do site.
pnpm exec emdash plugin init --native --name @example/plugin-activity --dir ../plugin-activityO comando remove o scope npm quando cria o ID do plugin. O nome do pacote é
@example/plugin-activity, enquanto o ID do plugin éplugin-activity. -
Instale as dependências do pacote.
cd ../plugin-activity pnpm install -
Substitua o
src/index.tsgerado por um hook de salvamento de conteúdo.import { definePlugin } from "emdash"; import type { PluginDescriptor } from "emdash"; export interface ActivityPluginOptions { logUpdates?: boolean; } export function activityPlugin( options: ActivityPluginOptions = {}, ): PluginDescriptor<ActivityPluginOptions> { return { id: "plugin-activity", version: "0.1.0", format: "native", entrypoint: "@example/plugin-activity", options, }; } export function createPlugin(options: ActivityPluginOptions = {}) { return definePlugin({ id: "plugin-activity", version: "0.1.0", capabilities: ["content:read"], hooks: { "content:afterSave": async (event, ctx) => { if (!event.isNew && options.logUpdates === false) return; ctx.log.info("Content saved", { collection: event.collection, contentId: event.content.id, isNew: event.isNew, }); }, }, }); } export default createPlugin;content:afterSaveexige a capabilitycontent:read. EmDash ignora o hook quando essa capability está ausente. -
Compile o pacote.
pnpm build -
Instale o pacote local no site.
cd ../my-emdash-site pnpm add ../plugin-activity -
Registre a factory do descriptor na integração EmDash.
import { defineConfig } from "astro/config"; import emdash from "emdash/astro"; import { activityPlugin } from "@example/plugin-activity"; export default defineConfig({ integrations: [ emdash({ plugins: [activityPlugin({ logUpdates: true })], }), ], });Descriptors nativos pertencem a
plugins, não asandboxed. EmDash rejeita um descriptor nativo no arraysandboxed. -
Inicie o site e salve uma entrada no painel de administração.
pnpm devO log do servidor inclui
Content savedcom a collection, o ID do conteúdo e se a entrada foi criada.
Fronteira descriptor / runtime
A exportação do pacote tem dois trabalhos. EmDash usa cada um em uma etapa diferente:
- A factory do descriptor,
activityPlugin(), é executada enquanto o Astro avalia sua configuração. Ela retorna metadados serializáveis de tempo de build:id,version,format,entrypointeoptions. Entry points React e Astro também pertencem a este descriptor. - A exportação nomeada
createPlugin()é executada quando EmDash é inicializado. EmDash a importa deentrypoint, passa asoptionsserializadas e espera um plugin resolvido dedefinePlugin().
A exportação nomeada createPlugin é obrigatória. Uma exportação padrão pode ser útil para consumidores do pacote, mas o loader nativo de EmDash importa createPlugin pelo nome.
Mantenha id e version idênticos no descriptor e em definePlugin(). Use um ID de plugin sem scope e em kebab-case como plugin-activity; mantenha o scope npm no nome do pacote e em entrypoint. Assim o ID continua utilizável como o único segmento de plugin nas URLs de rotas de API.
Identidade e versionamento do plugin lista as formas de ID e versão aceitas.
O comportamento de runtime pertence a definePlugin():
capabilitieseallowedHostsstoragehookseroutes- declarações de configurações, página, widget e Portable Text de
admin
O descriptor carrega as entradas estáticas que o Astro deve importar ou expor em tempo de build. Os guias focados mostram quais campos de administração precisam de declarações de descriptor e runtime correspondentes.
Handlers de rotas nativas
Handlers de rotas nativas recebem um RouteContext. Ele combina entrada validada e dados da requisição com o PluginContext habitual:
routes: {
status: {
permission: "plugins:read",
handler: async (ctx) => ({
pluginId: ctx.plugin.id,
callerId: ctx.user?.id ?? null,
}),
},
},
O handler sandboxed equivalente recebe (routeCtx, ctx) como dois argumentos. Autenticação, permissões, esquemas de entrada e URLs de rotas seguem no restante o contrato compartilhado das rotas de API.
Envolva uma rota nativa em definePluginRoute() quando ela declarar request.body; o helper infere
ctx.input a partir do modo do body. Uma rota nativa com response: "raw" retorna pluginResponse().
Importe ambos os helpers de emdash. O guia compartilhado de rotas de API lista os modos de body, limites, política de resposta e padrões de compatibilidade.
Adicionar outra superfície
- Páginas e widgets de administração React cobre configurações, páginas personalizadas, widgets do dashboard, painéis do editor e colunas de lista.
- Componentes de renderização Portable Text registra componentes Astro para blocos do plugin.
- Fragmentos de página adiciona scripts ou HTML confiáveis a páginas públicas.
- Distribuir plugins nativos empacota os entry points de build e fonte para npm.