節點模擬
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 以取得更多詳細資訊。
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 模組,例如 crypto
、fs
或 process
時,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 |
調整內建節點全域變數
#針對瀏覽器時,將節點中可用的全域變數改為其他值,以避免中斷為節點編寫的程式碼
-
process
會自動從process
模組匯入,除非它是process.browser
或process.env.FOO
表示式的部分,而這些表示式會被布林值或環境變數的值取代。 -
Buffer
會自動從buffer
模組匯入。 -
__filename
和dirname
會被資產檔案路徑(或父資料夾)的字串常數取代,這些路徑是相對於專案根目錄的。 -
global
會被取代為全域變數的參考(行為類似於較新的globalThis
)。
內嵌 fs.readFileSync
#如果檔案路徑在靜態上可確定且位於專案根目錄內,則對 fs.readFileSync
的呼叫會被檔案內容取代。
fs.readFileSync(__dirname + "/file", "utf8")
– 檔案的內容,以字串形式呈現。支援「utf8」、「utf-8」、「hex」和「base64」編碼。fs.readFileSync(__dirname + "/file")
– Buffer 物件。請注意,Buffer 多載體相當大,因此這可能是不可取的。
__dirname
和 __filename
變數可以用在檔案名稱引數中。可以使用 +
運算子或 path.join
函式進行字串串接。不支援其他函式、變數或動態運算。運算路徑應始終為絕對路徑,且不依賴於目前的作業目錄。
import fs from "fs";
import path from "path";
const data = fs.readFileSync(path.join(__dirname, "data.json"), "utf8");
console.log(data);
{
"foo": "bar"
}
停用這些功能
#可以在 package.json
中建立 @parcel/transformer-js
金鑰,以停用 環境變數 和 readFileSync
呼叫 的內嵌。
{
"name": "my-project",
"dependencies": {
...
},
"@parcel/transformer-js": {
"inlineFS": false,
"inlineEnvironment": false
}
}
inlineEnvironment
也可以是 glob 字串陣列,這可讓您過濾允許的環境變數。這是一個確保安全性的好方法,因為 node_modules 中的第三方程式碼也可以讀取環境變數。
{
"name": "my-project",
"dependencies": {
...
},
"@parcel/transformer-js": {
"inlineEnvironment": ["SENTRY_*"]
}
}