구문 내림(Syntax Lowering)
Oxc 트랜스포머는 ESNext 구문을 ES2015 수준으로 내립니다.
Target
target 옵션으로 대상 런타임을 지정합니다. 어떤 구문을 내릴지와 어떤 경고를 낼지가 결정됩니다.
각 대상 환경은 환경 이름과 버전 번호입니다. 현재 지원하는 환경 이름은 다음과 같습니다:
chromedenoedgefirefoxhermesieiosnodeoperarhinosafarisamsunges
esbuild의 target 옵션이 지원하는 값을 지원하며, ES5는 제외합니다.
문자열 하나 또는 문자열 배열을 넘길 수 있습니다:
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)
컴파일러 가정
컴파일러가 가정할 수 있는 성질을 지정하면 출력을 더 줄일 수 있습니다.
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와 같은 동작을 원하면 setPublicClassFields와 removeClassFieldsWithoutInitializer를 모두 true로 설정하세요. 자세한 내용은 TypeScript 페이지를 참고하세요.
지원하지 않는 구문
Oxc 트랜스포머가 내리지 않는 구문은 다음과 같습니다.
- ESNext
- 데코레이터(#9170 추적)(참고: TypeScript 실험적 데코레이터는 지원)
- ES2025