使用环境变量

Astro 使用 Vite 的环境变量,你可以随意使用它们的任一方式获取并设置环境变量。

注意所有环境变量都对服务端代码可见,出于安全考虑只有以 PUBLIC_ 开始的环境变量才会对客户端代码可见。

查看官方的环境变量示例了解最佳实践。

SECRET_PASSWORD=password123
PUBLIC_ANYBODY=there

在这个示例中,PUBLIC_ANYBODY(通过 import.meta.env.PUBLIC_ANYBODY 访问) ,而 SECRET_PASSWORD(通过 import.meta.env.SECRET_PASSWORD 访问)将只对服务端可见。

Astro 包括了几个开箱即用的环境变量:

  • import.meta.env.MODEdevelopment | production):站点的运行模式。在运行 astro dev 时为 development,在运行 astro build 时为 production
  • import.meta.env.BASE_URLstring):站点运行的基础链接。它由 base 配置项 决定。
  • import.meta.env.PRODboolean):你的站点是否运行在生产环境。
  • import.meta.env.DEVboolean): 你的站点是否运行在开发环境(总是和 import.meta.env.PROD 相反)。
  • import.meta.env.SITEstring):特指项目中 astro.config 中的 site

环境变量会从项目目录中的 .env 文件中加载。

你也可以在文件名上附加一个模式(productiondevelopment),如 .env.production.env.development,这使得环境变量只在该模式下生效。

只要在项目目录下创建 .env 文件,并在其中添加一些变量。

.env
# 这只有在服务器上运行时才会有效!
DB_PASSWORD="foobar"
# 这在什么地方都有效!
PUBLIC_POKEAPI="https://pokeapi.co/api/v2"
.env                # 加载所有变量
.env.local          # 加载所有变量,被 git 忽略
.env.[mode]         # 只在特定模式下加载
.env.[mode].local   # 只在特定模式下加载,被 git 忽略

在 Vite 中,你可以使用 process.env,而不是使用 import.meta.env,它使用了 ES2020 中添加的 import.meta 功能。

例如,使用 import.meta.env.PUBLIC_POKEAPI 来获取 PUBLIC_POKEAPI 环境变量。

// 当 import.meta.env.SSR === true
const data = await db(import.meta.env.DB_PASSWORD);

// 当 import.meta.env.SSR === false
const data = fetch(`${import.meta.env.PUBLIC_POKEAPI}/pokemon/squirtle`);

默认情况,Astro 在 astro/client.d.ts 中为 import.meta.env 提供类型定义。

虽然你可以在 .env.[模式] 文件中定义更多的自定义环境变量,但你可能想为自行定义的环境变量提供 TypeScript 的智能提示。这些变量的前缀是 PUBLIC_

为了实现这一点,你可以在 src/ 中创建一个 env.d.ts,并像这样配置 ImportMetaEnv

interface ImportMetaEnv {
  readonly DB_PASSWORD: string;
  readonly PUBLIC_POKEAPI: string;
  // 更多环境变量…
}

interface ImportMeta {
  readonly env: ImportMetaEnv;
}