Minimalistic, zero-dependency .env loader using Node.js's native util.parseEnv.
Significantly faster and smaller than dotenv and dotenvx.
If you like this module, please star the repository on GitHub. Thanks for your support!
Since v20.12.0, Node.js includes built-in process.loadEnvFile and util.parseEnv.
If you don't need env-native's CLI, stick with the built-in Node.js functions.
process.loadEnvFile(); // It will immediately load your .env file into process.envconst { parseEnv } = require('node:util');
parseEnv('HELLO=keyboard cat');// Returns: { HELLO: 'keyboard cat' }- Zero dependencies
- Fast and lightweight (~14 KB)
- Uses built-in
util.parseEnv - Simple API:
config(options)orparse(content, options) - Supports custom file paths and variable overrides
- Supports CLI
- ESM and CJS support
- No self-promotion or console spam, unlike dotenv
- Requires Node.js β₯ 20.12.0
npm install env-nativeyarn add env-nativeMake sure you're using Node.js version
20.12.0or newer.
| Module | Size | Workstation (ms) | Thin Client (ms) |
|---|---|---|---|
| env-native (ESM) | ~ 14 KB | 0.79, 0.78, 0.78, 0.76 | 2.55, 2.97, 2.74, 2.51 |
| dotenv (CJS) | ~ 79 KB | 7.71, 8.06, 8.1, 8.61 | 37.40, 40.96, 37.91, 35.93 |
| dotenvx (CJS) | ~ 293 KB | 91.82, 97.76, 96.76, 99.50 | 286.74, 270.07, 269.07, 278.70 |
env-native is fast, clean, and native β with no logs, no overhead, and up to 90Γ faster than dotenvx on low-end systems.
dotenvx is maintained by the same author as dotenv.
- CPU: AMD Ryzen 9 7945HX
- Disk: KINGSTON SKC3000S1024G (NVM Express 1.4)
- OS: Windows 11 Home 24H2
- CPU: AMD GX-420GI
- Disk: WD Red WDS500G1R0B (M.2 SATA)
- OS: Ubuntu 24.04.2 LTS (Linux 6.8.0-63-generic)
.env
HELLO_WORLD="Keyboard cat! https://youtu.be/J---aiyznGQ"process.js
import { config } from 'env-native';
config(); // require('env-native').config(); for CJS
console.log(process.env.HELLO_WORLD); // Keyboard cat! https://youtu.be/J---aiyznGQLoads a .env file and injects its variables into process.env.
| Option | Type | Default | Description |
|---|---|---|---|
path |
string |
.env |
Path to your .env file |
encoding |
string |
utf8 |
File encoding |
override |
boolean |
false |
Overwrite existing process.env variables |
Note: All injected variables are always stored as strings in
process.env.
void
require('env-native').config({ path: './config/.env', override: true });Parses raw .env file content using the native util.parseEnv. Does not inject anything into process.env.
| Option | Type | Default | Description |
|---|---|---|---|
coerce |
boolean |
true |
Automatically converts values: "false" β false, "42" β 42, etc. |
freeze |
boolean |
true |
Freeze returned object (immutable) |
Record<string, string | number | boolean>
const { readFileSync } = require('node:fs');
const { parse } = require('env-native');
const raw = readFileSync('./config/.my-env-file', 'utf8');
const parsed = parse(raw, { coerce: true, freeze: true });
console.log(parsed);env-native [--env <file>] [--coerce|--no-coerce] [--freeze|--no-freeze] [--cmd <command> [args...]]
enative [--env <file>] [--coerce|--no-coerce] [--freeze|--no-freeze]The CLI is available as both
env-nativeandenative(alias).
| Flag | Alias | Default | Description |
|---|---|---|---|
--env <file> |
-e |
.env |
Path to .env file |
--cmd <command> |
-c |
β | Command to execute with loaded environment |
--coerce |
true |
Auto-convert numbers and booleans | |
--no-coerce |
β | Disable auto-convert | |
--freeze |
true |
Freeze parsed object | |
--no-freeze |
β | Disable freezing | |
--help |
-h |
β | Show help message |
--version |
-v |
β | Print version |
env-native --env .env
env-native --env .env --no-coerce --no-freeze
env-native --env .env --cmd node app.js
env-native -e .env -c node app.jsCopyright Β© Sefinek. Licensed under the MIT License.