Skip to content

Bun 會自動讀取你的 .env 文件,並提供符合習慣的方法來以編程方式讀取和寫入環境變量。此外,Bun 運行時行為的某些方面可以使用 Bun 特定的環境變量進行配置。

設置環境變量

Bun 會自動讀取以下文件(按優先級遞增順序列出)。

  • .env
  • .env.production.env.development.env.test(取決於 NODE_ENV 的值)
  • .env.local
ini
FOO=hello
BAR=world

變量也可以通過命令行設置。

sh
FOO=helloworld bun run dev
sh
# 使用 CMD
set FOO=helloworld && bun run dev

# 使用 PowerShell
$env:FOO="helloworld"; bun run dev

Windows 的跨平台解決方案

對於跨平台解決方案,你可以使用 bun shell。例如,bun exec 命令。

sh
bun exec 'FOO=helloworld bun run dev'

在 Windows 上,使用 bun run 調用的 package.json 腳本將自動使用 bun shell,使以下內容也是跨平台的。

json
"scripts": {
  "dev": "NODE_ENV=development bun --watch app.ts",
},

或者通過為 process.env 分配屬性以編程方式設置。

ts
process.env.FOO = "hello";

手動指定 .env 文件

Bun 支持 --env-file 來覆蓋要加載的特定 .env 文件。你可以在 Bun 運行時運行腳本或運行 package.json 腳本時使用 --env-file

sh
bun --env-file=.env.1 src/index.ts

bun --env-file=.env.abc --env-file=.env.def run build

禁用自動 .env 加載

使用 --no-env-file 禁用 Bun 的自動 .env 文件加載。這在你希望僅依賴系統環境變量的生產環境或 CI/CD 管道中很有用。

sh
bun run --no-env-file index.ts

這也可以在 bunfig.toml 中配置:

toml
# 禁用加載 .env 文件
env = false

即使禁用了默認加載,通過 --env-file 顯式提供的環境文件仍將被加載。


引號

Bun 支持雙引號、單引號和模板字面量反引號:

ini
FOO='hello'
FOO="hello"
FOO=`hello`

展開

環境變量會自動 展開。這意味著你可以在環境變量中引用先前定義的變量。

ini
FOO=world
BAR=hello$FOO
ts
process.env.BAR; // => "helloworld"

這對於構造連接字符串或其他復合值很有用。

ini
DB_USER=postgres
DB_PASSWORD=secret
DB_HOST=localhost
DB_PORT=5432
DB_URL=postgres://$DB_USER:$DB_PASSWORD@$DB_HOST:$DB_PORT/$DB_NAME

這可以通過用反斜槓轉義 $ 來禁用。

ini
FOO=world
BAR=hello\$FOO
ts
process.env.BAR; // => "hello$FOO"

dotenv

一般來說,你不再需要 dotenvdotenv-expand,因為 Bun 會自動讀取 .env 文件。

讀取環境變量

當前環境變量可以通過 process.env 訪問。

ts
process.env.API_TOKEN; // => "secret"

Bun 還通過 Bun.envimport.meta.env 公開這些變量,這是 process.env 的簡單別名。

ts
Bun.env.API_TOKEN; // => "secret"
import.meta.env.API_TOKEN; // => "secret"

要將所有當前設置的環境變量打印到命令行,運行 bun --print process.env。這對於調試很有用。

sh
bun --print process.env
BAZ=stuff
FOOBAR=aaaaaa
<lots more lines>

TypeScript

在 TypeScript 中,process.env 的所有屬性都類型為 string | undefined

ts
Bun.env.whatever;
// string | undefined

要獲得自動補全並告訴 TypeScript 將變量視為非可選字符串,我們將使用 接口合並

ts
declare module "bun" {
  interface Env {
    AWESOME: string;
  }
}

將此行添加到項目中的任何文件。它將全局添加 AWESOME 屬性到 process.envBun.env

ts
process.env.AWESOME; // => string

配置 Bun

這些環境變量由 Bun 讀取並配置其行為的各個方面。

名稱描述
NODE_TLS_REJECT_UNAUTHORIZEDNODE_TLS_REJECT_UNAUTHORIZED=0 禁用 SSL 證書驗證。這對於測試和調試很有用,但你應該非常謹慎在生產中使用。注意:此環境變量最初由 Node.js 引入,我們為了兼容性保留了名稱。
BUN_CONFIG_VERBOSE_FETCH如果 BUN_CONFIG_VERBOSE_FETCH=curl,則 fetch 請求會將 url、方法、請求頭和響應頭記錄到控制台。這對於調試網絡請求很有用。這也適用於 node:httpBUN_CONFIG_VERBOSE_FETCH=1 等同於 BUN_CONFIG_VERBOSE_FETCH=curl,只是沒有 curl 輸出。
BUN_RUNTIME_TRANSPILER_CACHE_PATH運行時轉譯器緩存大於 50 KB 的源文件的轉譯輸出。這使得使用 Bun 的 CLI 加載更快。如果設置了 BUN_RUNTIME_TRANSPILER_CACHE_PATH,則運行時轉譯器將轉譯輸出緩存到指定目錄。如果 BUN_RUNTIME_TRANSPILER_CACHE_PATH 設置為空字符串或字符串 "0",則運行時轉譯器將不緩存轉譯輸出。如果未設置 BUN_RUNTIME_TRANSPILER_CACHE_PATH,則運行時轉譯器將轉譯輸出緩存到平台特定的緩存目錄。
TMPDIRBun 偶爾需要目錄來存儲在捆綁或其他操作期間的中間資產。如果未設置,默認為平台特定的臨時目錄:Linux 上為 /tmp,macOS 上為 /private/tmp
NO_COLOR如果 NO_COLOR=1,則 ANSI 顏色輸出 被禁用
FORCE_COLOR如果 FORCE_COLOR=1,則 ANSI 顏色輸出強制啟用,即使設置了 NO_COLOR
BUN_CONFIG_MAX_HTTP_REQUESTS控制 fetch 和 bun install 發送的並發 HTTP 請求的最大數量。默認為 256。如果你遇到速率限制或連接問題,可以減少此數字。
BUN_CONFIG_NO_CLEAR_TERMINAL_ON_RELOAD如果 BUN_CONFIG_NO_CLEAR_TERMINAL_ON_RELOAD=true,則 bun --watch 在重新加載時不會清除控制台
DO_NOT_TRACK禁用崩潰時上傳崩潰報告到 bun.report。在 macOS 和 Windows 上,默認啟用崩潰報告上傳。否則,截至 2024 年 5 月 21 日,遙測尚未發送,但我們計劃在未來幾周內添加遙測。如果 DO_NOT_TRACK=1,則自動上傳崩潰報告和遙測都 被禁用
BUN_OPTIONS將命令行參數前置到任何 Bun 執行。例如,BUN_OPTIONS="--hot" 使 bun run dev 行為像 bun --hot run dev

運行時轉譯器緩存

對於大於 50 KB 的文件,Bun 將轉譯輸出緩存到 $BUN_RUNTIME_TRANSPILER_CACHE_PATH 或平台特定的緩存目錄。這使得使用 Bun 的 CLI 加載更快。

此轉譯器緩存是全局的,在所有項目之間共享。隨時刪除緩存是安全的。它是一個內容可尋址緩存,因此永遠不會包含重復條目。在 Bun 進程運行時刪除緩存也是安全的。

建議在使用 Docker 等臨時文件系統時禁用此緩存。Bun 的 Docker 鏡像自動禁用此緩存。

禁用運行時轉譯器緩存

要禁用運行時轉譯器緩存,將 BUN_RUNTIME_TRANSPILER_CACHE_PATH 設置為空字符串或字符串 "0"

sh
BUN_RUNTIME_TRANSPILER_CACHE_PATH=0 bun run dev

它緩存什麼?

它緩存:

  • 大於 50 KB 的源文件的轉譯輸出。
  • 文件轉譯輸出的 source map

這些緩存文件使用 .pile 擴展名。

Bun學習網由www.bunjs.com.cn整理維護