React sem JSX

JSX não é obrigatório para utilizar o React. Utilizar o React sem JSX é especialmente conveniente quando você não quer configurar compilação no seu ambiente de build.

Cada elemento JSX é apenas açúcar sintático (syntactic sugar) para a chamada da função React.createElement(component, props, ...children). Assim, quaisquer coisas que você pode fazer com JSX também podem ser feitas simplesmente com JavaScript.

Por exemplo, esse código escrito com JSX:

class Hello extends React.Component {
  render() {
    return <div>Hello {this.props.toWhat}</div>;
  }
}

ReactDOM.render(
  <Hello toWhat="World" />,
  document.getElementById('root')
);

pode ser compilado para esse código que não usa JSX:

class Hello extends React.Component {
  render() {
    return React.createElement('div', null, `Hello ${this.props.toWhat}`);
  }
}

ReactDOM.render(
  React.createElement(Hello, {toWhat: 'World'}, null),
  document.getElementById('root')
);

Se você estiver curioso para ver mais exemplos de como JSX é convertido para JavaScript, pode checar o compilador online do Babel.

O componente pode ser fornecido como uma string, como uma subclasse de React.Component ou ainda como uma função para componentes que não possuem estado (state).

Se você se cansar de ter que digitar sempre React.createElement, um padrão comum é atribuir a função à uma variável auxiliar:

const e = React.createElement;

ReactDOM.render(
  e('div', null, 'Hello World'),
  document.getElementById('root')
);

Se você utilizar essa forma resumida de React.createElement, pode ser quase tão conveniente de utilizar o React sem JSX.

Por outro lado, você pode buscar por projetos da comunidade como react-hyperscript e hyperscript-helpers que oferecem uma sintaxe mais amigável.