Introdução
Neste tutorial, exploraremos o desenvolvimento de aplicações web modernas utilizando F#, um dos linguagens funcionais mais poderosas do mundo .NET. Vamos utilizar duas bibliotecas essenciais: Giraffe, que nos permite construir APIs e aplicações web de forma fácil e eficiente, e Fable, que transforma código F# em JavaScript, permitindo a criação de aplicações front-end. Este guia é ideal para desenvolvedores que desejam entender como essas tecnologias podem interagir para criar aplicações robustas e escaláveis, desde a configuração do ambiente até a implementação de testes unitários e práticas recomendadas de desenvolvimento, garantindo um produto final de qualidade.
Etapas
Configuração do Ambiente de Desenvolvimento
Antes de começarmos, você deve ter o .NET SDK instalado em sua máquina. Verifique se está correto utilizando o comando `dotnet –version`. Instale também o Fable através do comando `dotnet tool install -g fable-compiler` para compilar seu código F#. Se você ainda não tem, siga as instruções nos sites oficiais para instalar o .NET SDK e o Fable.
commands# Verificar a versão do .NET SDK
dotnet --version
# Instalar o Fable
dotnet tool install -g fable-compilerCriação do Projeto
Crie um novo projeto de aplicativo web utilizando o Giraffe. No terminal, use o comando `dotnet new giraffe -n MeuProjetoGiraffe`. Após isso, entre no diretório do projeto com `cd MeuProjetoGiraffe`.
commands# Criar o projeto Giraffe
dotnet new giraffe -n MeuProjetoGiraffe
# Navegar até o diretório do projeto
cd MeuProjetoGiraffeEstrutura do Projeto
O projeto criado conterá diversos arquivos. A estrutura básica incluirá um arquivo Program.fs que definirá a inicialização da aplicação e um arquivo HttpHandlers.fs para lidar com as requisições HTTP. Vamos abrir o arquivo Program.fs para definir o ponto de entrada da nossa aplicação.
Program.fsopen System open Giraffe open Microsoft.AspNetCore.Hosting open Microsoft.Extensions.Hosting module Program = [<EntryPoint>] let main _ = Host.CreateDefaultBuilder() .ConfigureWebHostDefaults(fun webBuilder -> webBuilder.UseStartup<Startup>() ) .Build() .Run() 0
Configurando o Giraffe
Agora, vamos configurar nosso Giraffe para lidar com as requisições. No arquivo HttpHandlers.fs, adicione um handler simples que retornará uma mensagem “Hello World” quando a rotas raiz for acessada.
HttpHandlers.fsmodule HttpHandlers open Giraffe type Model = { Message: string } let helloHandler : HttpHandler = fun (ctx: HttpContext) -> task { return! json { Message = "Hello World" } ctx }
Definindo as Rotas
Agora, vamos definir as rotas da nossa aplicação para que possamos acessar o nosso handler. Atualize o arquivo Startup.fs para incluir as rotas necessárias.
Startup.fsmodule Startup open Giraffe open Microsoft.AspNetCore.Builder open Microsoft.Extensions.DependencyInjection let webApp = choose [ route "" >=> HttpHandlers.helloHandler setStatusCode 404 >=> text "Not Found" ] let configureServices (services: IServiceCollection) = () let configureApp (app: IApplicationBuilder) = app.UseGiraffe webApp
Executando a Aplicação
Para executar a aplicação, use o comando `dotnet run`. A aplicação iniciará e você poderá acessá-la em http://localhost:5000. Teste acessando a URL no seu navegador ou utilizando o cURL.
commands# Executar a aplicação
dotnet run
# Testar a rota no cURL
curl http://localhost:5000Integração com Fable
Para implementar o front-end utilizando Fable, crie uma nova pasta chamada “Client” em seu projeto e dentro dela, inicialize um projeto Fable com `dotnet new fable -n MeuClienteFable`.
commands# Criar a pasta do cliente Fable
mkdir Client
# Inicializar o projeto Fable
cd Client
dotnet new fable -n MeuClienteFableConfigurando o Front-end
No projeto Fable, abra o arquivo App.fs e substitua o conteúdo padrão por um código que faça uma requisição à nossa API e exiba a resposta no navegador. Usaremos a biblioteca Fable.Fetch para facilitar as requisições HTTP.
App.fsmodule App open Fable.Core open Fable.Import open Fable.Fetch let fetchHello () = promise { let! response = Fetch.fetch "http://localhost:5000" let! data = response.text() Browser.console.log(data) }
Teste Unitário
Para garantir que nossa aplicação funciona corretamente, adicione testes unitários. Crie um arquivo HttpHandlersTests.fs para testar o handler `helloHandler` que você implementou anteriormente.
HttpHandlersTests.fsmodule HttpHandlersTests open NUnit.Framework open Giraffe open System open System.Net.Http open Microsoft.AspNetCore.Http [<TestFixture>] module Tests = [<Test>] let ``helloHandler returns Hello World message`` () = // Teste o handler e valide a resposta ...
Executando os Testes
Finalmente, para executar os testes que você implementou, use o comando `dotnet test`. Isso garantirá que sua aplicação e seus handlers estão funcionando conforme esperado.
commands# Executar os testes
dotnet test
Conclusão
Neste tutorial, você aprendeu a desenvolver aplicações web modernas utilizando F# com Giraffe e Fable. Desde a configuração do ambiente até a implementação de handlers, rotas e integração com o front-end, cobrimos o ciclo completo de desenvolvimento. Também abordamos a importância de testes unitários para validar nossa aplicação. Com essas habilidades, você está pronto para explorar mais profundamente a construção de aplicações robustas e interativas na web.