Skip to main content

JSX

JSX is a templating language created by React team. It's just a syntactic sugar for the below React JSX Factory Function.

React.createElement(component, props, ...children);

This means that the compiler converts JSX to JS by adding React.createElement function.

import React from 'react'; // We need this import. Otherwise the compiler will not add it.

function App() {
return <h1>Hello World</h1>;
}

After compiling, the JSX would look as below.

import React from 'react';

function App() {
return React.createElement('h1', null, 'Hello world');
}
important

React.createElement isn't for generating HTML elements. It's only for converting JSX to JS.

Using the new 'react/jsx-runtime'​

The old way of using React.CreateElement had a problem of having React in the import always and also this method had some performance problems.

So jsx-runtime was introduced and this compiles JSX to the below JS code.

// Inserted by a compiler (don't import it yourself!)
import { jsx as _jsx } from 'react/jsx-runtime';

function App() {
return _jsx('h1', { children: 'Hello world' });
}

Tools used for compiling​

Babel​

Babel compiler can be used to compile JSX to JS as described above.

TypeScript​

If using typescript, then JSX file are written as TSX files. The tsconfig.json has a configuration to say which way must be used for compiling TSX to JS.

The configuration parameter jsx can be react to compile to createElement or react-jsx to compile to use 'react/jsx-runtime' library.

Why JSX​

Generating HTML directly using plain JS is very error-prone and cumbersome. Example - matching open/close tags, escape content, etc. It's not only tough to write but also to read the code.

JSX has an HTML/XML based syntax. But it has nothing to do with HTML. But this makes it easy to write and understand.

It also provides the advantage where we can write pure/plain HTML directly in it and also co-locate the String interpolation in the same place.

On compilation, it will generate a JS script which will in-turn generate the HTML block for that component.

tip

JSX doesn't directly create the HTML output. It only creates JS which is capable for generating the HTML.