Skip to content

전역 변수 대체

Oxc 변환기(Transformer)는 전역 변수를 대체하는 기능을 지원합니다.

정의

"정의"(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_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__: "{}",
  },
});

삽입

"삽입"(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"),
};