전역 변수 대체
Oxc 변환기(Transformer)는 전역 변수를 대체하는 기능을 지원합니다.
정의
"정의"(Define) 기능은 전역 변수를 상수 표현식으로 대체하는 방법을 제공합니다. 이 기능은 Terser의 global_defs 옵션과 esbuild의 define 옵션과 유사합니다.
// 입력
const foo = __DEV__ ? 1 : 2;
// 출력
const foo = 1;// 예시
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// 예시
import { transform } from "oxc-transform";
const result = await transform("lib.js", sourceCode, {
define: {
__OBJECT__: "{}",
},
});삽입
"삽입"(Inject) 기능은 전역 변수를 모듈에서 가져온 값으로 대체하는 방법을 제공합니다. 이 기능은 esbuild의 inject 옵션과 @rollup/plugin-inject과 유사합니다.
// 입력
const foo = new Promise((resolve) => resolve(1));
// 출력
import { Promise as P } from "es6-promise";
const foo = new P((resolve) => resolve(1));// 예시
import { transform } from "oxc-transform";
const result = await transform("lib.js", sourceCode, {
inject: {
P: ["es6-promise", "Promise"],
},
});각 inject 항목은 표현식을 가져온 식별자로 매핑합니다. 이 키는 식별자(예: __DEV__)여야 하며, 점으로 연결된 식별자 시퀀스(예: process.env.NODE_ENV)도 가능합니다. 이 값은 가져올 모듈 소스를 나타내는 문자열이거나, 가져올 소스와 가져올 이름(*는 네임스페이스 가져오기)을 포함한 문자열 튜플이어야 합니다.
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"),
};