Skip to content

グローバル変数の置換

Oxc transformer はグローバル変数の置換をサポートしています。

定義

"定義" 機能により、グローバル変数を定数式で置換する方法が提供されます。この機能は Terserglobal_defs オプションや esbuild の define オプション に類似しています。

js
// 入力
const foo = __DEV__ ? 1 : 2;

// 出力
const foo = 1;
js
// 例
import { transform } from "oxc-transform";

const result = await transform("lib.js", sourceCode, {
  define: {
    __DEV__: "true",
  },
});

define の各エントリは、式に対応するコード文字列(式を含む)をマッピングします。キーは識別子(例:__DEV__)または識別子のドット区切りのシーケンス(例:process.env.NODE_ENV, import.meta.env.MODE)である必要があります。値は有効な式でなければなりません。

値は常にクォートする

define の値は式の文字列です。これは値が常に文字列であることを意味します。文字列リテラルを意味する場合は、クォートする必要があります(例:__MODE__: '"development"', __MODE__: JSON.stringify("development"))。

オブジェクト参照は共有されない

esbuildとは異なり、define オプションの値にオブジェクトを渡した場合、オブジェクト参照は共有されません。つまり、オブジェクトを変更しても他の場所には反映されません。

js
const foo = __OBJECT__;
foo.bar = 1;
console.log(foo.bar); // 1

const bar = __OBJECT__;
console.log(foo.bar); // undefined
js
// 例
import { transform } from "oxc-transform";

const result = await transform("lib.js", sourceCode, {
  define: {
    __OBJECT__: "{}",
  },
});

インジェクト

"インジェクト" 機能により、モジュールからのインポートでグローバル変数を置換する方法が提供されます。この機能は esbuild の inject オプション および @rollup/plugin-inject に類似しています。

js
// 入力
const foo = new Promise((resolve) => resolve(1));

// 出力
import { Promise as P } from "es6-promise";
const foo = new P((resolve) => resolve(1));
js
// 例
import { transform } from "oxc-transform";

const result = await transform("lib.js", sourceCode, {
  inject: {
    P: ["es6-promise", "Promise"],
  },
});

inject の各エントリは、式をインポートされた識別子にマッピングします。キーは識別子(例:__DEV__)または識別子のドット区切りのシーケンス(例:process.env.NODE_ENV)である必要があります。値はインポート元の文字列、またはインポート元とインポート名の文字列タプル(* は名前空間インポート)である必要があります。

js
const examples = {
  // import { Promise } from 'es6-promise'
  Promise: ["es6-promise", "Promise"],
  // import { Promise as P } from 'es6-promise'
  P: ["es6-promise", "Promise"],
  // import $ from 'jquery'
  $: "jquery",
  // import * as fs from 'fs'
  fs: ["fs", "*"],
  // サードパーティ製ではなくローカルモジュールを使用
  "Object.assign": path.resolve("src/helpers/object-assign.js"),
};