Day22 - Astro Series: Environment Variable

Astro 系列文第二十二日:环境变量

一个漂亮的渐变背景上面有一句标题:「部署升空」

前言

本章节来介绍环境变量在 Astro 当中,并且可以如何运用它。

为什么需要环境变量?

在真实世界中会需要面临不同的开发环境,像是:开发、生产……等阶段,而每个阶段有可能会有自己对应的 API 服务器,因此需要连接不同的服务器地址,因此与其写死相关程式片段,我们可以透过环境变量来创建一个「存在于专案范围内的变量」,来解决相同的程式需要应对不同环境的问题。同时环境变量允许开发人员将敏感信息(如 API 金钥或数据库密码)存储在安全的位置,而不是写死在代码中。因此总结以下几点使用环境变量的好处:

  1. 安全性
  2. 易维护
  3. 易配置

获取环境变量

变量将会暴露在 import.meta.env 物件上,以下是一些预设的环境变量与解释:

环境变量也可以用于检测当前专案的模式并采取一些行动,像是:在开发模式时显示草稿状态的文件,但在生产模式时则隐藏。

const publishedPosts = await getCollection('post', (post) => (import.meta.env.PROD ? !post.data.isDraft : true));

使用环境变量

Astro 使用 Vite 内建的环境变量,因此它们使用环境变量的方式是完全相同的,可以使用 Vite 的任一方法🔗来处理。

创建 .env 文件

Terminal window
# 只在伺服器上運行有效
PUBLIC_IMAGEAPI=https://picsum.photos
# 任何地方都有效
SECRET_PASSWORD=password123

举例以上的例子,只要有 PUBLIC_ 前缀名称的环境变量将可以在整个专案不管是伺服端还是客户端存取到,但前缀 SECRET_ 的环境变量则只能在伺服端存取得到。

// 使用環境變數
fetch(`${import.meta.env.PUBLIC_IMAGEAPI}/300/300`);

创建不同环境的 .env 文件

可以在文件名称上附加模式名称(像是 productiondevelopment)如: .env.production.env.development,这样该档案内的环境变量只会在对应的模式下生效。

透过 CLI 添加环境变量

环境变量也可以透过 CLI 在运行时添加,但要留意这种方式设定的变量将会在全专案中可被使用,包含客户端上:

Terminal window
IMAGEAPI=https://picsum.photos npm run dev

延伸阅读