문법 하향
Oxc 트랜스포머는 ESNext를 ES2015 문법으로 하향하는 기능을 지원합니다.
대상
Oxc 트랜스포머는 target 옵션을 받아 타겟 런타임을 지정합니다. 이 설정은 어떤 문법이 하향되고, 어떤 경고가 발행될지를 결정합니다.
각 대상 환경은 환경 이름과 버전 번호로 구성됩니다. 다음 환경 이름들이 현재 지원됩니다:
chromedenoedgefirefoxhermesieiosnodeoperarhinosafarisamsunges
esbuild의 target 옵션에서 지원하는 값들은 모두 지원되며, 단지 ES5는 제외됩니다.
import { transform } from "oxc-transform";
const result = await transform("lib.js", "const foo = a ?? b;", {
target: ["chrome87", "es2022"],
});변환
아래의 문법들에 대해 Oxc는 하향 변환을 지원합니다. 참고로 정규식 관련 변환은 정규식 리터럴(/foo/v)을 RegExp 생성자(new RegExp('foo', 'v'))로 변환하는 것에 국한됩니다. 오래된 브라우저를 지원하기 위해 폴리필을 함께 사용해야 합니다.
ES2026
- 명시적 자원 관리 (
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
- nullish 병합 연산자 (
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 function foo() {})
ES2016
- 지수 연산자 (
foo ** bar)
ES2015
- 화살표 함수 (
const foo = () => {}) - 정규식 스티키 플래그 (
/foo/y) - 정규식 유니코드 플래그 (
/foo/u)
경고
타겟 런타임이 해당 문법을 지원하지 않을 경우, 아래 문법들에 대해 Oxc 트랜스포머는 경고를 발생시킵니다.
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,
},
});다음과 같은 가정이 지원됩니다.
noDocumentAll
사용되지 않는 폐기된 document.all 및 특수 동작을 가정합니다.
pureGetters
getter가 부작용이 없다고 가정합니다.
setPublicClassFields
공개 클래스 필드를 사용할 때, 현재 클래스, 하위 클래스 또는 상위 클래스의 어떤 getter도 가려지지 않는다고 가정합니다. 따라서 Object.defineProperty를 사용하지 않고 직접 할당하는 것이 안전합니다.
참고
TypeScript의 경우 useDefineForClassFields: false와 동일한 동작을 원한다면, setPublicClassFields와 removeClassFieldsWithoutInitializer 둘 다 true로 설정해야 합니다. 자세한 정보는 TypeScript 페이지를 참조하세요.
지원되지 않는 문법
아래의 문법들은 Oxc 트랜스포머에 의해 하향되지 않습니다.
- ESNext
- 장식자 (관련 이슈: #9170) (참고: TypeScript의 실험적 장식자는 지원됨)
- ES2025
