You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functionMyComponent(props){/* renderize usando props */}functionareEqual(prevProps,nextProps){/* se prevProps e nextProps renderizam o mesmo resultado, retorne true. caso contrário, retorne false. */}exportdefaultReact.memo(MyComponent,areEqual);
Só consigo comparar props
functionGreeting({ name ='Kazuo'}){return<div>Hi {name}!</div>}
functionGreeting({ name }){return<div>Hi {name}!</div>}Greeting.defaultProps={name: 'Kazuo'}
constMyContext=React.createContext(defaultValue)// Provider<MyContext.Providervalue={/* some value */}>// Consumer<MyContext.Consumer>{value=>/* renderiza algo baseado no valor do context */}</MyContext.Consumer>
importAppBannerfrom'@dafiti/components/dist/modules/AppBanner'<AppBanner><AppBanner.CloseButton>Ignorar esta notificação por 24 horas.</AppBanner.CloseButton><AppBanner.Logosrc="https://dafitistatic-a.akamaihd.net/dynamic_yield/cms/static/images/2f095a5cf831f__icn_dafiti_mobile.jpg"alt="Logo do aplicativo da Dafiti"/><AppBanner.Text>Baixe o App e ganhe descontos exclusivos</AppBanner.Text><AppBanner.Linkhref="https://..."aria-label="Ver a página atual no aplicativo nativo.">Ver no app</AppBanner.Link></AppBanner>
#language: pt-brFuncionalidade: Vender doces
Para quando uma doce for vendido
Eu, como vendedor
Desejo decrementar um item no estoque
Cenário: Baixa 1 bala do estoqueDado que cliente pede 1 bala
E tenho 10 balas em estoque
Quando ele compra realiza a compra
Então eu fico com 9 balas em estoque
ATDD - Acceptance Test Driven Development
Mistura entre criar Stories (BDD) e aplicá-la durante desenvolvimento (TDD).
Por tipo de testes
História
Debug
Teste de mesa
Automatização
Assertion
a===b
cqd.
xUnit
E no JavaScript?
Debug
console.log('minha função passou por aqui!')console.log('sai da frente que debugando:',coisa)
varassert=require('chai').assert,foo='bar',beverages={tea: ['chai','matcha','oolong']};assert.typeOf(foo,'string');// without optional messageassert.typeOf(foo,'string','foo is a string');// with optional messageassert.equal(foo,'bar','foo equal `bar`');assert.lengthOf(foo,3,'foo`s value has a length of 3');assert.lengthOf(beverages.tea,3,'beverages has 3 types of tea');
Expect
varanswer=43;// AssertionError: expected 43 to equal 42.expect(answer).to.equal(42);// AssertionError: topic [answer]: expected 43 to equal 42.expect(answer,'topic [answer]').to.equal(42);
Should
varshould=require('chai').should()//actually call the function,foo='bar',beverages={tea: ['chai','matcha','oolong']};foo.should.be.a('string');foo.should.equal('bar');foo.should.have.lengthOf(3);beverages.should.have.property('tea').with.lengthOf(3);
Estrutura
Asserção
// cenário do testetest('when clicked, the counter increments the click',()=>{fireEvent.click(counterButton)assert.equal(counterButton.innerHTML,'4')// Chai})
Não existe assert no Jest (Jasmine)
BDD
describe('Counter Button',()=>{describe('when clicked',()=>{it('should increments the click',()=>{fireEvent.click(counterButton)expect(counterButton).toHaveTextContent('4')})})})
[PASS] src/Counter.spec.js
Counter Button
when clicked
✓ should increments the click
o it substitui lexicamente o que foi citado anteriormente nos blocos describe
Apesar do npm vir junto desde as primeiras versões do Node.js, os desenvolvedores do Facebook estavam enfrentando alguns problemas em relação ao gerenciamento de pacotes e resolveram criar um outro gerenciador de pacotes.
Apesar de ambos utilizarem o mesmo registro público (o npmjs.com), mesmo nas versões iniciais o Yarn já tentava adicionar alguns diferenciais:
Lockfile
Um arquivo de lock (yarn.lock) de versões que pode ser versionável via gerenciador de controlador de versão (ex: Git). As dependências são registradas numa ordem determinística facilitando na hora do versionamento. Até então o npm ainda não tinha a implementação que gerava o arquivo package-lock.json e para travar versões de dependências tinha somente o npm-shrinkwrap. O Yarn também atualiza o yarn.lock quando há mudanças de versão das dependências quando atualizadas e satisfizerem as versões definidas no package.json.
Caching de pacotes
Outro diferencial é que o Yarn possui um registro próprio de cache de pacotes, onde dependendo do pacote e de sua versão o Yarn baixava um arquivo gzip contendo todos os arquivos de uma determinada dependência e só baixava do registro principal se este cache não existisse.
Instalação faseada
Antigamente o npm baixava tudo do registro e ia baixando e resolvendo dependências de acordo com o que estava definido no package.json de cada pacote. Ao baixar também criava pastas node_module dentro de cada dependência e jogando os pacotes recursivamente. Posteriormente o npm começou a fazer dedupe das dependências (tirando duplicações ao mesmo pacote ser dependência de múltiplos outros pacotes). Mesmo assim poderiam haver inconsistências na hora da instalação pois a estrutura do node_modules era feita de uma maneira não determinística.
Assim o Yarn ao invés de simplesmente instalar as dependências do package.json ele primeiro cria um grafo de todas as dependências, resolve e só então baixa as dependências depois da resolução deste grafo de dependências.
Berry
Ambos os gerenciadores de pacotes foram acumulando novas funcionalidades... Vou falar de evoluções e algumas funcionalidades que já utilizei. Não comentarei sobre tudo que há de novo pois você mesmo pode acompanhar neste artigo que será uma comunicação muito mais oficial que meus comentários.
Plug'n'Play
Creio que a mais famosa e discutida das funcionalidades do Yarn é o pnp.
Se você ainda não ouviu falar, o Plug'n'Play é uma funcionalidade do Yarn que "some" com a node_modules do teu projeto. Foi introduzido na primeira versão do Yarn em setembro de 2018 e seu funcionamento foi inspirado no autoload do PHP (PSR-4).
Tecnicamente o Yarn cria um arquivo na raiz do seu projeto chamado .pnp.js gerado automagicamente e instala todas as dependências do teu projeto num diretório de cache (por padrão: ./.yarn/cache dentro do projeto), sendo uma alternativa ao antigo Yarn Offline Mirror. Ao rodar o node, basta dar require do arquivo .pnp.js e seu projeto está pronto para pegar as dependências resolvendo direto da pasta de cache e não mais da node_modules. E também ao instalar (rodando yarn install ou yarn add), se for um pacote que já existe no projeto o Yarn aproveita a referẽncia em disco antes de baixar o pacote do registro remoto.
E todas as dependências são agora guardadas dentro de arquivos zipados.
Ressalto que essa é uma funcionalidade exclusiva do Yarn em relação a sua funcionalidade. O npm tink também pretende adicionar Plug'n'Play mas sua implementação e funcionalidade podem divergir da feita pelo time do Yarn.
Hoje também existem diversas alternativas em relação a utilização de dependências.
Existe um executável @yarnpkg/pnpify que auxilia ao rodar algum executável que não seja compatível com PnP emulando uma node_modules.
Monorepo
Outra funcionalidade já existente na primeira versão do gerenciador de pacotes é o Workspaces. Além de transformar o Yarn numa ferramenta para manipulação de monorepos, ao ativá-lo o Yarn também une e deduplica todas as dependências num só node_modules.
Digo, esta era o comportamento esperado na versão um. A diferença com o Berry é que como o PnP, essa funcionalidade também vem ativa por padrão. E ainda mais: sem node_modules. Ainda com os ganhos de linkagem automática de pacotes no mesmo repositório.
Também na nova versão não é mais necessário adicionar a flag --ignore-workspace-root-check/-W ao instalar dependências do pacote raiz. Ainda é possível utilizar o comando yarn workspace <nome do pacote> <ação> porém a diretiva yarn workspaces ... deixou de existir porém parte de sua funcionalidade virou yarn workspaces foreach .... Aproveitando...
Plugins
Com esta nova versão, funcionalidades específicas viraram plugins. Eles serão instalados dentro do projeto, podendo ou não ser versionados dentro da pasta .yarn/plugins. Listarei alguns:
Adiciona o comando yarn upgrade-interactive, algo que já existia na versão anterior e foi melhorada nesta. Consiste em uma ferramenta (CLI) que possibilita atualizar pacote a pacote de cada dependência do projeto.
Tem um plugin bem legal para quem desenvolve em TypeScript. Ao utilizar este plugin ele verifica se uma dependência, ao instalar, possui um pacote no DefinitelyTyped (@types/*), baixa e adiciona nos devDependencies.
Configuração
Ao instalar plugins o Yarn gerará um arquivo de configuração, localizado na raiz com o nome de .yarnrc.yml. Nesta nova versão também foi convencionado o nome do arquivo como o anteriormente citado, evitando ambiguidades. Na versão anterior era possível ter um arquivo .yarnrc contendo todos os yarn set config ... do projeto.
Validação de dependências
Ao utilizar uma dependência o Yarn valida se essa dependência foi listada como dependência (incluindo devDependencies e peerDependencies) e se foi corretamente instalada.
Monkey-patch
Se alguma dependência não foi listada corretamente, quando a dependência for executada o Yarn emitirá um erro impedindo sua execução.
Mas em alguns casos não é possível esperar que atualizem a dependência. Para estes casos é possível adicionar packageExtensions dentro do .yarnrc.yml.
yarn dlx
Funcionalidade diliça que também não pode ficar de fora é o yarn dlx. Possui uma funcionalidade semelhante ao npx.
Na versão legacy o Yarn até possuia alguma alternativa ao npx com o yarn create, mas que acabava restringindo a execução apenas de pacotes que começassem com create-*.
E como instalar?
Por enquanto que ainda não houve atualização no npmjs da versão para a latest, instale como uma dependência global:
$ npm install -g yarn@berry
E como usar o antigo?
A versão atual se tornará a legacy, logo basta rodar:
$ npm install -g yarn@legacy
Observação: Se você utiliza nvm, por padrão o nvm usa diferentes pastas globais para cada versão do Node.
E como manter instalada a versão 2 mas usar a versão 1 em um projeto em específico?
Na pasta do projeto você pode rodar a seguinte instrução:
$ yarn set version ^1
Ele instalará o Yarn dentro da pasta .yarn/releases permitindo versionar junto do projeto e adicionando a chamada no arquivo de configuração .yarnrc.yml. Note que também é possível instalar uma versão específica mas que no exemplo foi sinalizado para instalar a última versão seguindo o semver.
Basta adicionar a dependência @yarnpkg/pnpify (como devDependencies) e rode uma instrução para gerar o SDK:
$ yarn add -D @yarnpkg/pnpify
$ yarn pnpify --sdk
Fazendo isso ele adicionará uma configuração no arquivo .vscode/settings.json seguido de uma dependência dentro da mesma pasta. Após isso, na próxima vez que vc abrir um arquivo TypeScript clique no canto direito abaixo onde mostra a versão do TypeScript e escolha a versão com o sufixo -pnpify e gg.
Antes de tudo não confundir Plug'n'Play com pnpm (com a mesma citação na documentação do Yarn). Este é um gerenciador de pacotes (também) mas que resolve a node_modules de um jeito flat, ou seja, mais horizontal possível e referenciando dependências usando symlinks (links simbólicos).
Gerenciador de monorepos, o mais popular dentre o desenvolvimento JS. Permite o uso tanto do Yarn quanto do npm e possui integração com Yarn Workspaces.
Um empacotador para navegadores atuais que possuem suporte a ESM. Transforma todas as dependências em módulos ESM para serem chamadas direto pelo código.