服务端渲染

你可以在 Astro 中启用服务器端渲染(又称 SSR, Server Side Rendering)。启用后你可以:

  • 在应用程序中实现登录状态会话。
  • fetch 动态调用 API 来渲染数据。
  • 使用适配器部署你的网站。

为了启用 SSR,你需要使用适配器(Adapter)。这是因为 SSR 需要服务器运行时环境运行服务器端代码。服务器端代码可以调用该运行时提供的 API。

安装一个适配器可以让 Astro 访问相应的 API,并允许 Astro 输出一个脚本,在那种服务器上运行你的项目。

现有以下适配器,未来将有更多适配器:

你可以在上面的各个适配器链接中找到相关说明,并完成以下两个步骤启用 SSR(以下示例使用 my-adapter 作为占位符的):

  1. 通过 npm 或其他包管理器安装适配器:

    npm install --save-dev @astrojs/my-adapter
  2. astro.config.mjs 文件添加适配器导入和默认导出。

    astro.config.mjs
    import { defineConfig } from 'astro/config';
    + import myAdapter from '@astrojs/my-adapter';
    export default defineConfig({
    +   adapter: myAdapter(),
    });

Astro 在默认情况下仍是静态网站生成器。但是一旦你启用了服务器端渲染适配器,你的页面目录中的每条路由都会成为服务器渲染的路由,一些新的功能就可以为你所用。

你可以通过 Astro.request.headers 获取请求的 header 信息。Headers 对象类似 Map,你可以在此检索 cookie 等 header 信息。

---
const cookie = Astro.request.headers.get('cookie');
// ...
---
<html>
  <!-- Page here... -->
</html>

Astro global 中,你可以用该方法重定向至另一页面。你可以在通过从 cookie 中获取到的用户会话来检查用户是否已经登录,然后之后再做这个动作。

---
import { isLoggedIn } from '../utils';

const cookie = Astro.request.headers.get('cookie');

// 如果用户没有登录,就把他们重定向到登录页面。
if(!isLoggedIn(cookie)) {
  return Astro.redirect('/login');
}
---
<html>
  <!-- 你的页面 -->
</html>

任何页面都可以返回 Response。可以在数据库中查找 ID 后,再动态返回 404 页面。

[id].astro
---
import { getProduct } from '../api';

const product = await getProduct(Astro.params.id);

// 没有找到任何记录
if(!product) {
  return new Response(null, {
    status: 404,
    statusText: 'Not found'
  });
}
---
<html>
  <!-- 你的页面 -->
</html>

src/pages/,目录中的 .js.ts 文件都是 API 路由,它接收 Request 并返回 Response数据。

[id].js
import { getProduct } from '../db';

export async function get({ params }) {
  const { id } = params;
  const product = await getProduct(id);

  if(!product) {
    return new Response(null, {
      status: 404,
      statusText: 'Not found'
    });
  }

  return new Response(JSON.stringify(product), {
    status: 200
  });
}