Gosto de passar tempo aprendendo novas tecnologias. No entanto, muitas vezes a maior desvantagem de trabalhar com novas tecnologias são os inevitáveis problemas que surgem com a adoção precoce. Eu vi isso com bastante frequência quando estava me familiarizando com o Web3 em “ Como fazer a transição do desenvolvedor Full-Stack para o Web3 Pioneer em 2022 ”.
Como engenheiros de software, estamos acostumados a aceitar esses desafios dos primeiros usuários ao testar novas tecnologias. O que funciona melhor para mim é manter uma lista contínua de notas e comandos que executei, já que etapas aparentemente ilógicas não permanecem na minha memória.
Além do Web3, também encontrei esse desafio no espaço JavaScript, com os requisitos semipadrão de uso de Node.js e Webpack. Eu queria identificar uma solução onde eu pudesse usar JavaScript como está, sem me esforçar com Node.js e Webpack. Li recentemente como o lançamento do Rails 7 abordou essa situação . Então, esse é o caso de uso que abordarei neste artigo.
Para ser totalmente transparente, minha experiência com Ruby e Ruby on Rails é pouca ou nenhuma. Lembro-me de ver alguém emitir alguns comandos para criar um serviço totalmente funcional anos atrás e pensei: “Uau, isso parece incrível”. Mas nunca passei muito tempo brincando com essa abordagem para criar serviços e aplicativos.
Tenho quase certeza de que vi essa demonstração no início de 2006 porque o Rails surgiu no final de 2005. Como vi na demonstração, o resultado final foi um serviço que suportava o padrão de design model-view-controller (MVC), um padrão que Eu estava familiarizado com o uso inicial das estruturas Spring, Struts, JSF e Seam.
Rails mantém a promessa de manter as coisas simples enquanto adere às práticas DRY (não se repita). Para ajudar a honrar essa promessa, Ruby usa Gems para engenheiros introduzirem dependências compartilhadas em seus projetos.
No final de 2021, a sétima versão principal do Rails introduziu alguns recursos interessantes:
Essa última característica foi o que me levou a escrever este artigo.
Em alto nível, o gem importmaps-rails permite que os desenvolvedores importem mapas para seus aplicativos. O uso de /bin/importmap
permite que os engenheiros atualizem, fixem ou desafixem dependências conforme necessário. Isso é semelhante ao modo como Maven e Gradle funcionam em projetos baseados em Java.
Isso elimina a necessidade de lidar com as complexidades relacionadas ao agrupamento de pacotes e à transpilação do ES6 e do Babel. Adeus Webpack! Adeus Node.js!
Como eu não tocava em Ruby on Rails há quase duas décadas, a primeira coisa que precisei fazer foi seguir este guia para instalar Ruby 3.3 em meu MacBook Pro. Depois de instalado, só precisei instalar o plugin Ruby como parte do meu IDE IntelliJ IDEA.
Então, criei um novo projeto Ruby on Rails no IntelliJ chamado import-map
e especifiquei o uso de Importmap
para o framework JavaScript:
Com o projeto criado, primeiro queria ver como seria fácil usar uma biblioteca JavaScript local. Então, criei um novo arquivo JavaScript chamado /public/jvc_utilities.js
com o seguinte conteúdo:
export default function() { console.log('*****************'); console.log('* jvc-utilities *'); console.log('* version 0.0.1 *'); console.log('*****************'); }
A função padrão simplesmente ecoa alguns comandos no console JavaScript.
A seguir, criei um arquivo HTML ( /public/jvc-utilities.html
) com o seguinte conteúdo:
<!DOCTYPE html> <html> <head> <title>jvc-utilities</title> </head> <script type="importmap"> { "imports": { "jvc_utilities": "./jvc_utilities.js"} } </script> <script type="module"> import JvcUtilities from "jvc_utilities"; JvcUtilities(); </script> <h3>jvc-utilities.html</h3> <p>Open the console to see the output of the <code>JvcUtilities()</code> function. </p> </html>
Este exemplo demonstra como um arquivo JavaScript local pode ser usado com um arquivo HTML público — sem qualquer trabalho adicional.
A seguir, criei um novo controlador chamado Example
:
bin/rails generate controller Example index
Eu queria usar a biblioteca Lodash para este exemplo, então usei o seguinte comando para adicionar a biblioteca ao meu projeto import-map
:
bin/importmap pin lodash
Para adicionar algumas funcionalidades baseadas em JavaScript ao controlador, atualizei javascript/controllers/example_controller.js
para ficar assim:
import { Controller } from "@hotwired/stimulus" import _ from "lodash" export default class extends Controller { connect() { const array = [1, 2, 3] const doubled = _.map(array, n => n * 2) console.log('array', array) // Output: [1, 2, 3] console.log('doubled', doubled) // Output: [2, 4, 6] this.element.textContent = `array=${array} doubled=${doubled.join(', ')}` } }
Essa lógica estabelece uma matriz de três valores e depois duplica os valores. Eu uso o método Lodash map()
para fazer isso.
Por fim, atualizei views/example/index.html.erb
para conter o seguinte:
<h3>Example Controller</h3> <div data-controller="example"></div>
Neste ponto, os seguintes URIs estão disponíveis:
/jvc-utilities.html
/example/index
Em vez de executar o serviço Rails localmente, pensei em usar o Heroku. Dessa forma, eu poderia ter certeza de que meu serviço estaria acessível para outros consumidores.
Usando minha conta Heroku, segui o guia “ Introdução ao Heroku com Ruby ”. Com base no meu projeto, meu primeiro passo foi adicionar um arquivo chamado Procfile
com o seguinte conteúdo:
web: bundle exec puma -C config/puma.rb
Em seguida, usei o Heroku CLI para criar um novo aplicativo no Heroku:
heroku login heroku create
Com o comando create
, eu tinha o seguinte aplicativo instalado e funcionando:
Creating app... done, ⬢ lit-basin-84681 https://lit-basin-84681-3f5a7507b174.herokuapp.com/ | https://git.heroku.com/lit-basin-84681.git
Esta etapa também criou o Git remoto que o ecossistema Heroku usa.
Agora, tudo que eu precisava fazer era enviar minhas atualizações mais recentes para o Heroku e implantar o aplicativo:
git push heroku main
Com isso, meu código foi enviado para o Heroku, que então compilou e implantou minha aplicação. Em menos de um minuto, vi o seguinte, informando que meu aplicativo estava pronto para uso:
remote: Verifying deploy... done. To https://git.heroku.com/lit-basin-84681.git fe0b7ad..1a21bdd main -> main
Em seguida, naveguei até a página /example/index
usando meu URL Heroku (que é exclusivo para meu aplicativo, mas já o removi): https://lit-basin-84681-3f5a7507b174.herokuapp.com/example/index
Isto é o que eu vi:
E quando visualizei o console JavaScript em meu navegador, os seguintes logs apareceram:
Navegando para /jvc-utilities.html
, vi as seguintes informações:
Quando visualizei o console JavaScript em meu navegador, vi os seguintes logs:
Sucesso. Consegui usar uma biblioteca JavaScript independente e também a biblioteca pública Lodash JavaScript em meu aplicativo Rails 7 - tudo usando Import Maps e sem precisar lidar com Webpack ou Node.js. Adeus, Webpack e Node.js!
Meus leitores talvez se lembrem da minha declaração de missão pessoal, que acredito poder ser aplicada a qualquer profissional de TI:
“Concentre seu tempo em fornecer recursos/funcionalidades que ampliem o valor de sua propriedade intelectual. Aproveite estruturas, produtos e serviços para todo o resto.” - J. Vester
Neste artigo, mergulhei de cabeça no Rails 7 e usei Import Maps para mostrar como é fácil usar bibliotecas JavaScript sem o esforço extra de precisar usar Webpack e Node.js. Fiquei bastante impressionado com o pouco tempo necessário para atingir meus objetivos, apesar de já terem passado mais de duas décadas desde a última vez que vi Rails em ação.
Do ponto de vista da implantação, o esforço para implantar a aplicação Rails na plataforma Heroku consistiu na criação de um Procfile
e três comandos CLI.
Em ambos os casos, Rails e Heroku aderem à minha declaração de missão, permitindo-me permanecer focado em entregar valor aos meus clientes e não ficar atolado em desafios com Webpack, Node.js ou mesmo tarefas DevOps.
Embora eu tenha certeza de que continuaremos a enfrentar pontos problemáticos não tão ideais ao explorar novas tecnologias, também estou confiante de que, com o tempo, veremos realizações semelhantes às demonstradas neste artigo.
Como sempre, meu código-fonte pode ser encontrado no GitLab aqui .
Tenha um ótimo dia!