Frontend Projeto X

Definições

Objetivo

Avaliar tecnicamente os aspectos relativos ao frontend, como bibliotecas, documentação, typagem e usar ou não usar UI frameworks

Será React

Fonte: https://www.npmtrends.com/angular-vs-react-vs-vue

Será React

Fonte: https://insights.stackoverflow.com/survey/2018/#technology

Mas primeiro...

O que vamos usar?

Elencamos os seguintes itens:

  • AppBar/Header
  • AutoComplete
  • Avatar
  • Badge
  • Button
  • Icon Button
  • Carousel/Gallery
  • Checkbox
  • Chip
  • DatePicker
  • Dialog
  • Divider
  • Dropdown/Select
  • Dropdown Menu
  • Floating Action Button
  • Icon
  • List
  • ListItem
  • Paper
  • Progress
  • Sidebar/Drawer
  • Tabs
  • TextArea
  • TextField/Input
  • Tooltip
  • Tree
  • Typography

E agora, para a análise!

Usar ou não usar um UI Framework?

O que é um UI framework?

Um UI framework é uma biblioteca de componentes para interface de usuário (ex.: botões e caixas de texto) que podem ser utilizados em conjunto para construir a camada visual da aplicação.

  • Mais de 50 componentes
  • Documentação completa
  • Exemplos
  • Guideline própria
  • Possui uma versão pro com foco empresarial
  • Suporte a TypeScript e temas
  • i18n já configurado
  • Segundo mais popular no mundo
  • Visualmente simples
  • Mais de 50 componentes
  • Suporte a TypeScript e acessibilidade
  • Diferenciais:
    • Editable Text
    • Panel Stack
    • Hotkeys
    • Omnibar
    • MultiSelect
    • Date Range Picker
  • Mais de 50 componentes
  • Da IBM
  • Documentação não muito completa
  • Pouca customização
  • Carece de componentes a serem utilizados no Projeto X
  • Cerca de 50 componentes
  • Implementa o visual da  Microsoft
  • Documentação completa
  • Implementação verbosa
  • Diferenciais:
    • Rating
    • Facepile
    • GroupedList
    • Hovercard
    • Teaching Bubble
  • 70+ componentes
  • Documentação completa, incluindo materiais para designers
  • Suporte a SSR, temas e acessibilidade
  • Guideline própria
  • Compon. responsivos
  • Diferenciais:
    • Markdown, LoginForm, Accordion, AnnotatedMeter, Chart, Meter, SunBurst, WorldMap, Pulse
  • 90+ componentes
  • Documentação completa com paleta de cores, ícones e temas
  • Suporte a SSR, temas, TypeScript e Flow definition
  • O framework mais popular
  • Material Design
  • Diferenciais:
    • Cards, GridList, Expansion Panels, Snackbar, Bottom Navigation, Floating Action Button, Stepper
  • Mais de 50 componentes
  • Documentação completa
  • Suporte a temas e navegação via teclado
  • API declarativa
  • Diferenciais:
    • Flag, Vários tipos de Input, Label, Loader, Reveal, For, Grid, Advertisement, Card, Comment, Feed, Embed, Rating, Transition

Suporte a componentes

Avaliando a implementação dos itens que iremos necessitar, obtivemos a seguinte tabela:

UI Framework Sim Não
Material-UI 24 3
Ant Design 23 4
Fabric 21 6
Groomet 21 6
Semantic-UI 20 7
Blueprint 19 8
Carbon 13 14

Material-UI

Ant Design

Semantic-UI

Mas e se nós construíssemos nosso próprio framework?

Mão na massa

Antes da avaliação dos frameworks, foi realizado a construção dos componentes presentes no protótipo.

  • 19 componentes
  • 16 horas de desenvolvimento
  • Bibliotecas utilizadas:
    • Styled Components
  • Componentes de acordo com nossas necessidades ao invés de depender das possibilidades do framework escolhido
  • Teríamos de fazer a documentação, testes, definir palheta de cores, guideline e a identidade visual (que seria originalmente nossa)

Poxa meu consagrado, cê falou, falou, mas e aí... ?

 

  • Agilidade no desenvolvimento
  • Possibilidade de customizar os componentes
  • Quanto menos customização, mais facilidade na manutenção
  • Documentação pronta
  • Alguém já se encarregou dos testes
  • Manutenção e feedback da comunidade
  • Always updated
  • Não reinventamos a roda

Vantagens de um framework pronto

 

  • Nós nos adaptamos às possibilidades do framework
  • Pode ter uma implementação muito mais verbosa do que o ideal
  • "Não originalidade" na identidade visual da aplicação
  • Por ser algo "genérico", pode demandar muita customização
  • Quanto mais customização necessária, mais difícil a manutenção

Desvantagens

Documentação

Docz vs Storybook

Como teremos uma identidade visual própria, há a necessidade de documentação desses componentes que serão criados, e hoje, vemos duas principais libs em cena, o Storybook e o Docz.

O Storybook é uma lib que tem o foco em ser um ambiente de desenvolvimento para UI components e testes, podendo ser configurada para dar log nos event handlers como onClick e onChange.

Já o Docz é uma lib criado por um brasileiro que vem com a proposta de realizar documentações com ZERO configuração. Ela é uma lib que utiliza MDX para exibir os componentes em meio a um markdown.

Para essa análise utilizei o Storybook na versão 3.4.10 e o Docz na 0.10.2.

Docz vs Storybook

Configurando os dois projetos, consegui as seguintes telas:

Storybook

Docz vs Storybook

Escolha

Dentre as duas libs, optei pelo Docz que disponibiliza uma documentação completa e interativa de fácil configuração, basta ter um arquivo .mdx com a configuração que você deseja ela já será adicionada ao menu lateral.

Você também pode interagir com os componentes listados.

 

Obs: Há a possibilidade de termos as duas libs configuradas no projeto, mas como é possível fazer a mesma coisa com as duas libs, não vejo sentido em fazer duas vezes a mesma coisa.

Typechecker

Tipagem estática

Com a tipagem estática, temos o benefício de pegar erros em tempo de compilação ao invés de runtime, melhorando a leitura e auxiliando na refatoração do código, além de trazer sugestões mais precisas na IDE.

 

Algumas situações em que é recomendado a utilização de tipagem estática é quando:

  • Seu projeto é grande e complexo
  • Um time grande será responsável pelas atividades
  • Você pode querer refatorar o programa a longo prazo
  • Seu time é familiarizado com linguagens de tipagem estática

TypeScript vs Flow

O Flow é um typechecker criado pelo Facebook para JavaScript, podendo realizar inferência de tipos através de análise de código, assim você não precisa tipar tudo (mas quanto mais, melhor) e tem a promessa de fácil integração com feedback em tempo real.

 

Já o TypeScript é um superset do JavaScript que compila pra JavaScript puro e foi criado pela Microsoft. Se você utiliza o VsCode, ele já vem configurado para dar suporte a TypeScript.

TypeScript vs Flow

Após ler os artigos abaixo e trocar uma ideia com o Sibelius e o Marcelo...

  • Flow vs TypeScript — My two cents
  • Comparing Flow with TypeScript
  • Strict Types: Typescript, Flow, Javascript — to be or not to be?

 

...cheguei as seguintes conclusões:

TypeScript

Prós

  • Comunidade maior: Por ser mais antigo que o Flow, sua comunidade é maior e possui mais definições
  • Suporte do VS code é aparentemente melhor que o do Flow

Contras

  • Mais verboso

Flow

Prós

  • Fácil integração e refatoração automática — Por ser baseado no Babel, ele se integra com várias ferramentas e caso precise, é possível utilizar uma ferramenta de refatoração automática como o react-codemod por exemplo

Contras

  • “Move fast and breaks things” — É comum que de uma versão pra outra tenha grandes mudanças
  • Funcionalidades não documentadas — Nem todos os tipos são documentados
  • Nem sempre as mensagens de erro são claras — Dentro do erro exibido na IDE, o Flow adiciona placeholders como [1] [2], isso é meio confuso as vezes

Nosso campeão:

TypeScript

 

Por possuir uma comunidade maior e mais antiga, possui muitas definições de tipos feitas e com a versão TS3, ele se tornou tão bom quanto o Flow para tipagem de React.

GraphQL Client

Relay vs

Relay

  • Curva de aprendizado é maior
  • Requer schema próprio
  • Declarativa
  • Um parto pra configurar
  • Estrutura fixa
  • Armazenamento local via store
  • Mais performático
  • Relay + Typescript = Ops!
  • Curva de aprendizado é menor
  • Community driven
  • Funciona com qualquer schema
  • Documentação completa
  • Estrutura flexível
  • Incrementalmente adotável
  • Armazenamento local via Cache
  • Apollo + Typescript =

And the oscar goes to...

Com isso, escolhemos...

  • UI Framework
    • Se tiver tempo: Fazer do zero
    • Se não houver tempo: Utilizar um framework
  • Docz
  • TypeScript
  • Apollo

Estrutura do projeto

Estrutura do projeto

/src - Agrupador da estrutura do produto

    /apollo - Queries, mutations e definições do client GraphQL

    /assets - Imagens, template HTML e arquivos scss

    /components - Nossos componentes React (a carinha bonita)

    /containers - Faz a ligação entre componentes e o Apollo

    App.tsx - Arquivo de entrada

tsconfig.json - Configurações do TypeScript

tslint.json - Configurações de Lint do TypeScript

package.json - Definições do projeto

webpack.config.js - Configurações do webpack

Libs (até o momento)

  • apollo-boost
  • babel-core
  • date-fns
  • graphql
  • i18n
  • node-sass
  • ramda
  • react
  • react-apollo
  • react-router-dom
  • tslint
  • typescript
  • webpack

Projeto X - Frontend definitions

By Larissa Thaís de Farias

Projeto X - Frontend definitions

  • 891