Skip to content

Подстановка глобальных переменных

Трансформер Oxc поддерживает подстановку значений вместо глобальных переменных.

Define

Возможность «Define» заменяет глобальные переменные на константные выражения. Аналогично опции global_defs в Terser и define в esbuild.

js
// input
const foo = __DEV__ ? 1 : 2;

// output
const foo = 1;
js
// Example
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
// Example
import { transform } from "oxc-transform";

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

Inject

Возможность «Inject» заменяет глобальные переменные импортом из модуля. Похоже на inject в esbuild и @rollup/plugin-inject.

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

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

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

Каждая запись inject сопоставляет выражение импортированному идентификатору. Ключи — идентификатор или цепочка через точку. Значения — строка источника импорта или кортеж [источник, имя] (* — namespace import).

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", "*"],
  // use a local module instead of a third-party one
  "Object.assign": path.resolve("src/helpers/object-assign.js"),
};