Escolher um formato de plugin

Nesta página

Os plugins EmDash usam um de dois formatos: sandboxed ou native. Escolha o formato antes de escrever o plugin porque a forma de autoria, o caminho de instalação e o limite de confiança diferem.

Escolha um plugin sandboxed a menos que o plugin precise de uma integração apenas nativa. Plugins sandboxed podem ser publicados no registry e instalados pela UI de administração. Um plugin nativo é um pacote npm que um operador do site instala no projeto e adiciona a astro.config.mjs antes de redesployar.

Em resumo

SandboxedNative
Authoring shapeemdash-plugin.jsonc + src/plugin.tsdefinePlugin() descriptor
Install methodOne-click from the admin registrynpm install + edit astro.config
Runs inAn isolated runtime provided by a sandbox runnerSame process as your Astro site
Capability-gated ctx APIsEnforced by the sandbox bridgeGated by PluginContext, but not a security boundary
Resource limitsRunner limits for CPU, subrequests, and wall time; platform memory ceilingNo per-plugin limits
Network accessctx.http, restricted to declared accessctx.http follows declarations; native code can also call fetch()
Direct fetch() / process.envBlocked by the runnerPossible (plugin code shares the runtime)
DistributionSigned release in the plugin registrynpm package
Admin UIBlock Kit (JSON-described) routesReact components, or Block Kit
Settings UIBlock Kit page + ctx.settingsadmin.settingsSchema (auto-form) or Block Kit
Portable Text rendering componentsNot availablecomponentsEntry provides Astro components
Page metadata contributionspage:metadata hook — meta/property tags, allowlisted <link> rels, JSON-LDpage:metadata hook (same surface)
Page fragment injectionNot available — meta/JSON-LD only via page:metadatapage:fragments hook — inline scripts, external scripts, raw HTML
Constructor optionsNone — read settings from KV at runtimeoptions on the descriptor

Custos de um plugin nativo

Plugins nativos têm um modelo de instalação e confiança diferente:

  • Instalação no nível do projeto. Cada site precisa instalar seu pacote npm, editar astro.config.mjs e redesployar.
  • Sem isolamento. Um bug no seu plugin pode derrubar o processo host ou consumir seu orçamento de CPU. Uma rejeição não tratada em um hook pode derrubar a requisição ao redor junto.
  • Carga de confiança no usuário. Plugins nativos têm o mesmo acesso que o site host. Declarações de capability sozinhas não conseguem mostrar tudo o que o código pode fazer.

Se o seu plugin puder fazer o trabalho no sandbox, deve fazê-lo.

Quando ir para nativo

Escolha nativo para recursos que precisam de integração em tempo de build com o site host:

  1. Páginas ou widgets de administração React personalizados. Plugins sandboxed descrevem a UI de administração com Block Kit — um esquema JSON que a administração renderiza em nome do plugin. Se você precisa de React completo (hooks personalizados, componentes de terceiros, estado complexo), precisa de nativo.

  2. Tipos de bloco Portable Text personalizados. Sua configuração de edição e componentes de renderização Astro são carregados do pacote npm instalado. Só plugins nativos podem fornecer essa superfície em tempo de build.

  3. Injetar HTML bruto, scripts ou folhas de estilo em páginas públicas. O hook page:fragments envia código de primeira parte aos navegadores dos visitantes — fora de qualquer limite de sandbox. É restrito a plugins nativos. Plugins sandboxed ainda podem contribuir para páginas públicas pelo hook page:metadata, que cobre muitos casos de uso reais:

    • tags meta (name + content) — descrições SEO, diretivas robots, Twitter cards
    • tags property — OpenGraph e outro meta baseado em property
    • tags link com uma allowlist de rel bloqueada por segurança (canonical, alternate, author, license, nlweb, site.standard.document) — stylesheet, prefetch e rels semelhantes de carregamento de recursos são deliberadamente não permitidos
    • grafos JSON-LD

    Se sua necessidade de «injeção de página» for dados estruturados ou metadados SEO, fique sandboxed e use page:metadata. Se você realmente precisa enviar JavaScript ou HTML ao navegador do visitante, esse é o caso para ir a nativo.

Se nenhum desses recursos se aplicar, use o formato sandboxed.

Runners de sandbox e suporte de plataforma

O sandbox em si é plugável. EmDash expõe uma opção de configuração sandboxRunner e o runner decide como o código do plugin é isolado — não há nada específico do Cloudflare no formato do plugin.

Dois runners vêm com EmDash: sandbox() de @emdash-cms/cloudflare, que executa cada plugin como Dynamic Worker pelo Worker Loader da Cloudflare, e @emdash-cms/sandbox-workerd/sandbox, que executa plugins em um processo filho workerd no Node.js. Plugin Sandbox cobre a configuração de cada runner, os limites de recursos que aplica e as diferenças entre os dois.

Se nenhum runner estiver configurado, plugins listados em sandboxed: [] não são carregados. Se o runner configurado estiver indisponível na plataforma atual, também não são carregados, e EmDash registra um aviso na inicialização.

Se quiser que um plugin sandboxed rode em uma plataforma sem runner de sandbox, mova-o de sandboxed: [] para o array plugins: [] — ele executará in-process. Declarações de capability ainda são honradas (a mesma factory PluginContext limita ctx.content, ctx.http e similares), mas não há limite de isolamento, nem limites de recursos, e um plugin com bugs ou malicioso pode chamar fetch() diretamente, ler variáveis de ambiente ou bloquear o event loop. Sem um runner de sandbox ativo, trate cada plugin como um plugin nativo para fins de confiança.

Próximo