Понижение синтаксиса (syntax lowering)
Трансформер Oxc поддерживает понижение синтаксиса ESNext до уровня ES2015.
Target
Трансформер принимает опцию target, задающую целевую среду выполнения. От этого зависят, какие конструкции понижаются и какие предупреждения выдаются.
Каждая цель — имя среды и номер версии. Поддерживаются такие имена:
chromedenoedgefirefoxhermesieiosnodeoperarhinosafarisamsunges
Поддерживаются те же значения, что и у опции target в esbuild, кроме ES5.
Можно передать одну строку или массив строк:
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)
Допущения компилятора
Можно задавать допущения, чтобы вывод был компактнее.
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 не понижает.
- ESNext
- Декораторы (отслеживается в #9170) (экспериментальные декораторы TypeScript поддерживаются)
- ES2025