Skip to content

구문 내림(Syntax Lowering)

Oxc 트랜스포머는 ESNext 구문을 ES2015 수준으로 내립니다.

Target

target 옵션으로 대상 런타임을 지정합니다. 어떤 구문을 내릴지와 어떤 경고를 낼지가 결정됩니다.

각 대상 환경은 환경 이름과 버전 번호입니다. 현재 지원하는 환경 이름은 다음과 같습니다:

  • chrome
  • deno
  • edge
  • firefox
  • hermes
  • ie
  • ios
  • node
  • opera
  • rhino
  • safari
  • samsung
  • es

esbuild의 target 옵션이 지원하는 값을 지원하며, ES5는 제외합니다.

문자열 하나 또는 문자열 배열을 넘길 수 있습니다:

js
import { transform } from "oxc-transform";

const result = await transform("lib.js", "const foo = a ?? b;", {
  target: "es2020",
  // 또는 여러 타깃:
  // target: ["chrome87", "es2022"],
});

변환

아래 구문 내림을 지원합니다. 정규식 관련 변환은 정규식 리터럴(/foo/v)을 RegExp 생성자 호출(new RegExp('foo', 'v'))로 바꾸는 수준입니다. 더 오래된 브라우저까지 지원하려면 폴리필과 함께 써야 합니다.

ES2026

  • Explicit Resource Management (using a = foo())

ES2024

  • 정규식 v 플래그와 집합 표기·문자열 속성 (/\p{Emoji}--\p{ASCII}/v)

ES2022

  • 클래스 정적 블록 (class A { static { foo() } })
  • 클래스 필드 (class A { foo = 1; #bar = 2; static baz = 3; static qux = 4; foobar(a) { return #bar in a } })
  • 정규식 일치 인덱스 (/foo/d)

ES2021

  • 논리 할당 연산자 (foo ||= bar)
  • 숫자 구분 기호(변환으로 구현된 것이 아니라 코드 생성 단계에서 구분 기호를 제거)

ES2020

  • 널 병합 (foo ?? bar)
  • 옵셔널 체이닝 (foo?.bar)
  • 네임스페이스 재수출 (export * as foo from "bar")

ES2019

  • 선택적 catch 바인딩 (try {} catch {})

ES2018

  • 나머지/스프레드 프로퍼티 (const foo = { a, b, ...c }, const { x, y, ...z } = foo;)
  • 비동기 이터레이션 (for await (const x of y) {}, async function* foo() {})
  • 정규식 유니코드 프로퍼티 이스케이프 (/\p{Script=Greek}/u)
  • 정규식 룩비하인드 (/(?<=foo)bar/)
  • 정규식 명명 캡처 그룹 (/(?<foo>bar)/)
  • 정규식 s(dotAll) 플래그 (/foo./s)

ES2017

  • async 함수 (async function foo() {})

ES2016

  • 거듭제곱 연산자 (foo ** bar)

ES2015

  • 화살표 함수 (const foo = () => {})
  • 정규식 sticky 플래그 (/foo/y)
  • 정규식 unicode 플래그 (/foo/u)

경고

대상 런타임이 지원하지 않는 아래 구문에 대해서는 경고를 냅니다.

ES2022

  • 최상위 await (await foo())
  • 임의 모듈 네임스페이스 식별자 (import * as "f o o" from "bar")

ES2020

  • BigInt (1n)

컴파일러 가정

컴파일러가 가정할 수 있는 성질을 지정하면 출력을 더 줄일 수 있습니다.

js
import { transform } from "oxc-transform";

const result = await transform("lib.js", "const foo = a ?? b;", {
  target: ["chrome87", "es2022"],
  assumptions: {
    noDocumentAll: true,
  },
});

지원하는 가정은 다음과 같습니다.

ignoreFunctionLength

함수 객체의 .length 속성에 의존하는 코드가 없다고 가정합니다.

참고

아직 완전히 구현되지 않았습니다. 특히 객체 나머지/스프레드와 함께 켜면 변환 오류가 납니다.

noDocumentAll

폐기된 특수 동작의 document.all을 쓰지 않는다고 가정합니다.

objectRestNoSymbols

객체 나머지/스프레드 프로퍼티에 Symbol 키가 포함되지 않는다고 가정합니다.

참고

아직 완전히 구현되지 않았습니다. 특히 객체 나머지/스프레드와 함께 켜면 변환 오류가 납니다.

pureGetters

getter에 부수 효과가 없다고 가정합니다.

setPublicClassFields

퍼블릭 클래스 필드를 쓸 때 현재 클래스·서브클래스·슈퍼클래스의 게터를 가리지 않는다고 가정합니다. 따라서 Object.defineProperty 대신 할당으로 두어도 안전합니다.

참고

TypeScript에서 useDefineForClassFields: false와 같은 동작을 원하면 setPublicClassFieldsremoveClassFieldsWithoutInitializer를 모두 true로 설정하세요. 자세한 내용은 TypeScript 페이지를 참고하세요.

지원하지 않는 구문

Oxc 트랜스포머가 내리지 않는 구문은 다음과 같습니다.