Storybook
Configuração
Foi bem facil configurar ele para rodar com o projeto template do svelte.
Com riot não foi possível utilizar ele, pelo que identifiquei, ele só funciona com a versão 3 do riot. Ele fica pedindo os compiladores e outros pacotes que foram originalmente feitos para o riot 3.
Ainda testando com riot, parece que ele tem problemas em executar quando o projeto está com webpack 5, quando mudei para o rollup o projeto, o erro não aparecia mais. Como o projeto svelte estava com rollup foi tranquilo.
Nos pontos abaixo foi utilizado a configuração svelte + rollup.
Configurar svelte com scss deu trabalho, mas deu certo. - tive de mudar o webpack4 p/ webpack5 - corrigir um bug que aparece no svelte quando adiciona essa webpack 5 - e também que adicionar o plugin de scss deles - https://github.com/storybookjs/presets/issues/220
Configurar svelte com jest também deu trabalho, o bug estava na versão do node, ao atualizar para o 14 tudo funcionou normalmente. - em resumo o problema surgiu ao tentar colocar o jest processar typescript dentro dos componentes, com o preprocessor - o curioso é que o transformador do svelte utilizado e demais libs, aceitavam nodejs v12
considerações iniciais
A documentação é boa, mas tem inconsistência e falta algumas coisas estarem documentadas na página oficial. Antes de iniciar essa leitura que trata de coisas que vão além da documentação, indico que seja lido: - o tutorial inicial - o get started - uma rápida olhada em tudo das docs - E mantenha em mente que boa parte da documentação está no repo do addon em si, e no github deles - https://github.com/storybookjs/storybook/blob/next/MIGRATION.md - https://github.com/storybookjs/storybook/tree/next/addons/docs
Tipos de arquivos p/ descrever stories
- Tem 3 formas de escrever uma story, com js, svelte ou mdx. Mdx é melhor para o addon de documentação, mas a notação é confusa, mistura jsx e markdown. Não sei qual usar. Usar todas pode aumentar o tempo para aprendizado.
- MDX requer mais código boilerplate para gerar o mesmo que um js ou svelte geraria sozinho
- A notação de svelte para decorator é bem mais intuitiva
- Podemos substituir um md por uma página mdx, sem stories.
- Vendo os adons dá p/ ver que o storybook foi pensado primeiramente para react, tem suporte para muitos outros frameworks mas o svelte é um q é mantido pela comunidade, então tem a maioria das features, mas não todas, o formato não está tão bem consolidade como o do react, mas considerando a crescente do svelte é seguro.
Pontos negativos
recursos do svelte nas diferentes notações
- até o momento só achei como usar slots usando a notação de svelte
- se não for com notação svelte tem que fazer um wrapper
- https://github.com/storybookjs/storybook/blob/main/examples/svelte-kitchen-sink/src/stories/views/ButtonView.svelte
recursos do storybook nas diferentes notações
- Utilizando svelte, não consigo fazer composição de args
- https://storybook.js.org/docs/svelte/writing-stories/args#args-composition
[addon] docs
- Quanto utilizado o "args" e templates, se não declarado os controles ele consegue pegar sozinho, porém ele não indica qual seria o atributo padrão quando o props já tem um valor inicial nos controles, mas na doc mostra. Se sempre for declarado tudo, isso não é um problema.
- Se utilizado slots, a documentação indica que existe um slot, mas o código auto gerado não mostra os slots
- Alguns recursos do svelte não são auto documentados, como por exemplo, exportar funções, eventos disparados pelo modificador de reatividade, tipagem mais complexas, tipagem da função.
- o curioso disso é que a lib que o storybook usa 'sveltedoc-parser' consegue dar parser de algumas tipagens mais complexas
- deveria mostrar assim: https://next--storybookjs.netlify.app/official-storybook/?path=/docs/docs-argrow--complex-object
- o curioso disso é que a lib que o storybook usa 'sveltedoc-parser' consegue dar parser de algumas tipagens mais complexas
- Quando colocado TS é necessário adicionar preprocessors, assim como p/ scss, entretanto para que o TS não cague o doc tem ser utilizado da forma correta (que não está nada documentado), mas mesmo adicionado da forma correta, ele ainda não infere os tipos direto do typescript, tem q ser do docstring
- https://github.com/storybookjs/storybook/issues/16609
- https://github.com/storybookjs/storybook/issues/13902
- https://github.com/storybookjs/storybook/issues/12754#issuecomment-779652299
- o esquema é declarar duas vezes, tanto no TS no compoente quando na story ou docstring
- acho que esse é um problema da lib 'sveltedoc-parser' que o svelte usa para analisar estaticamente os tipos, hoje ela só comporta docstring
- Para otimizar o uso do auto gerador o ideal seria, para toda props sempre ter boas stories, assim fica "ok" consultar o formato, principalmente em objetos complexos. Mesmo o autogerador não conseguindo inferir os tipos e documentar. Também é possível documentar na mão, mas o formato não é interessante, além de ser necessário fazer na mão.
[addon] storyshots
- Até o momento só consegui fazer funcionar o storyshots com a notação .js ou .ts, abri uma issue p/ ver no que dá: https://github.com/storybookjs/addon-svelte-csf/issues/35
- no pior dos casos podemos fazer testes somente para usar snapshots, mas ai é mais uma coisa p/ manter: storybook, testes, snapshots, componente em si PARECE QUE O STORYSHOTS SEMPRE QUEBRA POR CONTA DAS CLASSES AUTO INSERIDAS PELO SVELTE
[addon] playwright
- Em teoria feito para funcionar com react
- só funciona com a notação js e ts de stories
- Não tem muitos download por semana, só 317
- Não é oficial
- Roda com a versão 6.3 do storybook, que no momento é a ultima mesmo
- tem dependencia de coisa legada do storybook
- não roda com node 14, o que conflita com svelte+jest
- Nao consegui rodar nem com react nem com svelte, nem seguindo o exemplo deles
[addon] accessibility
- foi facil de configurar, funcionou perfeitamente na stack atual, com webpack ts, e tudo mais
- inclusive atualizar o feedback quando mudamos os props ao vivo
- único ponto estranho é que o botão mais inacessível apontou o erro de acessibilidade em 'incomplete' e não em 'violations'. Não entendi o porque
- ele também aponta com highlight na tela o que está errado, o que é bem maneiro
[addon] interactions
- só roda nas versões 6.4-beta, nem testei ainda
- acho q não vale a pena pegar versão beta, ainda mais usando svelte
[addon] creevey
- não é oficial, mas parece um plugin bem movimentado, mas não tanto quanto o loki
- usa docker para instalar as dependências, então como pre requisito tem q ter docker instalado e liberado para o usuário local rodar
- tem q saber lidar com docker
- tem q rodar o storybook primeiro
- só roda com notação ts
- funcionou perfeitamente na stack atual
- não tem feature nativa para lidar com responsividade, mas podemos utilizar o selenium para mudar o viewport manualmente, pois ele entrega a instância do drive do navegador nas stories
- segundo doc deles, tem um problema em tentar executar o projeto dentro de um docker, talvez pq a própria ferramenta precisa acessar o docker
- a quantidade de imagens que ele gera pode ser um problema ter isso salvo no git
- a ferramenta de diff funciona muito bem na maioria dos casos, mas em alguns momentos ele renderiza o componente incorretamente, o que pode dificultar o uso em CI por não ser determinístico.
[addon] fixtures
- Não possui suporte oficial a svelte
- Não chegamos a testar ele, pois de forma simples o que ele faz é entregar uma interface para poder selecionar presets de props. Isso força com que os componentes de página sejam dummy components, ou seja, não fazem fetchs, o que pode ser interessante em termos de modularização, mas pode dificultar o desenvolvimento e comprometer a flexibilidade.
- Imagine um formulário que tem diversos selects ditados por fetchs, poderiamos fazer os fetchs aos poucos, somente quando o usuário abrir o um select, mas como ele seria um dummy component, um wraper que não a página e nem o formulário deve fazer todos os fetchs e passar para os componentes em cascata.
outros
- Os apontamentos de erros geralmente não indicam a linha de código errada corretamente, indica a linha de código do svelte depois de passar por processamento, ou até mesmo um erro no webpack. Dificulta muito o debug em muitos casos. As vezes é necessário renderizar o componente e rodar com o rollup no lugar do storybook para ver qual é o erro.
- A documentação para uso com svelte+ts é bem pouca
Outras paradas
- O estado global do componente não faz parte da interface do componente, entretanto, se um componente esperar que deva existir um estado global x, isso deve ser documentado manualmente. Quanto a testes do estado global, deve ser tratado como um arquivo js normal, e não um componente.
- A função avançada do svelte 'getContext' faz parte da interface de um componente, e "burla" o sistema de props. É de extrema necessidade que o componente que espera que exista um determinado contexto tenha isso documentado manualmente, e o componente que define um determinado contexto defina isso manualmente. Utilizando typescript é importante que seja definido a interface do contexto que será definido ou obtido.
-
Testes de funções normais '.js, .ts' são testadas normalmente, o storybook não intefere nisso
-
Tem nada a ver com storybook o que vou falar aqui:
- testes de integração ou e2e que requerem o browser são bem mais lentos que renderizar um fake dom e testar com jest.
- testar componentes, com visual ou snapshots cai no problema de regressão, isso é, se header usa button e button falha, header vai falhar. Isolar header (mockar a dependência de outro componente), para evitar isso não é trivial, muitas vezes não há o que colocar no lugar de forma simples, ou a interface é sensível (requer que qualquer mudança no botão seja espelhada no header e no mockup). Testar somente o comportamento dos componentes tem um pouco mais de resistência a mudança das dependências, mas somente se o componente já possui um comportamente bem definido, se este comportamento for volátil, a escrita de testes se torna mais custosa. Em resumo:
- snapshots e testes visuais tem mais problemas de regreção e devem ser atualizados constantemente
- snapshots precisam ser revisados com frequência, no processo de revisão dos commits, pq o update atualiza tudo e não só um snapshot, o que torna facil dar update acidentalmente
- teste unitários testam o comportamento core, mas perdem pequenos problemas de regreção como por exemplo a interface entre um componente dependente.
- https://benmccormick.org/2016/09/19/testing-with-jest-snapshots-first-impressions/
TODO
- Ver como atualizar o projeto que estou testando p/ o 6.4
- Testar o addon interaction p/ 6.4 e ver se n quebra o creevey (talvez funcione como um e2e?)
- Ver como fica tipar parâmetros mais complexos, interfaces e classes
- Ver como o creevey funciona no CI
- Ver como fica testes quando se tem interatividade, teste de ações
Conclusão
- O bagulho é muito bom
- Svelte ainda é novo, mas tem boa parte das features, e funciona bem com a versão atual
- O formato ideal para escrevermos histórios é na notação js
- tem menos boilerplate que o svelte, tem mais features, e mais documentação
- para utilizar slots temos que fazer um componente wrapper, o que faz com que percamos o snippet de código, mas tudo bem
- O formato mdx é interessante, mas é muito manual, quando for necessário fazer uma página de doc mais robusta, pode ser utilizado ele.
- A ideia do uso desse framework é criar componentes dirento documentando e fazendo testes, e não precisar ler o código para entender como o componente funciona. Em segundo, conseguir testar nele mesmo os componentes.
- O uso do storybook não elimina o jest para testes de classes e funções
Artigo - tópicos
Guia geral: - estudos - o que buscamos - o que testamos, e o que achamos de cada um - o que selecionamos e o pq - o que ainda queremos adicionar, mas ainda não estudamos o como fazer, ou não achamos soluções ainda
-
o que tem na nossa stack atual
- objetivo da nossa stack
- ser rápida de codar, limpa, garantir qualidade, codar menos testes...
- o que tem na stack, porque escolhemos (a nivel macro) usar essas ferramentas?
- passar brevemente no que utilizamos do storybook e linkar para o detalhado
- passar brevemente no que utilizamos de teste e linkar para o detalhado
- quais as versões?
- como codar nesta stack? linkar fluxo de desenvolvimento
- problemas que sabemos na stack
- import dentro da tag do svelte não é resolvido pelo rollup e sim pelo preprocesso, o que resulta em duplicidade de código
- O que ainda queremos acrescentar
- falar explicitamente quais bundler temos p/ não ter confusão
- objetivo da nossa stack
-
storybook
- versões
- o que é
- qual o nosso objetivo com ele, link para nossa stack
- foco do texto não é ensinar a usar, e sim a experiência que tivemos ao colocar ele junto com svelte, e o que selecionamos para utilizar
- por onde começar a estudar
- tl;dr (conclusão do que funciona com o svelte e link para o fluxo de desenvolvimento)
- configurações para uso na stack (svelte, ts, scss, ...)
- formatos de escrita e seus problemas, qual selecionamos
- addons que funcionaram e seus propósitos
- na parte de testes, jogar para o estudo de testes
- link para o nosso fluxo de desenvolvimento
- o que ainda queremos acrescentar (melhorias p/ o próprio storybook até)
-
fluxo de desenvolvimento
- configurações iniciais para utilizar a stack em toda a sua glória, (lint, ...)
- como codar:
- diclamer: tudo aqui é um direcionamento e não regra
- não temos como cobrir todos os casos
- vale o bom senso
- organização de pastas, boas práticas css, js, lint, ...
- arquivos que podemos criar
- componentes vs páginas
- fluxo de uma request
- função que acessa a api:
- faz a request
- lida com as possibilidades de retorno: 200, 404, .... e retorna algo mais alinhado com o app
- algum helper da página, que pode ser testado isoladamente (pode ser testado, apenas mocando a entrada, direto no jest):
- transforma o retorno 200 em algum outro formato de dado, ou lida com o fato de não ter o dado ou ter dado errado
- o app via props (pode ser mocado, apenas passando uma props que é uma promise, direto no storybook):
- recebe uma promise
- espera ser resolvida
- e joga joga na tela se deu certo
- informa o erro se deu errado
- função que acessa a api:
- uso de estados globais
- quando usar variaveis globais css
- stoybook
- como criar as stories, até que ponto podemos criar stories?
- criar stories para todo o tipo de interação?
- documentações manuais, ...
- como criar as stories, até que ponto podemos criar stories?
- testes
- link para detalhado do pq escolhemos fazer os testes assim
- quais deles fazer, quando fazer, pq fazer?
- testes visuais
- mocks
- diclamer: tudo aqui é um direcionamento e não regra
- link para fluxo de uso do git, deploy e staging e versionamento
- o que ainda queremos acrescentar
-
estilo de código
- ref: https://awesomeopensource.com/project/voorhoede/riotjs-style-guide
-
estudo de testes
- tipos de testes
- quais testes escolhemos fazer, e o pq, a que nível
- quais ferramentas testamos, e quais selecionamos utilizar para cada tipo de teste
- qual frequência cada teste deve ter, e a que nível
- o que testar
- como seguir no fluxo? link para parte de teste no fluxo de desenvolvimento
- o que ainda queremos acrescentar
-
como adicionar jest a um projeto svelte
-
como adicionar storybook a um projeto svelte
-
como converter nossa stack para um projeto mobile
-
como adicionar lint? ts? rollup?
-
documentar nosso padrão de código em ts e js
-
documentar nosso padrão de código em scss
-
documentar como transformar nossa stack p/ projeto em uma stack para pacotes npm
-
tutorial montando a stack pedaço a pedaço, explicando o uso do fluxo
- só svelte: explicar componentes
- svelte + lint
- svelte + ts
- svelte + rotas: inserção da lib de rotas e explicar dinâmica com componentes e páginas
- svelte + helpers: explicar reutilização de código
- svelte + testes com jest: inserção do svelte e testar helpers e componentes
- storybook: inserção do storybook e documentar componentes
- svelte + fetchs no banco
- svelte + websockets
- mocks: mock de páginas e estado global
- snapshots tests: explicar inserção de snapshots e exemplificar
- screenshot tests: explicar inserção de screenshot e exemplificar
- e2e testes: explicar inserção de e2e tests e exemplificar
- bdd e tdd: explicar o que é e exemplificar