Configurando ReactJS no Rails com Webpacker
O Javascript moderno usa muitas bibliotecas e estruturas de processamento, incluindo NPM, Yarn e Webpack. Então, quando você usa o React, precisa de todas essas ferramentas. O Rails tem asset pipeline há muito tempo e usou o Sprockets como a principal ferramenta.
Desde o Rails 5.1 existe uma alternativa ao Sprockets pra Javascript, o Webpacker. No Rails 6.0, o Webpacker virou padrão. Ele usa o Webpack pra compilar todos os seus arquivos Javascript.
Uma das grandes vantagens do Webpack é que, no ambiente de desenvolvimento, ele oferece compilação ao vivo do Javascript via webpack-dev-server. Você altera um arquivo e ele é automaticamente compilado e até enviado pro navegador. Isso permite um desenvolvimento muito rápido. Em produção, claro, você usa pré-compilação, juntando todos os arquivos Javascript em apenas um reduzido.
Aqui vou mostrar como criar uma aplicação Ruby on Rails do zero com Webpacker e configurar o ReactJS através do Webpacker.
O que vamos precisar
- Ruby 2.5.1 ou superior
- Rails 5.2.1 ou superior
- Webpacker 3.5.5 ou superior
Criando a aplicação
rails new rails-com-reactjs --skip-test --webpack
Esse comando cria a aplicação e configura o Webpacker. Ele ignora a estrutura de testes.
bundle exec rails webpacker:install:react
Esse comando instala e configura o ReactJS da seguinte forma:
- Adiciona as configurações do babel no root
- Cria um exemplo em
app/javascript/packs/hello_react.jsx - Atualiza as configurações do Webpacker pra aceitar arquivos com a extensão
.jsx - Instala todas as dependências que o React precisa
O exemplo criado hello_react.jsx insere um componente direto no <body> da aplicação. Achei isso sem sentido, sem nenhuma estrutura, e se utilizarmos vai aparecer em todas as páginas. Por isso eu sempre ignoro ele e uso uma estrutura de pastas separando todos os componentes React dentro dela. Pra usar um componente eu utilizo um helper da gem 'react-rails'.
Configurando o ReactJS
Adicione no seu Gemfile:
gem 'react-rails'
Depois de salvar o arquivo não esqueça de rodar bundle install pra baixar e instalar a gem na aplicação.
Instale o react_ujs:
yarn add react_ujs
O react_ujs é um driver do react-rails. Ele varre a página e monta os componentes usando data-react-class e data-react-props.
Agora vamos criar uma estrutura bem simples pra deixar os componentes organizados e criar o nosso componente.
mkdir app/javascript/components
touch app/javascript/components/hello_world.jsx
Dentro do arquivo hello_world.jsx adicione o seguinte código:
import React, { Component } from 'react'
export default class HelloWorld extends Component {
render() {
return <h1>Hello World</h1>
}
}
Pra conseguirmos chamar o componente de dentro de uma página, precisamos adicionar as seguintes configurações no final do arquivo:
app/javascript/packs/application.js
const componentRequireContext = require.context('components', true)
const ReactRailsUJS = require('react_ujs')
ReactRailsUJS.useContext(componentRequireContext)
No arquivo:
app/views/layouts/application.html.erb
# Remova o javascript do asset pipeline.
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
# Adicione o javascript do webpacker.
<%= javascript_pack_tag 'application' %>Utilizando o componente nas views
Agora vamos criar uma página pra a mágica acontecer.
rails g controller pages index --no-helper --no-assets --no-controller-specs --no-view-specs
Esse comando cria um controller chamado pages e uma action index. Ele ignora a estrutura de testes, assets e helpers.
No arquivo:
config/routes.rb
# Remover
get 'pages/index'
# Adicionar
root 'pages#index'
Chame o componente na view com o helper do react-rails:
app/views/pages/index.html.erb
<%= react_component 'hello_world' %>
Pra iniciar a aplicação:
rails s
Em outra aba do terminal:
bin/webpack-dev-server
Pronto. Agora você pode criar componentes com ReactJS pra auxiliar no desenvolvimento da sua aplicação Rails, sem ter que usar o React como um Single Page Application.
Coloquei o exemplo do código no Github:
https://github.com/guilhermeyo/rails-com-reactjs
Fontes:
Comentários