Astro 适配器 API

Astro 设计得易于部署到任何云提供商的 SSR(服务端渲染)服务,该功能由适配器集成提供。

适配器是特殊的集成,它为服务器端渲染提供了入口。一个适配器做两件事。

  • 使用仅限于主机的 API 来处理请求。
  • 根据主机惯例配置构建

适配器是集成的一种,它可以做任何集成可以做的事情。

适配器 必须astro:config:done 钩子中调用 setAdapter API,像这样:

export default function createIntegration() {
  return {
    name: '@matthewp/my-adapter',
    hooks: {
      'astro:config:done': ({ setAdapter }) => {
        setAdapter({
          name: '@matthewp/my-adapter',
          serverEntrypoint: '@matthewp/my-adapter/server.js'
        });
      },
    },
  };
}

传入 setAdapter 的对象被定义为:

interface AstroAdapter {
  name: string;
  serverEntrypoint?: string;
  exports?: string[];
}

这些属性分别是:

  • name:适配器的唯一名称,用于日志输出。
  • serverEntrypoint:服务器端渲染入口。
  • exports:当与 createExports 一起使用时,未命名导出数组(解释如下)。

Astro 的适配器 API 尝试与任何类型的主机一起工作,并有灵活的方式来配合主机 API。

一些无服务器主机希望你能导出一个函数,如 handler

export function handler(event, context) {
  // ...
}

在适配器 API 中,你通过在 serverEntrypoint 中的 createExports 来实现这一目标:

import { App } from 'astro/app';

export function createExports(manifest) {
  const app = new App(manifest);

  const handler = (event, context) => {
    // ...
  };

  return { handler };
}

然后在集成中调用 setAdapter 的地方导出 exports 它。

export default function createIntegration() {
  return {
    name: '@matthewp/my-adapter',
    hooks: {
      'astro:config:done': ({ setAdapter }) => {
        setAdapter({
          name: '@matthewp/my-adapter',
          serverEntrypoint: '@matthewp/my-adapter/server.js',
+         exports: ['handler'],
        });
      },
    },
  };
}

有些主机希望你能自己启动服务器,例如通过监听一个端口。针对这些类型的主机,适配器 API 允许你导出 start 函数,它将在捆绑脚本运行时调用。

import { App } from 'astro/app';

export function start(manifest) {
  const app = new App(manifest);

  addEventListener('fetch', event => {
    // ...
  });
}

该模块用于渲染通过 astro build 预构建的页面。Astro 使用标准的RequestResponse 对象。有着不同的请求/响应 API 的主机应该在其适配器中转换为这些类型。

import { App } from 'astro/app';
import http from 'http';

export function start(manifest) {
  const app = new App(manifest);

  addEventListener('fetch', event => {
    event.respondWith(
      app.render(event.request)
    );
  });
}

有以下几种方法:

这个方法适合渲染匹配请求的 Astro 页面,并在 Promise 中返回 Response 对象。这也适用于不渲染页面的 API 路由。

const response = await app.render(request);

该方法用于确定请求是否适配 Astro 应用程序的路由规则。

if(app.match(request)) {
  const response = await app.render(request);
}

你通常可以调用 app.render(request) 而无需使用 .match,因为如果有 404.astro 文件,Astro 会自动处理 404 页面。如果你想以不同的方式处理 404,请使用 app.match(request)

用户可以使用 astro add 命令 轻松地在他们的项目中添加集成和适配器。如果你想让别人可以使用这个工具安装你的集成,在你的 package.json 中的 keywords 字段中添加 astro-adapter

{
  "name": "example",
  "keywords": ["astro-adapter"],
}

在你将集成发布到 npm 后,即可运行 astro add example 安装包和 package.json 中指定的对等依赖。我们还将指导用户手动更新他们的项目配置。