API de Integrações Astro
Integrações Astro adicionam novas funcionalidades e comportamentos ao seu projeto com apenas algumas linhas de código.
Esta página de referência é para qualquer um que esteja escrevendo sua própria integração. Para aprender como utilizar uma integração em seu projeto, veja o nosso guia, Usando Integrações no lugar.
Exemplos
Section titled ExemplosAs integrações Astro oficiais podem ser utilizadas como referência enquanto você constrói suas próprias integrações.
- Renderizadores:
lit(EN),svelte(EN),react(EN),preact(EN),vue(EN),solid(EN) - Bibliotecas:
tailwind(EN),partytown(EN) - Funcionalidades:
sitemap(EN)
Referência Rápida da API
Section titled Referência Rápida da APIinterface AstroIntegration {
name: string;
hooks: {
'astro:config:setup'?: (options: {
config: AstroConfig;
command: 'dev' | 'build';
updateConfig: (newConfig: Record<string, any>) => void;
addRenderer: (renderer: AstroRenderer) => void;
injectScript: (stage: InjectedScriptStage, content: string) => void;
injectRoute: ({ pattern: string, entryPoint: string }) => void;
}) => void;
'astro:config:done'?: (options: { config: AstroConfig }) => void | Promise<void>;
'astro:server:setup'?: (options: { server: vite.ViteDevServer }) => void | Promise<void>;
'astro:server:start'?: (options: { address: AddressInfo }) => void | Promise<void>;
'astro:server:done'?: () => void | Promise<void>;
'astro:build:start'?: (options: { buildConfig: BuildConfig }) => void | Promise<void>;
'astro:build:setup'?: (options: {
vite: ViteConfigWithSSR;
pages: Map<string, PageBuildData>;
target: 'client' | 'server';
}) => void | Promise<void>;
'astro:build:ssr'?: (options: { manifest: SerializedSSRManifest }) => void | Promise<void>;
'astro:build:done'?: (options: { pages: { pathname: string }[]; dir: URL; routes: RouteData[] }) => void | Promise<void>;
};
}
Hooks
Section titled Hooksastro:config:setup
Section titled astro:config:setupPróximo hook: astro:config:done
Quando: Durante a inicialização, antes da configuração do Vite ou Astro ser resolvida.
Por que: Para estender a configuração do projeto. Isso inclui atualizar a configuração do Astro, aplicar plugins Vite, adicionar renderizadores de componentes, e injetar scripts na página.
'astro:config:setup'?: (options: {
config: AstroConfig;
command: 'dev' | 'build';
updateConfig: (newConfig: Record<string, any>) => void;
addRenderer: (renderer: AstroRenderer) => void;
injectScript: (stage: InjectedScriptStage, content: string) => void;
injectRoute: ({ pattern: string, entryPoint: string }) => void;
}) => void;
Opção config
Section titled Opção configTipo: AstroConfig
Uma cópia de somente leitura da configuração Astro suprida pelo usuário. Isto é resolvido antes de qualquer outra integração ser executada. Se você precisa de uma cópia da configuração depois de todas as integrações completarem seus processos de atualização da configuração, veja o hook astro:config:done.
Opção command
Section titled Opção commandTipo: 'dev' / 'build'
dev- Projeto é executado a partir deastro devouastro previewbuild- Projeto é executado a partir deastro build
Opção updateConfig
Section titled Opção updateConfigTipo: (newConfig: Record<string, any>) => void;
Uma função de callback para atualizar a configuração Astro suprida pelo usuário. Qualquer configuração que você providenciar será mesclada com a configuração do usuário + atualizações da configuração de outras integrações, então você está livre para omitir as chaves!
Por exemplo, digamos que você precisa fornecer um plugin Vite ao projeto do usuário:
import bananaCSS from '@vitejs/official-banana-css-plugin';
export default {
name: 'banana-css-integration',
hooks: {
'astro:config:setup': ({ updateConfig }) => {
updateConfig({
vite: {
plugins: [bananaCSS()],
}
})
}
}
}
Opção addRenderer
Section titled Opção addRendererTipo: (renderer: AstroRenderer ) => void;
Exemplos: lit, svelte, react, preact, vue, solid
Uma função de callback para adicionar um renderizador de um framework de componentes (ex. React, Vue, Svelte, etc). Você pode explorar os exemplos e definições de tipagem acima para opções mais avançadas, mas aqui estão as duas principais opções que você precisa estar ciente sobre:
clientEntrypoint- caminho para um arquivo que é executado no cliente sempre que seu componente é utilizado. Esta é principalmente utilizado para renderizar ou hidratar seu componente com JS.serverEntrypoint- caminho para um arquivo que é executado durante requisições no lado do servidor ou builds estáticas sempre que seu componente é utilizado. Esta deve renderizar componentes para uma marcação estática, com hooks para hidratação aonde aplicável. o callbackrenderToStringdo React é um exemplo clássico.
Opção injectRoute
Section titled Opção injectRouteTipo: ({ pattern: string, entryPoint: string }) => void;
Uma função de callback para injetar rotas em um projeto Astro. Rotas injetadas podem ser páginas .astro ou handlers de rotas .js e .ts.
injectRoute recebe um objeto com um pattern e um entryPoint.
pattern- aonde a rota deve ser inserida no navegador, por exemplo/foo/bar. Umpatternpode utilizar a sintaxe de caminho de arquivos do Astro para indicar rotas dinâmicas, por exemplo/foo/[bar]ou/foo/[...bar]. Note que uma extensão de arquivo não é necessária nopattern.entryPoint- apenas um especificador de módulo apontando para a página.astroou handler de rota.js/.tsque manipula a rota indicada nopattern.
Exemplo de uso:
injectRoute({
pattern: '/foo/[dinamico]',
entryPoint: 'foo/pagina-dinamica.astro'
});
Opção injectScript
Section titled Opção injectScriptTipo: (stage: InjectedScriptStage, content: string) => void;
Uma função de callback para injetar uma string de conteúdo JavaScript em todas as páginas.
O stage indica como este script (o content) deve ser inserido. Alguns stages permitem inserir scripts sem modificação, enquanto outros permitem otimizações durante a etapa de bundling do Vite:
-
"head-inline": Injetado em uma tag script no<head>de cada página. Não é otimizado ou resolvido pelo Vite. -
"before-hydration": Importado no lado do cliente, antes do script de hidratação ser executado. Otimizado e resolvido pelo Vite. -
"page": Similar ahead-inline, exceto que o script injetado é transformado por Vite e passa por bundle junto com quaisquer outras tags<script>definidas dentro de componentes Astro na página. O script será carregado com um<script type="module">no resultado final da página, otimizado e resolvido pelo Vite. -
"page-ssr": Importado como um módulo separado no frontmatter de cada componente de página Astro. Por conta desse stage importar seu script, a globalAstronão está disponível e seu script será executado apenas uma vez quando oimportfor analisado pela primeira vez.O principal uso para o stage
page-ssré para injetar umimportde CSS em cada página para ser otimizado e resolvido pelo Vite:injectScript('page-ssr', 'import "estilos-globais.css";');
astro:config:done
Section titled astro:config:doneHook anterior: astro:config:setup
Próximo hook: astro:server:setup quando estiver sendo executado no modo “dev” ou “preview”, ou astro:build
Quando: Após a configuração do Astro ter sido resolvida e outras integrações tiverem executado seus hooks astro:config:setup.
Por que: Para obter a configuração final para uso em outros hooks.
'astro:config:done'?: (options: { config: AstroConfig }) => void | Promise<void>;
Opção config
Section titled Opção configTipo: AstroConfig
Uma cópia de somente leitura da configuração Astro suprida pelo usuário. Esta é resolvida após outras integrações serem executadas.
astro:server:setup
Section titled astro:server:setupHook anterior: astro:config:done
Próximo hook: astro:server:start
Quando: Logo após o servidor do Vite ser criado no modo “dev” ou “preview”, porém antes do evento listen() ser disparado. Veja a API createServer do Vite para saber mais.
Por que: Para atualizar as configurações do servidor Vite e middleware.
'astro:server:setup'?: (options: { server: vite.ViteDevServer }) => void | Promise<void>;
Opção server
Section titled Opção serverTipo: ViteDevServer
Uma instância mutável do servidor Vite usado no modo “dev” ou “preview”. Por exemplo, esta é utilizada pela nossa integração Partytown (EN) para injetar o servidor Partytown como um middleware:
export default {
name: 'partytown'
hooks: {
'astro:server:setup': ({ server }) => {
server.middlewares.use(
function middleware(req, res, next) {
// manejar requisições
}
);
}
}
}
astro:server:start
Section titled astro:server:startHook anterior: astro:server:setup
Próximo hook: astro:server:done
Quando: Logo após o evento listen() do servidor ser disparado.
Por que: Para interceptar requisições de rede de um endereço específico. Se você pretende utilizar esse endereço para middleware, considere utilizar astro:server:setup no lugar.
'astro:server:start'?: (options: { address: AddressInfo }) => void | Promise<void>;
Opção address
Section titled Opção addressTipo: AddressInfo
O endereço, família e número de porta suprido pelo módulo Net do NodeJS.
astro:server:done
Section titled astro:server:doneHook anterior: astro:server:start
Quando: Logo após o servidor de desenvolvimento ser fechado.
Por que: Para executar quaisquer eventos de limpeza que você pode ativar durante os hooks astro:server:setup ou astro:server:start.
'astro:server:done'?: () => void | Promise<void>;
astro:build:start
Section titled astro:build:startHook anterior: astro:config:done
Próximo hook: astro:build:setup
Quando: Após o evento astro:config:done, porém antes da build para produção começar.
Por que: Para definir quaisquer objetos globais ou clientes necessários durante a build para produção. Esta também pode estender as opções de configuração de build na API de adaptadores.
'astro:build:start'?: (options: { buildConfig: BuildConfig }) => void | Promise<void>;
astro:build:setup
Section titled astro:build:setupHook anterior: astro:build:start
Próximo hook: astro:build:ssr
Quando: Após o hook astro:build:start, executado imediatamente antes da build.
Por que: Nesse ponto, a configuração Vite para a build foi completamente construída, logo essa é sua última chance de modificá-la. Isto pode ser útil para por exemplo sobrescrever alguma configuração padrão. Se você não tiver certeza se deve utilizar este hook ou astro:build:start, então utilize astro:build:start no lugar.
'astro:build:setup'?: (options: {
vite: ViteConfigWithSSR;
pages: Map<string, PageBuildData>;
target: 'client' | 'server';
}) => void | Promise<void>;
astro:build:ssr
Section titled astro:build:ssrHook anterior: astro:build:setup
Quando: Após a build para produção (SSG ou SSR) tiver sido completada.
Por que: Para conseguir acesso ao manifesto de SSR, isso é útil quando se for criar builds SSR customizadas em plugins ou integrações.
'astro:build:ssr'?: (options: { manifest: SerializedSSRManifest }) => void | Promise<void>;
astro:build:done
Section titled astro:build:doneHook anterior: astro:build:ssr
Quando: Após a build para produção (SSG ou SSR) tiver sido completada.
Por que: Para acessar rotas geradas e assets para extensão (ex. copiar conteúdo do diretório gerado /assets). Se você planeja transformar assets gerados, nós recomendados explorar a API de Plugins Vite e configurá-la via astro:config:setup no lugar.
'astro:build:done'?: (options: { dir: URL; routes: RouteData[] }) => void | Promise<void>;
Opção dir
Section titled Opção dirTipo: URL
Um caminho de URL para o diretório final da build. Note que se você precisa de uma string de caminho absoluto válida, você deve utilizar o utilitário fileURLToPath do Node.
import { writeFile } from 'node:fs/promises';
import { fileURLToPath } from 'node:url';
export default function minhaIntegracao() {
return {
hooks: {
'astro:build:done': async ({ dir }) => {
const metadados = await getIntegrationMetadata();
// Utilize fileURLToPath para conseguir uma string válida e multiplataforma do caminho absoluto.
const arquivoSaida = fileURLToPath(new URL('./minha-integracao.json', dir));
await fs.writeFile(arquivoSaida, JSON.stringify(metadados));
}
}
}
}
Opção routes
Section titled Opção routesTipo: RouteData[]
Uma lista de todas as rotas geradas junto de seus metadados associados. Isso estará vazio quando estiver utilizando um adaptador de SSR!
Você pode ver a referência completa do tipo RouteData abaixo, mas as propriedades mais comuns são:
component- o caminho do arquivo de entrada relativo à raiz do projetopathname- a URL de saída do arquivo (undefined para rotas utilizando parâmetros[dinâmicos]e[...spread])
Referência do tipo RouteData
interface RouteData {
/** Se a rota dada é uma página HTML ou um endpoint não-HTML */
type: 'page' | 'endpoint';
/** URL da fonte do componente */
component: string;
/**
* Nome de caminho da URL de saída onde esta rota será servida
* nota: será undefined para rotas [dinâmicas] e [...spread]
*/
pathname?: string;
/**
* regex usado para corresponder A uma URL de entrada contra a rota requisitada
* ex. "[fruta]/sobre.astro" irá gerar o pattern: /^\/([^/]+?)\/sobre\/?$/
* aonde pattern.test("fruta/sobre") é "true"
*/
pattern: RegExp;
/**
* Parâmetros dinâmicos e spread da rota
* ex. "/pages/[lang]/[..slug].astro" irá retornar os parâmetros ['lang', '...slug']
*/
params: string[];
/**
* Similar ao campo "params", mas com mais metadados associados
* ex. "/pages/[lang]/index.astro" irá retornar os segmentos
* [[ { content: 'lang', dynamic: true, spread: false } ]]
*/
segments: { content: string; dynamic: boolean; spread: boolean; }[][];
/**
* Função para renderizar o componente no lugar a partir de um conjunto de dados de entrada.
* Isto é tipicamente para uso interno, portanto utilize com cuidado!
*/
generate: (data?: any) => string;
}
Permitindo instalação via astro add
Section titled Permitindo instalação via astro addO comando astro add permite que usuários facilmente adicionem integrações e adaptadores em seus projetos. Se você quiser que sua integração seja instalável com essa ferramenta, adicione astro-integration no campo keywords do seu package.json:
{
"name": "exemplo",
"keywords": ["astro-integration"],
}
Assim que você publicar sua integração no npm, executar astro add exemplo irá instalar seu pacote com quaisquer dependências de pares especificadas em seu package.json. Isso também irá adicionar sua integração ao astro.config do usuário dessa forma:
import { defineConfig } from 'astro/config';
+ import exemplo from 'exemplo';
export default defineConfig({
+ integrations: [exemplo()],
})
Ordenação de Integrações
Section titled Ordenação de IntegraçõesTodas as integrações são executadas na ordem em que são configuradas. Por exemplo, para o array [react(), svelte()] na astro.config.* de um usuário, react será executado antes de svelte.
Sua integração deve idealmente ser executável em qualquer ordem. Se isso não for possível nós recomendados documentar que sua integração precisar vir como primeira ou última no array de configuração integrations do seu usuário.
Combinar integrações em presets
Section titled Combinar integrações em presetsUma integração também pode ser escrita como uma coleção de múltiplas, menores integrações. Nós chamamos estas coleções de presets. Ao invés de criar uma função de factory que retorna o objeto de uma única integração, um preset retorna um array de objetos de integração. Isso é útil para construir funcionalidades complexas a partir de múltiplas integrações.
integrations: [
// Exemplo: aonde presetExemplo() retorna: [integracaoUm, integracaoDois, ...etc]
presetExemplo()
]