Node エミュレーション
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 を自分で設定することで上書きできます (例: シェルで)。
.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 モジュールのポリフィルと除外
#ブラウザをターゲットにしていて、コード、または依存関係が crypto、fs、process などの組み込み Node モジュールをインポートする場合、Parcel は自動的に次のポリフィルのいずれかを使用します。 ポリフィルが利用できない場合は、代わりに空のモジュールが使用されます。 エイリアス を使用して、これらを上書きすることもできます。
| ネイティブモジュール | 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/util.js |
| path | path-browserify | vm | vm-browserify |
| zlib | browserify-zlib |
組み込み Node グローバルのシミング
#ブラウザをターゲットにしている場合、Node で利用可能なグローバル変数の使用は、Node 用に書かれたコードを壊さないように置き換えられます。
-
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"
} これらの機能の無効化
#環境変数 と readFileSync 呼び出し のインライン化は、package.json に @parcel/transformer-js キーを作成することで無効にできます。
{
"name": "my-project",
"dependencies": {
...
},
"@parcel/transformer-js": {
"inlineFS": false,
"inlineEnvironment": false
}
} inlineEnvironment は、許可された環境変数をフィルタリングできる glob 文字列の配列にすることもできます。 これは、node_modules のサードパーティコードも環境変数を読み取ることができるため、セキュリティを確保するための良い方法です。
{
"name": "my-project",
"dependencies": {
...
},
"@parcel/transformer-js": {
"inlineEnvironment": ["SENTRY_*"]
}
}