Skip to content

Substituição de variáveis globais

O transformador Oxc pode substituir variáveis globais.

Define

O recurso “Define” troca globais por expressões constantes. Semelhante a global_defs no Terser e à opção define do esbuild.

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

// saída
const foo = 1;
js
// Exemplo
import { transform } from "oxc-transform";

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

Cada entrada de define associa uma expressão a uma string que contém código de expressão. As chaves precisam ser um identificador (ex.: __DEV__) ou uma sequência pontilhada (process.env.NODE_ENV, import.meta.env.MODE). Os valores precisam ser expressões válidas.

Sempre coloque valores entre aspas no JS

Os valores de define são strings de expressões. Se quiser literal de string, use aspas extras (ex.: __MODE__: '"development"' ou JSON.stringify("development")).

Referência de objeto não é compartilhada

Diferente do esbuild, ao passar um objeto como valor da opção define, a mesma referência não é compartilhada entre pontos do código — alterações em um lado não aparecem no outro.

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

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

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

Inject

“Inject” substitui globais por import de um módulo. Semelhante à opção inject do esbuild e ao @rollup/plugin-inject.

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

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

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

Cada entrada de inject mapeia uma expressão para um identificador importado. Chaves: identificador ou sequência pontilhada. Valores: string da origem do import, ou tupla [origem, nome] (* para importação de namespace).

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", "*"],
  // usar módulo local em vez de terceiro
  "Object.assign": path.resolve("src/helpers/object-assign.js"),
};