構文の下位化
Oxc transformer は、ESNext を ES2015 の構文に下位化する機能をサポートしています。
対象
Oxc transformer は 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
- 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)
コンパイラの仮定
コンパイラがより小さな出力を作成できるように、以下の仮定を指定できます。
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 と同等の動作をしたい場合、setPublicClassFields と removeClassFieldsWithoutInitializer 両方を true に設定する必要があります。 詳細については TypeScript のページ を参照してください。
サポートされていない構文
以下の構文は、Oxc transformer によって下位化されません。
- ESNext
- デコレータ(追跡中: #9170)(注: TypeScript の実験的デコレータはサポートされています)
- ES2025
