Skip to content

全局变量替换

Oxc transformer 支持替换全局变量。

Define

"Define" 功能提供了一种将全局变量替换为常量表达式的方法。此功能类似于 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_ENVimport.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__: "{}",
  },
});

Inject

"Inject" 功能提供了一种将全局变量替换为模块导入的方法。此功能类似于 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"),
};