@babel/register
Babel を使用する方法の 1 つは、require フックを使用することです。require フックは Node の require
にバインドされ、ファイルをその場で自動的にコンパイルします。これは CoffeeScript の coffee-script/register と同等です。
インストール
- npm
- Yarn
- pnpm
npm install @babel/core @babel/register --save-dev
yarn add @babel/core @babel/register --dev
pnpm add @babel/core @babel/register --save-dev
使用法
require("@babel/register");
拡張子 .es6
、.es
、.jsx
、.mjs
、および .js
を持つ Node によって後続で require されるすべてのファイルは、Babel によって変換されます。
ジェネレーターなど、ポリフィルが必要な機能を使用する場合は、ポリフィルを別途含める必要があります。
デフォルトで node_modules
を無視します
注: デフォルトでは、node_modules
へのすべての require は無視されます。これは、次のように無視する正規表現を渡すことでオーバーライドできます。
require("@babel/register")({
// This will override `node_modules` ignoring - you can alternatively pass
// an array of strings to be explicitly matched or a regex / glob
ignore: [],
});
オプションの指定
require("@babel/register")({
// Array of ignore conditions, either a regex or a function. (Optional)
// File paths that match any condition are not compiled.
ignore: [
// When a file path matches this regex then it is **not** compiled
/regex/,
// The file's path is also passed to any ignore functions. It will
// **not** be compiled if `true` is returned.
function(filepath) {
return filepath !== "/path/to/es6-file.js";
},
],
// Array of accept conditions, either a regex or a function. (Optional)
// File paths that match all conditions are compiled.
only: [
// File paths that **don't** match this regex are not compiled
/my_es6_folder/,
// File paths that **do not** return true are not compiled
function(filepath) {
return filepath === "/path/to/es6-file.js";
},
],
// Setting this will remove the currently hooked extensions of `.es6`, `.es`, `.jsx`, `.mjs`
// and .js so you'll have to add them back if you want them to be used again.
extensions: [".es6", ".es", ".jsx", ".js", ".mjs"],
// Setting this to false will disable the cache.
cache: true,
});
他のすべてのオプションも、plugins
や presets
を含めて渡すことができます。また、設定ファイルもロードされ、プログラムによる設定がファイル設定オプションの上にマージされることに注意してください。@babel/register
は、設定ファイルでの ignore
および only
をサポートしていません。
環境変数
デフォルトでは、@babel/node
cli および @babel/register
は、一時ディレクトリに json キャッシュを保存します。
これにより、ファイルの起動とコンパイルが大幅に改善されます。ただし、この動作を変更したいシナリオがあり、これを行うための環境変数が公開されています。
BABEL_CACHE_PATH
別のキャッシュ場所を指定します。
BABEL_CACHE_PATH=/foo/my-cache.json babel-node script.js
BABEL_DISABLE_CACHE
キャッシュを無効にします。
BABEL_DISABLE_CACHE=1 babel-node script.js
プラグインとプリセットをその場でコンパイルする
@babel/register
は、Node の require()
フックシステムを使用して、ロード時にファイルをその場でコンパイルします。これは全体として非常に便利ですが、require()
フック内のコードが require
をさらに呼び出し、依存関係のサイクルを引き起こす可能性があるという、混乱するケースが発生する可能性があることを意味します。たとえば、Babel の場合、これは、Babel がユーザーのファイルをコンパイルしようとする過程で、Babel が ロード中 にそれ自体をコンパイルしようとする可能性があることを意味します。
この問題を回避するために、このモジュールは再入コンパイルを明示的に許可しません。たとえば、Babel 自身のコンパイルロジックは、他のファイルのその場でのコンパイルを明示的にトリガーできません。この欠点は、ライブコンパイルされるプラグインまたはプリセットを定義する場合、プロセスが複雑になることです。
重要なのは、自分のコードが最初にプラグイン/プリセットをロードする必要があるということです。プラグイン/プリセットがすべての依存関係を事前にロードすると仮定すると、必要なのは
require("@babel/register")({
// ...
});
require("./my-plugin");
ロードをトリガーしたのがあなた自身のコードであり、@babel/register
自体のロジックではないため、これは同期的にロードするプラグイン/プリセットを正常にコンパイルする必要があります。
実験的な Babel 8 の実装
Babel 8 でデフォルトで有効になる新しい実験的な実装を、以下を使用してテストすることもできます。
require("@babel/register/experimental-worker");
内部的には、Babel を非同期的に実行するため、.mjs
設定ファイルと互換性があります。いくつかの注意点がありますが、すでに @babel/register
の代替として使用できます。
- プログラムで
@babel/register
オプションを指定する場合 (require("@babel/register")({ /* ... options */ })
を使用)、それらがシリアル化可能であることを確認する必要があります。つまり、インラインで定義されたプラグイン関数を渡すことはできませんが、それらを別の./my-plugin.js
ファイルまたはbabel.config.js
ファイルに移動する必要があります。 - 新しい実装はまだ実験的です。既存のものと同じ機能を持つはずですが、いくつかの新しいバグや回帰がある可能性があります。
注: @babel/register
は、Node.js のネイティブ ES モジュールをその場でコンパイルすることをサポートしていません。これは、現在 ES モジュールの読み込みをインターセプトするための安定した API がないためです。