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