Babel register

2729 ワード

本節では@babel/registerについて説明します.Babelを使用する方法の1つは、requireフック(hook)を使用して、requireフックがnodeのrequireモジュールに自身をバインドし、実行時に自動的にファイルをコンパイルすることです.これはCoffeeScriptのcoffee-script/registerと似ています.

インストール


@babel/registerはnodeのrequireメソッドを書き換える機能が1つしかありません.
インストールコマンドは次のとおりです.
npm install @babel/core @babel/register --save-dev

インストール後はrequireで参照できます.以下に示します.
require("@babel/register");

@babel/registerは、nodeのrequireメソッドを最下位に書き換え、コードに@babel/registerモジュールを導入すると、すべてrequireによって導入する.es6,.es,.jsx, .mjs,および.jsが接尾辞名のモジュールはBabelに変換されます.

デフォルトではnode_を無視modules


デフォルトでは、すべてのペアnode_modulesディレクトリの下のファイルのrequireリクエストは無視されます.無視されたファイルに一致する正規表現を次のように渡して、デフォルトの動作を変更できます.
require("@babel/register")({
  ignore: [],
});

パラメータの指定

require("@babel/register")({
  ignore: [
    /regex/,
    function(filepath) {
      return filepath !== "/path/to/es6-file.js";
    },
  ],
  only: [
    /my_es6_folder/,
    function(filepath) {
      return filepath === "/path/to/es6-file.js";
    }
  ],
  extensions: [".es6", ".es", ".jsx", ".js", ".mjs"],
  cache: true,
});

あるいはpluginsやpresetsなどの他のパラメータを渡すこともできます.プロファイルもロードされ、プログラミング方式の構成も統合され、これらの構成項目の上部に配置されます.

かんきょうへんすう


デフォルトでは、@babel/nodeコマンドラインツールと@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

プラグインとpresetのインスタントコンパイル


@babel/register Nodeのrequire()フックサブシステム(hook system)を使用して、ファイルのロード時にファイルを即時にコンパイルします.これは全体的に役立つが、require()フックのコードがより多くのrequire呼び出しをもたらし、依存ループが発生することを意味する.
Babelを例にとると、Babelがユーザーのファイルをコンパイルしようとする過程で、Babelは最終的に自分をロードしたときに自分をコンパイルしようとする可能性があります.
この問題を回避するために、このモジュールは、Babel自身のコンパイルロジックなど、他の実行中のファイルのさらなるコンパイルをトリガーすることを明確に禁止しています.
このような欠点は、プラグインまたはpresetを定義し、このプラグインまたはpreset自体がリアルタイムでコンパイルされている場合、このプロセスは複雑になります.
上記の問題の鍵は、プラグインまたはpresetを最初にロードする必要があることです.プラグインまたはpresetが、自身のすべての依存項目を事前にロードしていると仮定すると、以下のようにすることができます.
require("@babel/register")({
  // ...
});

require("./my-plugin");

@babel/register独自のビジネスロジックではなく、独自のコードによってトリガーされるロードなので、同期ロードされたプラグインやpresetのコンパイルに成功します.
リンク:https://www.9xkd.com/