跳到主要内容

环境变量

Bun reads your .env files automatically and provides idiomatic ways to read and write your environment variables programmatically. Plus, some aspects of Bun's runtime behavior can be configured with Bun-specific environment variables.

Setting environment variables

Bun reads the following files automatically (listed in order of increasing precedence).

  • .env
  • .env.production, .env.development, .env.test (depending on value of NODE_ENV)
  • .env.local
FOO=hello
BAR=world

Variables can also be set via the command line.

$ FOO=helloworld bun run dev

Or programmatically by assigning a property to process.env.

process.env.FOO = "hello";

Manually specifying .env files

Bun supports --env-file to override which specific .env file to load. You can use --env-file when running scripts in bun's runtime, or when running package.json scripts.

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

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

Quotation marks

Bun supports double quotes, single quotes, and template literal backticks:

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

Expansion

Environment variables are automatically expanded. This means you can reference previously-defined variables in your environment variables.

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

This is useful for constructing connection strings or other compound values.

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

This can be disabled by escaping the $ with a backslash.

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

dotenv

Generally speaking, you won't need dotenv or dotenv-expand anymore, because Bun reads .env files automatically.

Reading environment variables

The current environment variables can be accessed via process.env.

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

Bun also exposes these variables via Bun.env and import.meta.env, which is a simple alias of process.env.

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

To print all currently-set environment variables to the command line, run bun --print process.env. This is useful for debugging.

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

TypeScript

In TypeScript, all properties of process.env are typed as string | undefined.

Bun.env.whatever;
// string | undefined

To get autocompletion and tell TypeScript to treat a variable as a non-optional string, we'll use interface merging.

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

Add this line to any file in your project. It will globally add the AWESOME property to process.env and Bun.env.

process.env.AWESOME; // => string

Configuring Bun

These environment variables are read by Bun and configure aspects of its behavior.

Runtime transpiler caching

For files larger than 50 KB, Bun caches transpiled output into $BUN_RUNTIME_TRANSPILER_CACHE_PATH or the platform-specific cache directory. This makes CLIs using Bun load faster.

This transpiler cache is global and shared across all projects. It is safe to delete the cache at any time. It is a content-addressable cache, so it will never contain duplicate entries. It is also safe to delete the cache while a Bun process is running.

It is recommended to disable this cache when using ephemeral filesystems like Docker. Bun's Docker images automatically disable this cache.

Disable the runtime transpiler cache

To disable the runtime transpiler cache, set BUN_RUNTIME_TRANSPILER_CACHE_PATH to an empty string or the string "0".

BUN_RUNTIME_TRANSPILER_CACHE_PATH=0 bun run dev

What does it cache?

It caches:

  • The transpiled output of source files larger than 50 KB.
  • The sourcemap for the transpiled output of the file

The file extension .pile is used for these cached files.