A primeira pergunta que todos devem fazer quando lêem o título deste artigo provavelmente será: Porque fazer um backend baseado em dart?
A resposta acredito que não seja tão simples, nesse caso vou contar o porquê resolvi pesquisar mais sobre esse tema.
Dart é um linguagem de programação desenvolvida pela Google para substituir o javascript que teve uma adoção inicial muita baixa e estava quase morta. Porém o lançamento do Flutter deu uma revitalizada ao Dart e hoje tem um hype muito grande com relação a linguagem e o framework em si.
O Flutter é um framework criado inicialmente para aplicações mobile iOS e Android, que tinha como seu principal diferencial manter apenas um código base e compilar para ambas as plataformas. No Google I/O de 2019 a Google lançou sua versão web integrada ao framework do Flutter elevando-o como um framework multiplataforma.
Como Flutter praticamente virou a palavra do momento no mundo da tecnologia, principalmente no que tange ao desenvolvimento multiplaforma, resolvemos já nos preparar para essa nova demanda e no mês de fevereiro iniciamos um treinamento de Flutter na redspark através do programa Universidade redspark, um programa de capacitação e troca de conhecimento promovido pela empresa e seus colaboradores.
E baseado nesse estudo inicial da linguagem e do framework, resolvi entender também o que levaria o nossos clientes a desenvolverem seus produtos usando Flutter. Nessa pesquisa ficou evidente que o principal motivo que faz a adoção de uma plataforma hibrida, principalmente o React Native, é o custo inicial para produção de um produto para ambas as plataformas e depois a necessidade de ter uma equipe mais homogênea trabalhando com uma única linguagem de programação.
No caso do Flutter já podemos escrever as aplicações mobile, web e desktop com apenas uma linguagem, o Dart, que resolve a questão inicial do custo de desenvolvimento, mas para ter todo um stack de desenvolvimento baseado em Dart ainda precisamos trabalhar com o Backend.
Focando em ter uma única linguagem iniciei minhas pesquisas com relação ao desenvolvimento do backend da aplicação e assim termos uma equipe focada em uma única linguagem, com essa premissa, encontrei algumas soluções de frameworks para realização deste trabalho que atendem bem essa necessidade.
Hoje temos dois frameworks que possuem uma comunidade e desenvolvimento ativo o Aqueduct – https://aqueduct.io/ e o Angel – https://angel-dart.dev/.
Analisando ambos os frameworks o Angel parece uma solução mais robusta, trabalhando de maneira modular com diversos módulos já desenvolvidos para auxiliar no desenvolvimento, porém com uma comunidade ainda muito fraca o que dificulta a adoção em um produto.
Já o Aqueduct me parece mais simples porém contém todo o necessário para trabalhar com o backend, contando como uma comunidade mais ativa para dar suporte a longo prazo à plataforma.
Com base nisso resolvi iniciar um projeto bem simples utilizando o Aqueduct para criar os serviços mais básicos para o treinamento. A ídeia nesse artigo será configurar o ambiente de desenvolvimento e criar um serviço, ainda com dados mockados, para teste.
Para iniciar com o projeto precisamos instalar o Dart.
No mac isso pode ser feito através do brew.
$ brew tap dart-lang/dart
$ brew install dart
Caso você esteja utilizando outro sistema operacional poderá consultar o site do Dart para prosseguir com a instalação em https://dart.dev/get-dart.
Após instalação do dart basta ativar o Aqueduct com o comando:
$ pub global activate aqueduct
Após ativado basta usar o cli do Aqueduct para iniciar um novo projeto, lembrando que o nome do projeto deverá estar em snake_case (Todas as letras minúsculas separadas por underline).
$ aqueduct create flutter_course_server
Caso não reconheça o comando aqueduct, será necessário adiciona-lo no path do sistema.
$ export PATH="$PATH":"$HOME/.pub-cache/bin"
Abra a pasta do projeto na sua IDE, nesse caso estou usando o Intellij, e instale o plugin do Dart.
Após instalar o plugin reinicie a IDE.
No Intellij abra as configurações -> Language & Frameworks -> Dart e habilite o suporte ao Dart para o projeto.
Adicione o path do sdk do Dart, conforme imagem.
Caso tenha instalado a partir do brew, basta colocar o seguinte comando para descobrir a pasta de instalação:
$ brew --prefix
E substituir no seguinte endereço: HOMEBREW_INSTALL/opt/dart/libexec, sendo HOMEBREW_INSTALL o resultado do comando anterior.
Ao final habilite o modulo dart.
Agora basta baixar as dependencias do projeto clicando em ‘Get Dependencies’ no Intellij ou através do seguinte comando na raiz do projeto:
$ pub get
Agora que nosso projeto esta configurado, vamos criar nosso primeiro endpoint do curso.
Para esse endpoint vamos criar um mock para devolver para nosso frontend uma lista de ranking para nossa aplicação de blackjack.
Dentro da pasta lib vamos criar um novo arquivo chamado ranking_controller e adicionar o seguinte código.
import 'package:aqueduct/aqueduct.dart';
class RankingController extends Controller {
final _ranking = [
{'id': 1, 'name': 'Marcus', 'points': 123},
{'id': 2, 'name': 'Fabio', 'points': 537},
{'id': 3, 'name': 'Renato', 'points': 348},
{'id': 4, 'name': 'Vinicius', 'points': 854},
{'id': 5, 'name': 'André', 'points': 637},
];
@override
Future<RequestOrResponse> handle(Request request) async {
return Response.ok(_ranking);
}
}
Nessa classe estamos apenas criando um controller que quando for chamado deverá devolver a lista de ranking que criamos em _ranking.
Agora que já temos nossos dados mockados precisamos registar esse controller a uma rota específica que deverá ser chamada pelo frontend.
Para isso vamos até o arquivo channel.dart e vamos importar o arquivo que acabamos de criar.
import 'ranking_controller.dart';
E dentro da função `entryPoint` vamos adicionar o seguinte código.
router
.route('/ranking')
.link(() => RankingController());
Nesse caso estamos registrando uma nova rota, que ao ser chamada irá executar nosso código.
Como resultado final você deverá ter sua função desta maneira.
Agora que colocamos nosso código base, basta subir nosso servidor.
Na pasta do projeto execute o comando:
$ aqueduct serve
Agora só testar nosso primeiro serviço rodando.
Abra o postman e teste o endpoint localhost:8888/ranking.
Como podemos ver, podemos trabalhar com o Dart também para nosso backend de uma maneira muito simples.
Nos próximos artigos vamos trabalhar com mais conceitos e entender melhor todos os arquivos criados com o Aqueduct e fazer a implementação do serviço de Login com o sistema de autenticação que usaremos no nosso treinamento de Flutter.
Links para referência:
Aqueduct Framework – https://aqueduct.io/
Angel Framework – https://angel-dart.dev/
Instalação Dart – https://dart.dev/get-dart
Como iniciar projeto com Aqueduct – http://aqueduct.io/docs/tut/getting-started/
Artigo sobre como trabalhar com o aqueduct – https://medium.com/flutter-community/dart-aqueduct-server-for-your-flutter-app-part-1-getting-started-547e098196d1
Artigo que compara os diferentes framworks para desenvolvimento do backend em dart – https://medium.com/flutter-community/web-server-frameworks-for-dart-197a073299eb