Como construí um playground de Ruby para o meu blog
Publicado em04 de março de 2025
Jota Ribeiro
0Visualizações
7Minutos de leitura
Por que fiz isso
Tenho estudado Ruby e, enquanto explorava a linguagem e suas possibilidades, percebi que seria muito útil ter um ambiente interativo dentro do próprio blog. Eu queria um espaço onde pudesse:
Testar trechos de código Ruby em tempo real.
Compartilhar exemplos funcionais com os leitores.
Registrar a evolução dos meus estudos.
A maioria dos blogs de programação apresenta apenas blocos de código estáticos. Eu queria algo mais dinâmico: um playground em que qualquer pessoa pudesse executar, modificar e experimentar Ruby diretamente no navegador, sem precisar configurar nada localmente.
O resultado final
Antes de entrar nos detalhes técnicos, este é o resultado final:
Playground de Ruby integrado ao blog, com editor de código e console de saída.
Tecnologias utilizadas
Estas foram as principais tecnologias usadas no projeto.
Front-end
React e TypeScript: para a interface e o gerenciamento de estado.
Next.js: como framework do blog.
Tailwind CSS: para a estilização.
Monaco Editor: o mesmo editor que equipa o VS Code, oferecendo uma experiência de edição mais completa.
react-resizable-panels: para criar painéis redimensionáveis.
WebAssembly
Ruby WASM: uma versão do Ruby compilada para WebAssembly, por meio do pacote ruby-head-wasm-wasi.
@wasmer/wasi: para emular o ambiente WASI no navegador.
@wasmer/wasmfs: para fornecer um sistema de arquivos virtual ao ambiente Ruby.
Utilitários
LZ-String: para compactar código nos parâmetros da URL.
Lucide React: para os ícones da interface.
Como construí o playground
1. Preparando o WebAssembly para executar Ruby
O primeiro desafio foi fazer o Ruby funcionar no navegador. Isso se tornou possível graças ao projeto Ruby WASM, que compila o interpretador da linguagem para WebAssembly.
Arquitetura simplificada da execução do Ruby por WebAssembly no navegador.
2. Criando a interface do editor
Para o editor, usei o Monaco Editor, o mesmo componente que serve de base para o VS Code. Com ele, consegui oferecer recursos como destaque de sintaxe, autocompletar e formatação de código Ruby.
O componente Playground é o centro da aplicação. Ele gerencia o estado, inicializa a máquina virtual do Ruby e coordena a comunicação entre o editor e o console.
46output={isLoading ?'Olá, fã de Ruby... :)': output}
47isError={isError}
48onRunCode={handleRunCode}
49onSetCode={setCode}
50onSetOutput={setOutput}
51/>
52{/* Modal do modo de tela cheia */}
53</>
54);
55};
Layout responsivo com painéis redimensionáveis.
5. Desafios encontrados
Durante o desenvolvimento, encontrei alguns desafios importantes.
Gerenciamento de memória
O WebAssembly possui limitações de memória e o interpretador Ruby pode consumir bastante recurso. Foi necessário otimizar o uso de memória e implementar cuidados para evitar vazamentos.
Compatibilidade com bibliotecas Ruby
Nem todas as bibliotecas Ruby funcionam em um ambiente WebAssembly. Precisei adaptar alguns exemplos e garantir que os recursos fundamentais da linguagem estivessem disponíveis.
Desempenho
Executar Ruby por WebAssembly é mais lento do que executar a linguagem nativamente. Adicionei indicadores visuais para deixar claro quando o código está sendo processado e otimizei os pontos possíveis.
Indicador de carregamento durante a inicialização da máquina virtual Ruby.
Recursos interessantes
Compartilhamento de código pela URL
Implementei um sistema que permite compartilhar trechos de código por meio da URL. O LZ-String compacta o conteúdo para manter o endereço em um tamanho razoável.
Para integrar o playground ao blog construído com Next.js, criei um componente React que pode ser incluído facilmente em qualquer publicação MDX.
Playground.tsx
1// Exemplo de uso em uma publicação MDX
2<Playground
3isHeading={true}
4initialCode={`puts "Olá, mundo Ruby!"
5# Experimente modificar este código
6[1, 2, 3, 4, 5].each do |n|
7 puts n * n
8end`}
9/>
O que aprendi
Este projeto me ensinou bastante sobre:
WebAssembly: como compilar e executar linguagens de programação no navegador.
React avançado: gerenciamento de estados complexos e uso de referências.
Otimização de desempenho: como lidar com operações intensivas no navegador.
Experiência de ferramentas para desenvolvedores: como criar uma interface intuitiva para quem programa.
Próximos passos
Tenho alguns planos para melhorar o playground:
Suporte a gems: permitir o uso de gems Ruby populares.
Persistência: salvar o código no localStorage para continuar de onde o usuário parou.
Exemplos prontos: criar uma biblioteca de exemplos voltados ao aprendizado.
Melhor integração com Rails: adicionar exemplos específicos de Ruby on Rails.
Conclusão
Construir um playground de Ruby para o blog foi um desafio técnico muito interessante, porque uniu meu interesse pela linguagem ao que venho aprendendo sobre desenvolvimento web moderno. O resultado é uma ferramenta que me ajuda a estudar e experimentar Ruby e, ao mesmo tempo, melhora a experiência de quem lê o blog.
Espero que este texto ajude quem esteja pensando em criar algo parecido. O código-fonte completo está disponível no meu GitHub, e sugestões e contribuições são sempre bem-vindas.
Bom código em Ruby! 💎
Esta publicação faz parte da minha jornada de aprendizado em Ruby e desenvolvimento web. Compartilhe suas ideias e sugestões nos comentários.