返回介绍

@astrojs/node

发布于 2024-06-05 21:19:56 字数 13631 浏览 0 评论 0 收藏 0

此适配器允许 Astro 将你的 hybridserver 渲染的网站部署到 Node 目标。

如果你将 Astro 用作静态站点构建器,则不需要适配器。

为什么选择 Astro Node.js

Node.js 是用于服务器端代码的 JavaScript 运行时。 @astrojs/node 可以在独立模式下使用,也可以作为其他 http 服务器(例如 Express)的中间件。

安装

Astro 包含了一个 astro add 命令,用于自动设置官方集成。如果你愿意,可以改为手动安装集成

使用 astro add 命令将 Node 适配器添加到你的 Astro 项目中,以启用服务端渲染。 这将一步安装 @astrojs/node 并对你的 astro.config.* 文件进行适当的修改。

  • npm
  • pnpm
  • Yarn
npx astro add node
pnpm astro add node
yarn astro add node

手动安装

首先,使用适合你的包管理器将 Node 适配器添加到你的项目依赖中。

  • npm
  • pnpm
  • Yarn
npm install @astrojs/node
pnpm add @astrojs/node
yarn add @astrojs/node

然后,将适配器和你所需的按需渲染模式添加到你的 astro.config.* 文件中:

astro.config.mjs
import { defineConfig } from 'astro/config';import node from '@astrojs/node';


export default defineConfig({ output: 'server', adapter: node({   mode: 'standalone', }),
});

配置

@astrojs/node 可以通过将选项传递给适配器函数来配置。以下选项可用:

模式

控制适配器是构建为 middleware 模式还是 standalone 模式。

  • middleware 模式允许将构建的输出用作另一个 Node.js 服务器的中间件,例如 Express.js 或 Fastify。

    astro.config.mjs
    import { defineConfig } from 'astro/config';
    import node from '@astrojs/node';
    
    
    export default defineConfig({
      output: 'server',
      adapter: node({
        mode: 'middleware',
      }),
    });
  • standalone 构建到服务器,随着入口模块的运行会自动启动。这使你可以更轻松地部署到主机,而无需任何额外的代码。

用法

首先,执行构建。根据选择的模式(见上文),执行以下相应的步骤:

中间件

服务器入口文件默认构建为 ./dist/server/entry.mjs。该模块导出一个 处理程序(handler) 函数,可以与任何支持 Node 请求(request)响应(response) 对象的框架一起使用。

例如,使用 Express:

run-server.mjs
import express from 'express';
import { handler as ssrHandler } from './dist/server/entry.mjs';


const app = express();
// 根据 astro.config.mjs 中的 `base` 选项进行更改。
// 它们应该匹配。默认值为"/"。
const base = '/';
app.use(base, express.static('dist/client/'));
app.use(ssrHandler);


app.listen(8080);

或者使用 Fastify (>4):

run-server.mjs
import Fastify from 'fastify';
import fastifyMiddie from '@fastify/middie';
import fastifyStatic from '@fastify/static';
import { fileURLToPath } from 'node:url';
import { handler as ssrHandler } from './dist/server/entry.mjs';


const app = Fastify({ logger: true });


await app
  .register(fastifyStatic, {
    root: fileURLToPath(new URL('./dist/client', import.meta.url)),
  })
  .register(fastifyMiddie);
app.use(ssrHandler);


app.listen({ port: 8080 });

此外,你还可以传入一个对象,以便使用 Astro.locals 或 Astro 中间件访问该对象:

run-server.mjs
import express from 'express';
import { handler as ssrHandler } from './dist/server/entry.mjs';


const app = express();
app.use(express.static('dist/client/'));
app.use((req, res, next) => {
  const locals = {
    title: 'New title',
  };


  ssrHandler(req, res, next, locals);
});


app.listen(8080);

请注意,中间件模式不提供文件服务。你需要配置 HTTP 框架来完成这项工作。默认情况下,客户端资产写入 ./dist/client/

独立

在独立模式下,服务器在入口文件运行时启动。默认情况下,它被构建为 ./dist/server/entry.mjs。你可以运行它:

node ./dist/server/entry.mjs

对于独立模式,服务器除了处理页面和 API 路由之外还处理文件服务。

自定义主机和端口

你可以覆盖独立服务器运行的主机和端口,通过在运行时将它们作为环境变量进行传递:

HOST=0.0.0.0 PORT=4321 node ./dist/server/entry.mjs

HTTPS

默认情况下,独立服务器使用 HTTP。如果前面有一个执行 HTTPS 的代理服务器,则能更好的工作。如果你需要独立服务器本身来运行 HTTPS,你需要提供 SSL 密钥和证书。

你可以通过环境变量 SERVER_CERT_PATHSERVER_KEY_PATH 传递密钥和证书的路径。这就是在 bash 中传递它们的方式:

SERVER_KEY_PATH=./private/key.pem SERVER_CERT_PATH=./private/cert.pem node ./dist/server/entry.mjs

运行时环境变量

如果在构建过程运行时存在包含环境变量的 .env 文件,这些值将会被硬编码到输出中,就像生成静态网站一样。

在构建过程中,运行时变量必须不存在于 .env 文件中,并且你必须为 Astro 提供每个运行时期望的环境变量: VARIABLE_1=placeholder astro build。这会向 Astro 指示实际值将在构建的应用程序运行时可用。占位符值将被构建过程忽略,Astro 将在运行时使用提供的值。

如果使用多个运行时变量,请将它们保存在与 .env不同的独立文件(如 .env.runtime)中。使用以下命令开始构建:

export $(cat .env.runtime) && astro build

资源文件

在独立模式下,你的 dist/client/ 文件夹中的资源文件将通过独立服务器提供服务。但你可能会将这些资源部署到 CDN 上,在这种情况下,服务器实际上则不会为它们提供服务。但是在某些情况下,比如内网站点,直接从应用服务器提供静态资源文件则是可行的。

dist/client/_astro/ 文件夹中的资源文件由 Astro 构建。这些资源文件都是带有哈希命名的,因此可以设置长时间的缓存标头。所以在内部,适配器为这些资源添加了如下的标头信息:

Cache-Control: public, max-age=31536000, immutable

更多集成

UI 框架

SSR 适配器

其他集成

Recipes

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文