節點模擬

Parcel 包含了幾個模擬 Node.js API 的功能。這允許許多原本為 Node 編寫的 npm 模組也能在瀏覽器中運作。此外,許多瀏覽器模組也採用了基於 Node.js 的 API,例如環境變數。

環境變數

#

Parcel 支援在 JavaScript 中內嵌環境變數。這可以用於判斷建置環境(例如開發、暫存、生產)、注入 API 金鑰等。

若要存取環境變數,請從 process.env 物件中讀取對應的屬性。

if (process.env.NODE_ENV === 'development') {
console.log('Happy developing!');
}

您也可以使用解構語法一次存取多個屬性。

let {NODE_ENV, API_TOKEN} = process.env;

不支援以任何非靜態方式存取 process.env(例如動態屬性查詢)。

NODE_ENV

#

NODE_ENV 環境變數會根據模式由 Parcel 自動設定。執行 parcel build 時,NODE_ENV 預設設定為 production,否則設定為 development。您可以自行設定 NODE_ENV 來覆寫此設定(例如在您的 shell 中)。

.env 檔案

#

Parcel 支援載入專案根目錄中 .env 檔案中定義的環境變數。這支援以換行符號分隔的 NAME=value 成對資料。以 # 開頭的行視為註解。請參閱 dotenv 以取得更多詳細資訊。

.env
APP_NAME=test
API_KEY=12345

除了 .env 之外,還可以建立環境特定的覆寫,例如 .env.production.env.development。這些覆寫會根據 NODE_ENV 環境變數套用(包括 Parcel 自動設定時)。任何未在環境特定覆寫中設定的變數,會退回至基本 .env 檔案中定義的值。

.env.local 檔案也支援環境變數的本機覆寫,不過當 NODE_ENV=test 時不會使用,這樣測試對每個人來說都會產生相同的結果。環境特定覆寫也支援這項功能,例如 .env.production.local

內建 Node 模組的 Polyfilling 和排除

#

當目標是瀏覽器且你的程式碼(或更可能是相依項)匯入內建 Node 模組,例如 cryptofsprocess 時,Parcel 會自動使用下列 polyfill 之一。如果沒有可用的 polyfill,則會改用一個空的模組。你也可以使用 別名 來覆寫這些內容。

原生模組 npm 替換 原生模組 npm 替換
assert assert process process/browser.js
buffer buffer punycode punycode
console console-browserify querystring querystring-es3
constants constants-browserify stream stream-browserify
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.js
路徑 路徑瀏覽器 虛擬機器 虛擬機器瀏覽器
zlib 瀏覽器 zlib

調整內建節點全域變數

#

針對瀏覽器時,將節點中可用的全域變數改為其他值,以避免中斷為節點編寫的程式碼

內嵌 fs.readFileSync

#

如果檔案路徑在靜態上可確定且位於專案根目錄內,則對 fs.readFileSync 的呼叫會被檔案內容取代。

__dirname__filename 變數可以用在檔案名稱引數中。可以使用 + 運算子或 path.join 函式進行字串串接。不支援其他函式、變數或動態運算。運算路徑應始終為絕對路徑,且不依賴於目前的作業目錄。

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"
}

停用這些功能

#

可以在 package.json 中建立 @parcel/transformer-js 金鑰,以停用 環境變數readFileSync 呼叫 的內嵌。

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

inlineEnvironment 也可以是 glob 字串陣列,這可讓您過濾允許的環境變數。這是一個確保安全性的好方法,因為 node_modules 中的第三方程式碼也可以讀取環境變數。

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