Skip to content

전역 변수 치환

Oxc 트랜스포머는 전역 변수를 치환할 수 있습니다.

Define

Define 기능은 전역 변수를 상수 표현식으로 바꿉니다. Terserglobal_defsesbuild의 define과 비슷합니다.

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 기능은 전역 변수를 모듈에서 가져온 식별자로 바꿉니다. esbuild의 inject@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 항목은 표현식을 가져온 식별자에 매핑합니다. 키는 식별자(예: __DEV__)이거나 점으로 이어진 식별자(예: process.env.NODE_ENV)여야 합니다. 값은 import 출처 문자열이거나, 출처와 import 이름의 튜플(*는 네임스페이스 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", "*"],
  // 써드파티 대신 로컬 모듈 사용
  "Object.assign": path.resolve("src/helpers/object-assign.js"),
};