Skip to content

全局变量替换

Oxc 转换器支持替换全局变量。

定义

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