Skip to content

構文の下位化

Oxc transformer は、ESNext を ES2015 の構文に下位化する機能をサポートしています。

対象

Oxc transformer は 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: ["chrome87", "es2022"],
});

変換

Oxc は以下の構文の下位化をサポートしています。なお、正規表現関連の変換は、正規表現リテラル (/foo/v) を RegExp コンストラクタ (new RegExp('foo', 'v')) に置き換えるだけです。古いブラウザのサポートには、ポリフィルを併用する必要があります。

ES2026

  • 明示的なリソース管理 (using a = foo())

ES2024

  • set 記法付きの 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

  • Rest/Spread プロパティ (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)

警告

ターゲットランタイムが対応していない場合、以下の構文に対して警告が発行されます。

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,
  },
});

以下の仮定がサポートされています。

noDocumentAll

非推奨の document.all およびその特殊な振る舞いが使われていないと仮定します。

pureGetters

ゲッターに副作用がないと仮定します。

setPublicClassFields

パブリッククラスフィールドを使用する場合、現在のクラス、サブクラス、またはスーパークラス内のゲッターをシャドーしないと仮定します。そのため、Object.defineProperty を使用するのではなく、直接代入しても安全です。

メモ

TypeScript では、useDefineForClassFields: false と同等の動作をしたい場合、setPublicClassFieldsremoveClassFieldsWithoutInitializer 両方を true に設定する必要があります。 詳細については TypeScript のページ を参照してください。

サポートされていない構文

以下の構文は、Oxc transformer によって下位化されません。