Skip to content

Retrocompatibilização sintática (lowering)

O transformador Oxc pode fazer lowering de sintaxes ESNext para ES2015.

Target

A opção target define o runtime alvo — quais sintaxes são convertidas e quais avisos são emitidos.

Cada alvo é um nome de ambiente seguido de versão. Nomes suportados:

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

Os valores aceitos pela opção target do esbuild são suportados, exceto ES5.

É possível passar uma string ou um array:

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

const result = await transform("lib.js", "const foo = a ?? b;", {
  target: "es2020",
  // ou vários alvos:
  // target: ["chrome87", "es2022"],
});

Transformações

O Oxc faz lowering das sintaxes abaixo. Transformações relacionadas a RegExp apenas convertem o literal (/foo/v) para o construtor (new RegExp('foo', 'v')). Para navegadores antigos, será necessário polyfill junto.

ES2026

  • Explicit Resource Management (using a = foo())

ES2024

  • RegExp com flag v, notação de conjunto + propriedades de strings (/\p{Emoji}--\p{ASCII}/v)

ES2022

  • Bloco estático de classe (class A { static { foo() } })
  • Campos de classe (class A { foo = 1; #bar = 2; static baz = 3; static qux = 4; foobar(a) { return #bar in a } })
  • Índices de correspondência RegExp (/foo/d)

ES2021

  • Operadores de atribuição lógica (foo ||= bar)
  • Separadores numéricos (não há transform dedicado; o codegen remove os separadores)

ES2020

  • Nullish coalescing (foo ?? bar)
  • Encadeamento opcional (foo?.bar)
  • export * as foo from "bar"

ES2019

  • catch opcional (try {} catch {})

ES2018

  • Rest/spread em objetos (const foo = { a, b, ...c }, const { x, y, ...z } = foo;)
  • Iteração assíncrona (for await, async function*)
  • Unicode property escapes em RegExp (/\p{Script=Greek}/u)
  • Lookbehind em RegExp (/(?<=foo)bar/)
  • Grupos de captura nomeados (/(?<foo>bar)/)
  • Flag s (dotAll) (/foo./s)

ES2017

  • async function

ES2016

  • Expoenciação (foo ** bar)

ES2015

  • Arrow functions
  • Flags sticky e unicode em RegExp

Avisos

O transformador emite avisos para sintaxes não suportadas pelo alvo:

ES2022

  • await no topo (await foo())
  • Identificadores de namespace de módulo arbitrários (import * as "f o o" from "bar")

ES2020

  • BigInt (1n)

Suposições do compilador

Você pode declarar suposições para diminuir o tamanho da saída.

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

const result = await transform("lib.js", "const foo = a ?? b;", {
  target: ["chrome87", "es2022"],
  assumptions: {
    noDocumentAll: true,
  },
});

Suposições disponíveis:

ignoreFunctionLength

Assume que nenhum código depende da propriedade .length de funções.

Nota

Ainda não totalmente implementada; com object rest/spread pode gerar erro de transformação.

noDocumentAll

Assume que o document.all depreciado com comportamento especial não é usado.

objectRestNoSymbols

Assume que rest/spread de objeto não inclui chaves Symbol.

Nota

Ainda não totalmente implementada; com object rest/spread pode gerar erro de transformação.

pureGetters

Assume que getters não têm efeitos colaterais.

setPublicClassFields

Com campos de classe públicos, assume que não sombreiam getters na classe atual, subclasses ou superclasse — seguro usar atribuição em vez de Object.defineProperty.

TypeScript

Para comportamento equivalente a useDefineForClassFields: false, defina setPublicClassFields e removeClassFieldsWithoutInitializer como true. Veja a página TypeScript.

Sintaxes não suportadas

Estas sintaxes não recebem lowering no transformador Oxc: