React sem configuração

Já pensou (ou olhou) o código final da sua aplicação React? Com este texto você irá entender como criar uma aplicação React sem qualquer ferramenta.

Como o React é comumente usado com JSX, sempre temos a dependência de uma ferramenta para traduzir as tags HTML no Javascript, mas é possível escrever uma aplicação React na mão, sem usar o npm, webpack, babel e afins? Sim! Mas já te adianto que não é produtivo.

Entendendo o JSX

JSX é o acrônimo de JavaScript XML. Isto nos permite escrever HTML em arquivos .js.

Antes de mostrar como é o código final, vamos entender como funciona o JSX no React. Então veja código baixo:

const App =
<div className="app-container">
<h1>Olá mundo</h1>
</div>;

ReactDOM.render(<App />, document.getElementById("app"));

Cada tag será transformada em uma chamada React.createElement, então após usar o babel, o código acima ficará mais ou menos assim (eu refatorei o código gerado para ficar mais legível):

var h1 = React.createElement("h1", null, "Ol\xE1 mundo");
var App = React.createElement("div", { className: "app-container" }, h1);

ReactDOM.render(
React.createElement(App, null),
document.getElementById("app"));

Então no fundo é tudo JavaScript! Agora que já sabemos como é o código final, vamos entender o uso do React.createElement.

Entendendo o React.createElement

Se olharmos a assinatura deste método veremos que este aceita três parâmetros: o tipo, os atributos e os filhos.

O tipo identifica qual tag HTML será usada (h1, div, span, etc), os atributos são os atributos da tag HTML (em formato de objeto) e os filhos são outros objetos que o React.createElement nos retorna.

Para exemplificar a questão dos atributos, veja o seguinte código onde temos um botão com um atributo de classe e um evento onClick:

const Botao =
<button
className="botao-vermelho"
onClick={() => alert("Clicado")}>

Clique me!
</button>;

Este código seria traduzido para:

var Botao =
React.createElement(
"button",
{
className: "botao-vermelho",
onClick: function onClick() {
return alert("Clicado");
}
},
"Clique me!");

Agora que sabemos o que acontece com o JSX por de baixo dos panos, vamos criar uma aplicação bem simples.

Escrevendo a aplicação

Primeiro adicionamos os arquivos Javascript do React:

<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>

Adicionamos a div principal no body:

<div id="app"></div>

E escrevemos nosso código em uma tag script mesmo:

var titulo = React.createElement("h1", null, "Ol\xE1 mundo");
var botao = React.createElement("button", {
type: "button",
onClick: function onClick() {
return alert("Olá");
}
}, "Exibir alert");

var divPrincipal = React.createElement("div", { className: "app" }, titulo, botao);
var app = document.getElementById("app");

ReactDOM.render(divPrincipal, app);

Resultado final

<html>

<head>
<meta charset="utf-8">
<title>React com configuração mínima</title>

<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
</head>

<body>
<div id="app"></div>
<script>
var titulo = React.createElement("h1", null, "Ol\xE1 mundo");
var botao = React.createElement("button", {
type: "button",
onClick: function onClick() {
return alert("Olá");
}
}, "Exibir alert");

var divPrincipal = React.createElement("div", { className: "app" }, titulo, botao);
var app = document.getElementById("app");

ReactDOM.render(divPrincipal, app);
</script>
</body>

</html>

Conclusão

Saber como é o código final de nossa aplicação é útil para entender como algum framework como o React funciona por trás dos panos. E escrever uma aplicação sem o uso do JSX pode ser improdutiva a longo prazo, principalmente pela manutenção e entendimento da mesma.

Até mais.