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:
chromedenoedgefirefoxhermesieiosnodeoperarhinosafarisamsunges
Os valores aceitos pela opção target do esbuild são suportados, exceto ES5.
É possível passar uma string ou um array:
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
catchopcional (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
stickyeunicodeem RegExp
Avisos
O transformador emite avisos para sintaxes não suportadas pelo alvo:
ES2022
awaitno 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.
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:
- ESNext
- ES2025