Frameworks de servidor HTTP para Dart | Código Fonte
Frameworks de servidor HTTP para Dart
Carlos L. A. da Silva 6 de janeiro de 2020
Dart surgiu em 2011, desenvolvida pelo Google e chamada originalmente de Dash. Em sua concepção inicial, a linguagem de script seria um substituto do JavaScript em navegadores, mas seu uso evoluiu para muito além disso. Em agosto de 2018 foi lançado o Dart 2.0, um reinício oficial da linguagem, desta vez otimizada para o desenvolvimento client-side para Web e dispositivos móveis.
Na prática, Dart representa um sonho antigo dos desenvolvedores: com um único código é possível criar App, Site e Software. O Brasil é um dos países que vem adotando o Dart em larga escala e o serviço financeiro Nubank é um dos casos de sucesso da linguagem por aqui.
Suragch é um desenvolvedor norte-americano em Flutter e Dart com ampla experiência em plataformas Android e iOS. Em um extenso artigo publicado no seu Medium, ele explana sobre quatro frameworks de servidor HTTP para Dart e como montar um backend baseado na linguagem.
"Se não fosse por Flutter, eu nem consideraria o Dart no servidor. Mas a mesma coisa que me fez escolher Flutter, agora me leva a construir o backend com o Dart.
Eu abracei ansiosamente o Flutter porque estava frustrado com o tempo que levava para criar dois aplicativos separados para Android e iOS. Como é maravilhoso ter apenas uma base de código para ambos! E agora podemos ter o mesmo aplicativo Flutter escrito no Dart para trabalhar no desktop e na web. Por que eu não iria querer estender isso para o servidor backend?
Não é exatamente como se fosse possível compartilhar o código, afinal, o backend e o front-end têm tarefas diferentes. É mais que eu posso compartilhar a própria linguagem. Com o desenvolvimento móvel, eu estava sempre alternando entre Java e Swift e passando por Kotlin e Objective-C. Adicionar o backend significava adicionar mais uma linguagem, algumas das estruturas mais populares que requerem JavaScript, Python, Go, Ruby ou PHP.
Eu sei que há uma vantagem em ser poliglota, e as linguagens de programação são muito mais rápidas de aprender do que as linguagens humanas, mas ainda assim leva tempo. Não quero pensar em como escrever a sintaxe quando estiver tentando implementar um recurso. Eu só quero escrever sem esforço. Isso não acontece quando estou tendo que mudar de idioma constantemente e aprender novos. Se eu pudesse usar o Dart ao escrever aplicativos Android e o Dart ao escrever aplicativos iOS e Dart no navegador e Dart no desktop… e Dart no servidor, eu seria realmente um desenvolvedor muito feliz.
Por isso escolhi o Dart.
Caso você não saiba, o Dart não é realmente muito popular como idioma de backend do servidor. Ainda. Mas espero que o Flutter apenas aumente em popularidade e, com isso, acho que outras pessoas como eu verão a atratividade de estender o conceito de uma linguagem só para o backend.
A questão agora é escolher o framework a ser usado no Dart. Obviamente, você pode escrever tudo sozinho usando as bibliotecas dart: io e dart: html ou o pacote http, mas existem muitas tarefas comuns (como autenticação, validação e gerenciamento de banco de dados) que já foram resolvidas em outros lugares. Usar um framework para essas tarefas economizará muito trabalho desnecessário.
Meus principais critérios para escolher um framework são popularidade, confiabilidade e usabilidade.
Popularidade: quanto mais popular é um framework, maior a probabilidade de ele ser mantido e maior a probabilidade de encontrar outras pessoas para me ajudar com minhas perguntas.
Confiabilidade: não quero perder tempo aprendendo um framework se os desenvolvedores deixarem de mantê-lo. Existem vários frameworks de servidor Dart que eram populares há alguns anos (como Redstone), mas que não estão mais sendo mantidos hoje.
Usabilidade: com isso, quero dizer principalmente boa documentação, bons exemplos e bons lugares para encontrar respostas para minhas perguntas.
Obviamente, seria bom também ter um bom desempenho, mas neste momento deixarei os testes de benchmark para outra pessoa e assumirei que todos tem a mesma performance.
Revisei vários frameworks de servidor Dart e saí com quatro que ainda estão sendo mantidos e populares o suficiente para serem considerados. Vou apresentá-los abaixo em ordem de popularidade (com base nas estrelas do GitHub).
Imagino que algum dia os desenvolvedores desses frameworks possam ler este artigo, por isso também incluirei alguns conselhos não solicitados no final de cada seção. Pegue ou largue, mas fique à vontade para comentar abaixo.
1) Aqueduct
GitHub | Pub | Website
O Aqueduct é um framework HTTP extensível para a criação de APIs REST por cima da VM Dart. Ele inclui um ORM do tipo estaticamente, provedor OAuth 2.0, bibliotecas de teste automatizadas e integração OpenAPI 3.0.
Estrelas do GitHub: 1408
Popularidade do pub: 93
Perguntas no Stack Overflow: 82
Baseado nas estrelas do GitHub, esse é de longe o framework mais popular dos quatro que estou analisando.
Aqueduct é um produto da Stable Kernel, uma empresa sediada em Atlanta, Geórgia. Com base em sua página Sobre, parece que eles têm uma equipe de bom tamanho. Isso me faz acreditar que o Aqueduct deve ter suporte de forma confiável no futuro.
Olhando para a lista de colaboradores do GitHub, o CEO da empresa, Joe Conway, parece estar fazendo quase todo o desenvolvimento do Aqueduct ele mesmo (supondo que ele provavelmente fosse o usuário stablekernal-admin antes de 2017):
Ele também é a pessoa principal que responde às perguntas relacionadas ao Aqueduct no Stack Overflow e Slack. Depois de fazer algumas perguntas, ele é muito prestativo, mas o ideal é que a confiabilidade da estrutura não se baseie em apenas uma pessoa.
A documentação de Aqueduct é muito completa. Ela vem completa com explicações, tutoriais, guias e exemplos. Na maioria das outras dúvidas que tive, consegui responder no Stack Overflow e Slack.
Da minha perspectiva, Aqueduct parece ser construído como um todo unificado. Quando você o escolhe, recebe a coisa toda. Por exemplo, o ORM do Aqueduct está fortemente vinculado ao PostgreSQL. Isso provavelmente facilita o uso, mas também estou atraído pelo que parece ser a abordagem mais modular no framework do Angel (veja abaixo).
Sugestão para os desenvolvedores
Joe Conway, com suas responsabilidades como CEO, mantendo o Aqueduct e respondendo a perguntas sobre Stack Overflow e Slack, eu odiaria ver você se consumir. Uma opção poderia ser delegar a tarefa para alguns funcionários da empresa assumirem parte do desenvolvimento e da carga de perguntas.
Nas palavras do desenvolvedor, Angel é:
Um framework de backend polido e pront0 para produção no Dart.
Com recursos como hot reloading 🔥, GraphQL e ORM, o Angel é o backend Dart perfeito para aplicativos de produção poderosos. O Angel também fornece suporte para modelagem no servidor, WebSockets, autenticação e muito, muito mais.
Com mais de três dúzias de pacotes de extensão e crescendo, e a flexibilidade de adicionar funcionalidades facilmente, o Angel possui todas as ferramentas necessárias para criar um aplicativo de qualquer tamanho. O Angel foi desenvolvido com a extensibilidade em mente. Portanto, mesmo quando você precisar de um recurso que não é oficialmente suportado, poderá implementá-lo facilmente você mesmo.
Estrelas do GitHub: 705
Popularidade do pub: 87
Perguntas no Stack Overflow: poucos
Este é um segundo lugar forte para a popularidade, embora não pareça haver muita atividade no Stack Overflow. A popularidade e a manutenção são fortes no Pub, o que é bom de ver.
O desenvolvedor, Tobe Osakwe, é um estudante universitário da Florida State University. Este é um projeto paralelo bastante impressionante para um estudante universitário.
Embora mantenha o desenvolvimento estável e ativo, Tobe é o único colaborador principal do repositório do GitHub:
Não há nenhuma indicação de que Tobe vai parar de manter esse framework, mas depois que ele se formar na universidade, conseguir emprego fará com que seu framework seja deixado de lado?
A documentação é bem feita. Existem muitas explicações, guias, exemplos e até tutoriais do YouTube (falados em inglês claro e fácil de seguir).
Embora não exista muita ajuda no Stack Overflow ou no fórum do site, há muita atividade na comunidade Gitter.
Mesmo que você acabe não usando esse framework, você definitivamente deve ler o artigo do blog de Tobe Deploying Dart Apps to Linux para quando estiver pronto para colocar seu servidor on-line. Ele fala sobre como proteger seu aplicativo Dart atrás de um proxy NGINX.
Estou impressionado com o seu trabalho e o framework Angel, Tobe Osakwe. Eu posso ver que ele tem o potencial de se tornar o servidor Dart mais popularmente usado. A única coisa que me faz hesitar é a questão da estabilidade: você (ou outros) ainda o manterá em cinco anos? Se você puder descobrir uma maneira de transformá-lo em uma startup lucrativa ou envolver a comunidade no processo de desenvolvimento, isso ajudaria bastante as pessoas a garantirem que vale a pena investir tempo para aprender o framework. Além disso, largar os emojis espalhados pelo site oficial faria com que parecesse mais profissional (mas essa é apenas a minha opinião).
3) Jaguar
Nas palavras do wiki do Github:
Jaguar é um framework de servidor HTTP pronto para produção que é rápido, simples e extensível, com baterias incluídas.
Estrelas do GitHub: 204
Popularidade do pub: 82
Perguntas no Stack Overflow: algumas
Esse framework possui dois autores: Ravi Teja Gudapati e Kevin Segaud. A maior parte do trabalho de desenvolvimento recente foi realizada por Ravi, que está em Estocolmo.
Parece ser um projeto paralelo pessoal, já que o desenvolvedor diz que trabalha para a ABB. O desenvolvimento em si parece ser estável (embora não muito no segundo semestre de 2019).
A documentação é bastante mínima, consistindo em alguns vídeos, na API do Pub e em alguns exemplos no GitHub.
Há pouca coisa acontecendo no Stack Overflow, mas a comunidade Gitter está ativa e parece ser um bom lugar para responder às suas perguntas.
Uma coisa que eu gosto nesse framework é como a biblioteca é modular. Eu a encontrei pela primeira vez quando estava procurando uma biblioteca JWT e encontrei o jaguar_jwt. Portanto, mesmo se você não usar todo o framework da Web, poderá usar partes menores sem depender de todo o resto.
Provavelmente, o principal é melhorar a documentação. Seria bom ver mais guias e tutoriais. Além disso, se você estiver respondendo às mesmas perguntas repetidamente no Gitter, considere respondê-las no Stack Overflow para que sejam pesquisáveis.
Dart Team (Shelf e outras coisas)
A equipe do Dart fez bastante coisas com as quais você pode montar servidores. De fato, os três frameworks que vimos acima são todos escritos com o código Dart de nível baixo.
Você não precisa usar um framework. Você pode criar seu próprio servidor usando apenas as bibliotecas padrão do Dart. Confira os seguintes links para começar:
Servers with Dart
Existe um pacote da equipe do Dart chamado http_server, mas ele não é popular ou está bem documentado, portanto não o abordarei aqui. Vou cobrir o framework Shelf, no entanto.
4) Shelf
A página do GitHub chama o Shelf de middleware de servidor da Web para o Dart. A descrição diz:
O Shelf facilita a criação e composição de servidores da Web e partes de servidores da Web. Como?
– Expõe um pequeno conjunto de tipos simples.
– Mapeia a lógica do servidor em uma função simples: um único argumento para a solicitação, a resposta é o valor de retorno.
– Mistura trivial e combina processamento síncrono e assíncrono.
– Flexibilidade para retornar uma sequência simples ou um fluxo de bytes com o mesmo modelo.
Estrelas do GitHub: 172
Popularidade do pub: 97
Perguntas no Stack Overflow: 22
Embora a pontuação do GitHub seja a mais baixa dos frameworks que analisei, a popularidade do Pub é a mais alta. Não está claro o que isso significa.
Esse framework é um pacote da equipe do Dart, por isso ganha o prêmio de maior probabilidade de manutenção. Foi escrito principalmente por Kevin Moore e Natalie Weizenbaum, do Google, com Kevin o único atualmente mantendo.
Ao contrário do que normalmente vemos com Flutter e Dart, a documentação é bastante esparsa aqui. Parece que você pode obter ajuda no Stack Overflow, mas não vejo outras fontes óbvias de ajuda.
Como é chamado de "middleware", não está claro para mim se posso usá-lo como um servidor de backend completo ou se preciso combiná-lo com outros pacotes. Acho que seriam as bibliotecas de comunicação HTTP padrão e talvez o pacote http_server, mas as orientações não são claras.
Ouvi pela primeira vez sobre o Shelf quando estava criando um pacote de biblioteca. Foi apresentado como um exemplo de modelo de como um pacote Pub deve organizar seus arquivos.
Tenho a ideia de que o Shelf é um tesouro escondido, mas a documentação não está favorecendo nada.
Dê à Shelf a mesma documentação que o restante de Dart e Flutter recebeu. Até que isso aconteça, não é provável que seja amplamente adotado. Além disso, atualize o laboratório geral de códigos do servidor para ser compatível com o Dart 2.
Eu já havia feito algum desenvolvimento exploratório com o Aqueduct, mas não queria ir mais longe se houvesse melhores opções. Saindo desta análise, sinto-me confiante em continuar usando o Aqueduct. No entanto, se você escolher Angel ou Shelf, acho que não vai dar errado. Estou começando a duvidar da Jaguar. (Em meses desde que escrevi o artigo original, a popularidade do Aqueduct e do Angel aumentou visivelmente em relação às estrelas do GitHub, Jaguar e Shelf, nem tanto.)
Se você deseja maximizar seu aprendizado, sugiro que você comece a construir um servidor básico, trabalhando com a documentação do Dart do lado do servidor da equipe do Dart e, em seguida, seguindo para um dos frameworks maiores. Também iniciei uma série de tutoriais em vídeo sobre o Aqueduct, que você pode encontrar aqui."
Publicado originalmente como "HTTP server frameworks for Dart" em 2 de maio de 2019 e revisado em dezembro de 2019. Traduzido e republicado com autorização do autor.