Git Product home page Git Product logo

rinha-frontend's Introduction

Este é o repositório da Rinha de Frontend. Esta é uma brincadeira e um desafio de código inspirada pela "Rinha de Backend", uma iniciativa criada por Francisco Franceschi.

O desafio consiste em montar um sistema Frontend com a stack que você quiser, e estressá-lo de acordo com as especificações abaixo, simplesmente pra ver o que acontece. Quem tirar a melhor performance nos critérios aqui estabelecidos, vence.

O Desafio

Criar uma "JSON Tree Viewer": Um visualizador de JSON que roda sem backend, e que seja capaz de carregar um JSON especificado pelo usuário e exibi-lo.

O sistema deve focar em ser capaz de exibir o maior JSON possível. O "usuário" poderá carregar o arquivo JSON que quiser, e ser capaz de visualizá-lo em forma de árvore conforme o layout: VER O LAYOUT NO FIGMA.

Vamos disponibilizar uma pasta no Drive com os arquivos de testes. Há alguns bem pequenos, outros enormes para a proposta. O layout diz respeito apenas ao output estático, e não versará sobre o comportamento de navegação do JSON que você carregar. Portanto, você é livre pra aplicar o comportamento e técnica que achar melhor para a navegação da sua tree view: paginação, infinite scrolling, lazy loading, vdom, windowing... E é aqui que começa a rinha: sua aplicação deve buscar carregar o maior arquivo possível dessa pasta. Você não precisa cumprir todos os critérios para entregar a sua aplicação. Faça o seu melhor, aprenda e divirta-se.

Boa sorte!

Regras e Especificações

Em linhas simples, o objetivo final da Rinha de Frontend é carregar, de forma correta, o maior número de arquivos JSON possível (dos 9 arquivos disponibilizados por nós aqui nesta pasta). A ideia é começar do mais fácil ao mais complicado. O menor arquivo JSON possui apenas 98 bytes, enquanto o maior arquivo possui 181 megabytes

Colocação Final dos Projetos

No momento em que você submeter seu projeto, você deverá também nos dizer qual foi o maior arquivo que a sua aplicação conseguiu carregar corretamente. Nós vamos fazer o ranking de acordo com os projetos que carregaram os maiores arquivos.

Dessa forma, se apenas 1 projeto conseguiu carregar o maior arquivo (giant.json), esse projeto será o vencedor. Isso irá acontecer sequencialmente até que tenhamos os 10 primeiros colocados rankeados.

Caso, ao final, existam mais de um projeto que conseguiram carregar os mesmos arquivos, vamos então para os critérios de desempate.

Critérios de Desempate

  1. Correctness: Esse é o critério principal: A aplicação deve funcionar. Um JSON deve poder ser carregado e exibido conforme demonstrado no Layout (não necessariamente precisa ser o maior JSON, mas ao menos alguns deles). Além disso, aqui também vamos analisar como sua aplicação se comporta no caso de JSONs inválidos.

  2. Performance: Sua aplicação deve buscar o maior nível de fluidez, quanto mais rápida e robusta, melhor pra você. Aplicações com performance instável (as vezes quebra, as vezes vai, as vezes trava) não terão os pontos desse critério. Vamos testar de forma manual a performance utilizando os mesmos recursos para os diferentes projetos.

  3. Acessibilidade: Sua aplicação deverá ser o mais acessível que você puder (ideal que esteja completamente acessível). Deve ser possível navegar na sua tree view de maneira acessível.

De acordo com esses três itens acima, iremos realizar os desempates até que consigamos as 10 primeiras colocações. Para todas as outras colocações não iremos realizar desempates.

Análise

Para as análises utilizaremos:

  • Performance: Time to Next Interaction (basicamente a velocidade da sua aplicação)
  • Core Web Vitals
  • Lighthouse Results
  • Accessibility Checks
  • Outras métricas a serem consideradas futuramente pela organização

Casos Não Previstos

Caso haja alguma situação imprevista, o time organizador se reserva o direito de decidir, caso a caso os casos não previstos, sem possibilidade de recurso (lembrando que o objetivo principal da rinha é ser um jogo 😄).

Stack

Você tem liberdade para escolher qualquer stack, lib ou framework. Contudo, sua aplicação deve ser totalmente executada no lado do cliente (Client) em termos de arquitetura web, sem depender de processamento server-side.

Além disso, sua aplicação deve ser original e não pode ser uma cópia de outra nem usar libs que solucionem completamente o desafio proposto.

Arquivos de Teste

Download dos arquivos de teste

Sua aplicação deve ser capaz de rodar o máximo possível de arquivos de teste na pasta disponibilizada, carregando 1 por vez. Os arquivos disponíveis são:

  • verysmall.json - 98 bytes
  • alltypes.json - 804 bytes
  • small.json - 1 KB
  • invalid.json - 1 KB
  • nullreference.json - 21 KB
  • pokedex.json - 281 KB
  • startwitharray.json - 1,6 MB
  • large.json - 24,9 MB
  • giant.json - 181 MB

Submeter seu projeto

Siga o passo-a-passo da plataforma para submeter o seu projeto.

  1. Cadastre-se e clique em "Participar".
  2. Faça um fork do repositório base e desenvolva a sua solução nele.
  3. Faça o deploy do seu projeto via Github Pages ou qualquer outro serviço de host de sua escolha.
  4. Submeta o projeto na plataforma respondendo o formulário de submissão.

Pronto! Boa sorte, e que vença o melhor!

Prazo

Aceitaremos submissões até o dia 31/10/2023 às 23:59

Premiação

As 5 melhores soluções serão premiadas com um gift card da Kabum. 1º lugar: R$ 200,00; 2º lugar: R$ 150,00; 3º lugar: R$ 100,00; 4º lugar: R$ 50,00; 5º lugar: R$ 50,00.

Dúvidas, ajuda e sugestões

Para dúvidas, pedidos de ajuda ou sugestões, abra uma ISSUE nesse repositório prefixada por [DÚVIDA], [AJUDA] ou [SUGESTÃO].

rinha-frontend's People

Contributors

felipemuller20 avatar felippe-regazio avatar icaroharry avatar kecbm avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

rinha-frontend's Issues

[DÚVIDA] - Layout Figma

O Layout da Rinha de Front-end precisa seguir exatamente o que está no figma ou é so para ter uma base ? Por exemplo eu posso estilizar das cores ou fontes que eu quiser etc ...

[DÚVIDA] Formato de exibição dos dados

No exemplo do Figma, que usa o arquivo alltypes.json, é possível ver que:

  • Os valores de weight são inteiros (67 e 77);
  • Os valores do array children incluem sobrenomes ("Suri Cruise" e "Indio Falconer Downey", por exemplo).

Contudo, no alltypes.json disponível no Drive, os valores de weight são floats (67.5 e 77.1), e os valores do array children não incluem sobrenomes ("Suri" e "Indio Falconer", por exemplo).

É esperado que tratemos esses valores para que eles sejam exibidos como no exemplo do Figma?

[DÚVIDA] - Collapse dos subníveis

Na descrição do projeto não fica claro se é necessário ou não adicionar collapse pros subíveis de objetos/arrays. Será necessário ou só precisa mostrar tudo abertão mesmo?

[AJUDA] Preciso trocar a URL da minha submissão

Estava trabalhando num repositório privado antes de fazer o fork, que estava sendo feito deploy para a URL json-tree-viewer.pages.dev, mas agora que eu fiz o fork do repositório da rinha e troquei o nome do projeto no CloudFlare, o domínio passou a ser rinha-frontend.pages.dev. Não consegui encontrar nenhuma opção para trocar a URL da submissão no side da Codante.

[DÚVIDA] Construção do README da solução após a submissão

Como os requisitos são amplos e robustos, como acessibilidade e otimização para apresentar o arquivo na tela, eu estou com dúvida se posso montar apenas o README da aplicação após o dia final da submissão da minha solução. Porque assim eu iria alocar o tempo que terei até o dia 31/10 para evoluir a minha solução e após isso apenas construir o README do meu repositório, compartilhando meus aprendizados e como a aplicação funciona. Posso fazer isso?

[COMPORTAMENTO] Escolha do navegador.

Não sou do frontend então, uso o navegador mais para acessar. Meu navegador padrão é o Firefox e tudo funcionou perfeitamente até o large.
Basicamente usei createElement, innerText e appendChild (UL, LI, SPAN, , )
Mesmo com 16G de RAM, o aquivo não abriu no Opera nem no Chromium que informou erro SIGILL (procurando na internet existem diversos casos).

Usei uma configuração mosdesta para testar em uma VirtualBox com Mabox (baseada no manjaro) com 4G da RAM e dois processadores. O Firefox funcionou bem e ainda deixou 1G livre de memória. Nem preciso dizer que os navegadores baseados no Chrome falharam.

Finalmente usei um laptop com Windows e 8G RAM. O Firefox carregou em 6s, funcionou corretamente e ainda deixou 2,2G livres. O Microsoft Edge levou 10s e usou toda a memória. Quando fui expandir/contrair os elementos ele travou. Pelo menos mostrou uma mensagem mais legível (out of memory).

Foram 1.787.115 tags criadas. Alguma forma de obter mais informação sobre o erro?

[SUGESTÃO] Correção do arquivo invalid.json

Codifiquei minha primeira solução para a rinha e estou testando quais arquivos ela é capaz de renderizar. Ao submeter o arquivo invalid.json para renderização apareceu esse erro:

Erro - rinha

Fui verificar a estrutura do arquivo e faltava a chave de fechamento "}" no final do arquivo. Após adicionar essa chave no arquivo e salvar a alteração a renderização rodou corretamente. Alô @icaroharry e @felippe-regazio, estou pronta pra abrir esse PR e ter minha fotinha ali no repositório como contribuidora em. Uma chave abre muitas portas 😁

[DÚVIDA] Histórico de desenvolvimento

Participar da rinha é um desafio enorme para mim pois todos os temas abordados são novos, estarei aprendendo em tempo de desenvolvimento. Sendo assim queria manter na aplicação final todas as soluções que irei desenvolver até o dia 31, eu posso fazer isso? A minha ideia era manter a versão final para ser avaliada na página home da aplicação e as demais em outras páginas com botões navegáveis para cada uma delas. Porém fico com dúvida sobre manter todo esse código, pois acho que afetaria na hora de analise da entrega final de alguma forma, como por exemplo na acessibilidade. Ou é melhor fazer essa documentação de etapas de uma outra forma, como por exemplo utilizando branchs exclusivas para cada uma delas e fazendo o deploy apenas da branch com a versão final do código?

[DÚVIDA] - Extratégias de carregamento

De certo modo consegui carregar quase todos, exceto o giant.json 😅. Estou em dúvidas sobre as estratégias de carregamento. Hoje eu inicio o objeto fechado, ou seja com todos os filhos fechados e vou abrindo conforme necessário. Mas atualmente quando eu envio o json no campo eu alimento o estado com a totalidade do json, até aí ok, aparentemente, mas quando expande os dados aí ele trava. Enfim. O que fazer?

Estou usando React, TS com Vite e tailwind.

Ja fiz o deploy nester link

https://rinha-frontend-filipeleonelbatista.vercel.app/

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.