🐒 Node Emulation

Some features that ultimately emulate Node.js's API

¢ 🌳 Environment Variables

Parcel uses dotenv to support loading environment variables from .env files.

.env files are to be stored alongside the package.json that contains your parcel-bundler dependency.

Parcel loads .env files with these specific names for the following NODE_ENV values:

valid .env filenames NODE_ENV=* NODE_ENV=test
.env βœ”οΈ βœ”οΈ
.env.local βœ”οΈ βœ–οΈ
.env.${NODE_ENV} βœ”οΈ βœ”οΈ
.env.${NODE_ENV}.local βœ”οΈ βœ”οΈ

Notably:

ΒΆ πŸ•³οΈ Polyfilling & Excluding Builtin Node Modules

When (or more likely a dependency) importing packages such as crypto, fs or process, Parcel will either automatically use one of the listed polyfills and otherwise exclude that module. You can use the aliases field in your package.json

native module npm replacement native module npm replacement
assert assert process process/browser.js
buffer buffer punycode punycode
console console-browserify querystring querystring-es3
constants constants-browserify stream readable-stream
crypto crypto-browserify string_decoder string_decoder
domain domain-browser sys util/util.js
events events timers timers-browserify
http stream-http tty tty-browserify
https https-browserify url url
os os-browserify/browser.js util util/util.js
path path-browserify vm vm-browserify
zlib browserify-zlib

ΒΆ πŸ“„ Inlining fs.readFileSync

Calls to fs.readFileSync are replaced with the file's contents if the filepath is statically determinable and inside the project root

build index.js
index.js:
import fs from "fs";
import path from "path";

const data = fs.readFileSync(path.join(__dirname, "data.json"), "utf8");
console.log(data);
data.json:
{
"foo": "bar"
}

ΒΆ πŸ”§ Disabling These Features

Inlining of environment variables and readFileSync calls can be disabled via a @parcel/transformer-js key in package.json:

package.json:
{
"name": "my-project",
"dependencies": {
...
},
"@parcel/transformer-js": {
inlineFS: false,
inlineEnvironment: false
}
}

inlineEnvironment can also be an array of glob strings:

{
"name": "my-project",
"dependencies": {
...
},
"@parcel/transformer-js": {
inlineEnvironment: ["SENTRY_*"]
}
}

inlineFS applies to readFileSync calls and inlineEnvironment to process.env.SOMETHING:

{
inlineFS: boolean,
inlineEnvironment: boolean | Array<Glob>
}

(This functionality is provided by @parcel/transformer-js and @parcel/resolver-default.)