Подстановка глобальных переменных
Трансформер Oxc поддерживает подстановку значений вместо глобальных переменных.
Define
Возможность «Define» заменяет глобальные переменные на константные выражения. Аналогично опции global_defs в Terser и define в esbuild.
// input
const foo = __DEV__ ? 1 : 2;
// output
const foo = 1;// 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 одна и та же ссылка на объект не переиспользуется. Если изменить объект в одном месте, в других это не отразится.
const foo = __OBJECT__;
foo.bar = 1;
console.log(foo.bar); // 1
const bar = __OBJECT__;
console.log(foo.bar); // undefined// Example
import { transform } from "oxc-transform";
const result = await transform("lib.js", sourceCode, {
define: {
__OBJECT__: "{}",
},
});Inject
Возможность «Inject» заменяет глобальные переменные импортом из модуля. Похоже на inject в esbuild и @rollup/plugin-inject.
// input
const foo = new Promise((resolve) => resolve(1));
// output
import { Promise as P } from "es6-promise";
const foo = new P((resolve) => resolve(1));// Example
import { transform } from "oxc-transform";
const result = await transform("lib.js", sourceCode, {
inject: {
P: ["es6-promise", "Promise"],
},
});Каждая запись inject сопоставляет выражение импортированному идентификатору. Ключи — идентификатор или цепочка через точку. Значения — строка источника импорта или кортеж [источник, имя] (* — namespace import).
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"),
};