Bun supports `.jsx` and `.tsx` files out of the box. Bun's internal transpiler converts JSX syntax into vanilla JavaScript before execution.
```tsx#react.tsx
function Component(props: {message: string}) {
return (
{props.message}
);
}
console.log();
```
Bun implements special logging for JSX to make debugging easier.
```bash
$ bun run react.tsx
```
### Prop punning
The Bun runtime also supports "prop punning" for JSX. This is a shorthand syntax useful for assigning a variable to a prop with the same name.
```tsx
function Div(props: {className: string;}) {
const {className} = props;
// without punning
return ;
// with punning
return ;
}
```
### Server-side rendering
To server-side render (SSR) React in an [HTTP server](/docs/api/http):
```tsx#ssr.tsx
import {renderToReadableStream} from 'react-dom/server';
function Component(props: {message: string}) {
return (
{props.message}
);
}
Bun.serve({
port: 4000,
async fetch() {
const stream = await renderToReadableStream(
);
return new Response(stream, {
headers: {'Content-Type': 'text/html'},
});
},
});
```
React `18.3` and later includes an [SSR optimization](https://github.com/facebook/react/pull/25597) that takes advantage of Bun's "direct" `ReadableStream` implementation.