Skip to content

Понижение синтаксиса (syntax lowering)

Трансформер Oxc поддерживает понижение синтаксиса ESNext до уровня ES2015.

Target

Трансформер принимает опцию target, задающую целевую среду выполнения. От этого зависят, какие конструкции понижаются и какие предупреждения выдаются.

Каждая цель — имя среды и номер версии. Поддерживаются такие имена:

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

Поддерживаются те же значения, что и у опции target в esbuild, кроме ES5.

Можно передать одну строку или массив строк:

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

const result = await transform("lib.js", "const foo = a ?? b;", {
  target: "es2020",
  // or multiple targets:
  // target: ["chrome87", "es2022"],
});

Преобразования

Ниже перечислено понижение, которое поддерживает Oxc. Преобразования, связанные с RegExp, переводят литерал /foo/v в конструктор new RegExp('foo', 'v'); для старых браузеров обычно нужен ещё полифилл.

ES2026

  • Явное управление ресурсами (using a = foo())

ES2024

  • Флаг RegExp 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 } })
  • Индексы совпадений RegExp (/foo/d)

ES2021

  • Логические операторы присваивания (foo ||= bar)
  • Числовые разделители (не отдельное преобразование: генерация кода всегда убирает разделители)

ES2020

  • Оператор объединения с null (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() {})
  • Unicode-свойства в RegExp (/\p{Script=Greek}/u)
  • Lookbehind в RegExp (/(?<=foo)bar/)
  • Именованные группы захвата (/(?<foo>bar)/)
  • Флаг s (dotAll) (/foo./s)

ES2017

  • Асинхронные функции (async function foo() {})

ES2016

  • Оператор возведения в степень (foo ** bar)

ES2015

  • Стрелочные функции (const foo = () => {})
  • Флаг RegExp sticky (/foo/y)
  • Флаг RegExp 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 у объектов функций.

Примечание

Реализовано не полностью: при включении вместе с rest/spread объектов возможна ошибка преобразования.

noDocumentAll

Устаревший document.all с особым поведением не используется.

objectRestNoSymbols

У rest/spread свойств объектов нет ключей-символов.

Примечание

Реализовано не полностью: при включении вместе с rest/spread объектов возможна ошибка преобразования.

pureGetters

Геттеры не имеют побочных эффектов.

setPublicClassFields

Публичные поля класса не перекрывают геттер в текущем классе, подклассах и суперклассе; их безопасно присваивать, а не задавать через Object.defineProperty.

Примечание

Для TypeScript, если нужно поведение как при useDefineForClassFields: false, задайте одновременно setPublicClassFields и removeClassFieldsWithoutInitializer в true. Подробнее — страница про TypeScript.

Неподдерживаемые конструкции

Следующие конструкции трансформер Oxc не понижает.