doc: add new environment variables doc page · nodejs/node@88e434e
1+# Environment Variables
2+3+Environment variables are variables associated to the environment the Node.js process runs in.
4+5+## CLI Environment Variables
6+7+There is a set of environment variables that can be defined to customize the behavior of Node.js,
8+for more details refer to the [CLI Environment Variables documentation][].
9+10+## `process.env`
11+12+The basic API for interacting with environment variables is `process.env`, it consists of an object
13+with pre-populated user environment variables that can be modified and expanded.
14+15+For more details refer to the [`process.env` documentation][].
16+17+## DotEnv
18+19+Set of utilities for dealing with additional environment variables defined in `.env` files.
20+21+> Stability: 1.1 - Active development
22+23+<!--introduced_in=v20.12.0-->
24+25+### .env files
26+27+`.env` files (also known as dotenv files) are files that define environment variables,
28+which Node.js applications can then interact with (popularized by the [dotenv][] package).
29+30+The following is an example of the content of a basic `.env` file:
31+32+```text
33+MY_VAR_A = "my variable A"
34+MY_VAR_B = "my variable B"
35+```
36+37+This type of file is used in various different programming languages and platforms but there
38+is no formal specification for it, therefore Node.js defines its own specification described below.
39+40+A `.env` file is a file that contains key-value pairs, each pair is represented by a variable name
41+followed by the equal sign (`=`) followed by a variable value.
42+43+The name of such files is usually `.env` or it starts with `.env` (like for example `.env.dev` where
44+`dev` indicates a specific target environment). This is the recommended naming scheme but it is not
45+mandatory and dotenv files can have any arbitrary file name.
46+47+#### Variable Names
48+49+A valid variable name must contain only letters (uppercase or lowercase), digits and underscores
50+(`_`) and it can't begin with a digit.
51+52+More specifically a valid variable name must match the following regular expression:
53+54+```text
55+^[a-zA-Z_]+[a-zA-Z0-9_]*$
56+```
57+58+The recommended convention is to use capital letters with underscores and digits when necessary,
59+but any variable name respecting the above definition will work just fine.
60+61+For example, the following are some valid variable names: `MY_VAR`, `MY_VAR_1`, `my_var`, `my_var_1`,
62+`myVar`, `My_Var123`, while these are instead not valid: `1_VAR`, `'my-var'`, `"my var"`, `VAR_#1`.
63+64+#### Variable Values
65+66+Variable values are comprised by any arbitrary text, which can optionally be wrapped inside
67+single (`'`) or double (`"`) quotes.
68+69+Quoted variables can span across multiple lines, while non quoted ones are restricted to a single line.
70+71+Noting that when parsed by Node.js all values are interpreted as text, meaning that any value will
72+result in a JavaScript string inside Node.js. For example the following values: `0`, `true` and
73+`{ "hello": "world" }` will result in the literal strings `'0'`, `'true'` and `'{ "hello": "world" }'`
74+instead of the number zero, the boolean `true` and an object with the `hello` property respectively.
75+76+Examples of valid variables:
77+78+```text
79+MY_SIMPLE_VAR = a simple single line variable
80+MY_EQUALS_VAR = "this variable contains an = sign!"
81+MY_HASH_VAR = 'this variable contains a # symbol!'
82+MY_MULTILINE_VAR = '
83+this is a multiline variable containing
84+two separate lines\nSorry, I meant three lines'
85+```
86+87+#### Spacing
88+89+Leading and trailing whitespace characters around variable keys and values are ignored unless they
90+are enclosed within quotes.
91+92+For example:
93+94+```text
95+ MY_VAR_A = my variable a
96+ MY_VAR_B = ' my variable b '
97+```
98+99+will be treaded identically to:
100+101+```text
102+MY_VAR_A = my variable
103+MY_VAR_B = ' my variable b '
104+```
105+106+#### Comments
107+108+Hash-tag (`#`) characters denote the beginning of a comment, meaning that the rest of the line
109+will be completely ignored.
110+111+Hash-tags found within quotes are however treated as any other standard character.
112+113+For example:
114+115+```text
116+# This is a comment
117+MY_VAR = my variable # This is also a comment
118+MY_VAR_A = "# this is NOT a comment"
119+```
120+121+#### `export` prefixes
122+123+The `export` keyword can optionally be added in front of variable declarations, such keyword will be completely ignored
124+by all processing done on the file.
125+126+This is useful so that the file can be sourced, without modifications, in shell terminals.
127+128+Example:
129+130+```text
131+export MY_VAR = my variable
132+```
133+134+### CLI Options
135+136+`.env` files can be used to populate the `process.env` object via one the following CLI options:
137+138+* [`--env-file=file`][]
139+140+* [`--env-file-if-exists=file`][]
141+142+### Programmatic APIs
143+144+There following two functions allow you to directly interact with `.env` files:
145+146+* [`process.loadEnvFile`][] loads an `.env` file and populates `process.env` with its variables
147+148+* [`util.parseEnv`][] parses the row content of an `.env` file and returns its value in an object
149+150+[CLI Environment Variables documentation]: cli.md#environment-variables_1
151+[`--env-file-if-exists=file`]: cli.md#--env-file-if-existsfile
152+[`--env-file=file`]: cli.md#--env-filefile
153+[`process.env` documentation]: process.md#processenv
154+[`process.loadEnvFile`]: process.md#processloadenvfilepath
155+[`util.parseEnv`]: util.md#utilparseenvcontent
156+[dotenv]: https://github.com/motdotla/dotenv