Renderizando JSX no servidor com Fastify
JSX é uma excelente abstração para montar interfaces. Introduzida pelo Facebook e popularizada pelo React, trata-se de uma extensão do JavaScript para abstrair a chamada de funções aninhadas. É esperado que o código JSX seja pré-processado (transpilado) para JavaScript válido antes de ser executada nos navegadores ou em ambientes como Node.js.
Configuração do projeto
Antes de tudo, vamos iniciar o nosso projeto e instalar as dependências necessárias:
npm init -y
npm i fastify react react-dom
npm i -D @types/node @types/react @types/react-dom tsx typescript
Agora, configuramos os scripts do nosso projeto. O package.json
deverá ficará assim:
E esse é o tsconfig.json
que iremos utilizar:
Criando nossos componentes
O ecossistema do React já fornece as ferramentas necessárias para renderizarmos os nossos componentes para HTML e enviarmos diretamente do servidor para o nosso cliente. Então, primeiro, vamos criar o componente raiz:
E nossa página inicial:
Configurando o Fastify para renderizar nosso componente React
Como não pretendemos carregar o React para hidratar o nosso HTML do lado do cliente, podemos usar a função renderToStaticMarkup
exportada de react-dom/server
. Nosso arquivo de inicialização do servidor ficará assim:
Se você iniciar o projeto agora (npm run dev
), você deverá ver a página em http://localhost:3000. Claro, podemos melhorar a nossa implementação usando a nova API de stream, introduzida no React 18 (que é o método recomendado). Para isso, faremos as seguintes alterações no nosso código:
E com isso, conseguimos renderizar nossos componentes React do lado do servidor e fazer streaming deles para o nosso cliente. E este é o link do repositório.