Skip to content

O Bun suporta arquivos .jsx e .tsx nativamente. O transpilador interno do Bun converte sintaxe JSX para JavaScript puro antes da execução.

ts
function Component(props: {message: string}) {
  return (
    <body>
      <h1 style={{color: 'red'}}>{props.message}</h1>
    </body>
  );
}

console.log(<Component message="Hello world!" />);

Configuração

O Bun lê seus arquivos de configuração tsconfig.json ou jsconfig.json para determinar como realizar a transformação JSX internamente. Para evitar usar qualquer um destes, as seguintes opções também podem ser definidas em bunfig.toml.

As seguintes opções de compilador são respeitadas.

jsx

Como construções JSX são transformadas em JavaScript puro internamente. A tabela abaixo lista os valores possíveis de jsx, junto com sua transpilação do seguinte componente JSX simples:

tsx
<Box width={5}>Hello</Box>
Opções do compiladorSaída transpilada
json<br/>{<br/> "jsx": "react"<br/>}<br/>tsx<br/>import { createElement } from "react";<br/>createElement("Box", { width: 5 }, "Hello");<br/>
json<br/>{<br/> "jsx": "react-jsx"<br/>}<br/>tsx<br/>import { jsx } from "react/jsx-runtime";<br/>jsx("Box", { width: 5 }, "Hello");<br/>
json<br/>{<br/> "jsx": "react-jsxdev"<br/>}<br/>tsx<br/>import { jsxDEV } from "react/jsx-dev-runtime";<br/>jsxDEV(<br/> "Box",<br/> { width: 5, children: "Hello" },<br/> undefined,<br/> false,<br/> undefined,<br/> this,<br/>);<br/>

O nome da variável jsxDEV é uma convenção usada pelo React. O sufixo DEV é uma maneira visível de indicar que o código se destina a uso em desenvolvimento. A versão de desenvolvimento do React é mais lenta e inclui verificações de validade adicionais e ferramentas de depuração.
json<br/>{<br/> "jsx": "preserve"<br/>}<br/>tsx<br/>// JSX não é transpilado<br/>// "preserve" não é suportado pelo Bun atualmente<br/><Box width={5}>Hello</Box><br/>

jsxFactory

NOTE

**Nota** — Aplicável apenas quando `jsx` é `react`.

O nome da função usado para representar construções JSX. O valor padrão é "createElement". Isso é útil para bibliotecas como Preact que usam um nome de função diferente ("h").

Opções do compiladorSaída transpilada
json<br/>{<br/> "jsx": "react",<br/> "jsxFactory": "h"<br/>}<br/>tsx<br/>import { h } from "react";<br/>h("Box", { width: 5 }, "Hello");<br/>

jsxFragmentFactory

NOTE

**Nota** — Aplicável apenas quando `jsx` é `react`.

O nome da função usado para representar fragmentos JSX como <>Hello</>; aplicável apenas quando jsx é react. O valor padrão é "Fragment".

Opções do compiladorSaída transpilada
json<br/>{<br/> "jsx": "react",<br/> "jsxFactory": "myjsx",<br/> "jsxFragmentFactory": "MyFragment"<br/>}<br/>tsx<br/>// input<br/><>Hello</>;<br/><br/>// output<br/>import { myjsx, MyFragment } from "react";<br/>myjsx(MyFragment, null, "Hello");<br/>

jsxImportSource

NOTE

**Nota** — Aplicável apenas quando `jsx` é `react-jsx` ou `react-jsxdev`.

O módulo a partir do qual a função fábrica de componente (createElement, jsx, jsxDEV, etc) será importada. O valor padrão é "react". Isso normalmente será necessário ao usar uma biblioteca de componentes como Preact.

Opções do compiladorSaída transpilada
jsonc<br/>{<br/> "jsx": "react",<br/> // jsxImportSource não está definido<br/> // padrão para "react"<br/>}<br/>tsx<br/>import { jsx } from "react/jsx-runtime";<br/>jsx("Box", { width: 5, children: "Hello" });<br/>
jsonc<br/>{<br/> "jsx": "react-jsx",<br/> "jsxImportSource": "preact",<br/>}<br/>tsx<br/>import { jsx } from "preact/jsx-runtime";<br/>jsx("Box", { width: 5, children: "Hello" });<br/>
jsonc<br/>{<br/> "jsx": "react-jsxdev",<br/> "jsxImportSource": "preact",<br/>}<br/>tsx<br/>// /jsx-runtime é automaticamente anexado<br/>import { jsxDEV } from "preact/jsx-dev-runtime";<br/>jsxDEV(<br/> "Box",<br/> { width: 5, children: "Hello" },<br/> undefined,<br/> false,<br/> undefined,<br/> this,<br/>);<br/>

Pragmas JSX

Todos estes valores podem ser definidos por arquivo usando pragmas. Um pragma é um comentário especial que define uma opção de compilador em um arquivo específico.

PragmaConfiguração equivalente
ts<br/>// @jsx h<br/>jsonc<br/>{<br/> "jsxFactory": "h",<br/>}<br/>
ts<br/>// @jsxFrag MyFragment<br/>jsonc<br/>{<br/> "jsxFragmentFactory": "MyFragment",<br/>}<br/>
ts<br/>// @jsxImportSource preact<br/>jsonc<br/>{<br/> "jsxImportSource": "preact",<br/>}<br/>

Logging

O Bun implementa logging especial para JSX para facilitar a depuração. Dado o seguinte arquivo:

tsx
import { Stack, UserCard } from "./components";

console.log(
  <Stack>
    <UserCard name="Dom" bio="Street racer and Corona lover" />
    <UserCard name="Jakob" bio="Super spy and Dom's secret brother" />
  </Stack>,
);

O Bun irá formatar a árvore de componentes quando logada:

Prop punning

O runtime do Bun também suporta "prop punning" para JSX. Esta é uma sintaxe abreviada útil para atribuir uma variável a uma prop com o mesmo nome.

tsx
function Div(props: {className: string;}) {
  const {className} = props;

  // sem punning
  return <div className={className} />;
  // com punning
  return <div {className} />;
}

Bun by www.bunjs.com.cn edit