{"id":2911,"date":"2017-07-06T14:00:21","date_gmt":"2017-07-06T17:00:21","guid":{"rendered":"https:\/\/blog.umbler.com\/?p=2911"},"modified":"2018-12-05T11:50:36","modified_gmt":"2018-12-05T13:50:36","slug":"npm-vs-yarn-e-agora-quem-podera-nos-defender","status":"publish","type":"post","link":"https:\/\/blog.umbler.com\/br\/npm-vs-yarn-e-agora-quem-podera-nos-defender\/","title":{"rendered":"npm vs Yarn: e agora, quem poder\u00e1 nos defender?"},"content":{"rendered":"<p>Ouvir sobre <em>npm<\/em> ou Yarn dentro da comunidade JavaScript \u00e9 bastante comum, mas voc\u00ea sabe quais s\u00e3o suas diferen\u00e7as, qual \u00e9 o melhor ou at\u00e9 para que eles servem?<\/p>\n<p>Podemos dizer que ambos s\u00e3o gerenciadores de depend\u00eancias\/pacotes, similares ao Composer do PHP e NuGet do .NET, permitindo o reaproveitamento de c\u00f3digo e, por consequ\u00eancia, acelerando o desenvolvimento em contraste com o armazenamento de c\u00f3digos JavaScript em outros projetos ou em CNDs como costumava ser feito. Afinal, se quando voc\u00ea vai fazer um bolo n\u00e3o precisa plantar o trigo e fazer a farinha, por que n\u00e3o aplicar essa mesma l\u00f3gica ao desenvolvimento, n\u00e3o \u00e9 mesmo?<\/p>\n<blockquote><p>If you wish to make an apple pie from scratch, you must first invent the universe. &#8211; Carl Sagan<\/p><\/blockquote>\n<h2><em>npm<\/em>: o que \u00e9?<\/h2>\n<p>O <a href=\"https:\/\/www.npmjs.com\/\" target=\"_blank\" rel=\"nofollow noopener\"><em>npm<\/em><\/a> \u00e9 um projeto Open Source criado em 2009 com objetivo de facilitar a troca de c\u00f3digo JavaScript, sendo usado como gerenciador de pacotes padr\u00e3o do <a href=\"\/\/blog.umbler.com\/node-js-na-umbler\/\" target=\"_blank\" rel=\"noopener\">Node.js<\/a>. Ao falarmos de <em>npm<\/em> podemos estar nos referindo a um destes itens:<\/p>\n<ol>\n<li>O reposit\u00f3rio aberto onde ficam armazenados os pacotes<\/li>\n<li>Um cliente que permite o envio\/download de c\u00f3digo do reposit\u00f3rio<\/li>\n<li>Um site onde \u00e9 poss\u00edvel pesquisar informa\u00e7\u00f5es dos pacotes e ver a documenta\u00e7\u00e3o do npm.<\/li>\n<\/ol>\n<p>Tamb\u00e9m existe uma empresa chamada NPM, Inc., que \u00e9 a mantenedora do reposit\u00f3rio aberto de pacotes e coordena o desenvolvimento do <em>npm<\/em>. Ela tamb\u00e9m trabalha no desenvolvimento de solu\u00e7\u00f5es pagas focadas no mercado empresarial.<\/p>\n<p>O <em>npm<\/em> utiliza um arquivo de configura\u00e7\u00e3o chamado package.json. Este arquivo \u00e9 o respons\u00e1vel pela configura\u00e7\u00e3o do projeto como o nome,a vers\u00e3o, atalhos de comandos que <em>npm<\/em> executa, etc. Uma das fun\u00e7\u00f5es mais importantes \u00e9 a de armazenar uma lista de depend\u00eancias que o projeto ir\u00e1 utilizar &#8211; se quiser saber mais informa\u00e7\u00f5es sobre este arquivo e de como realizar a configura\u00e7\u00e3o da sua aplica\u00e7\u00e3o, <a href=\"https:\/\/help.umbler.com\/hc\/pt-br\/articles\/115001793863-Node-JS-na-Umbler\" target=\"_blank\" rel=\"noopener\">clique aqui<\/a>. Com este arquivo e o cliente do <em>npm<\/em> \u00e9 poss\u00edvel instalar todas as depend\u00eancias com apenas um comando, sendo muito \u00fatil quando voc\u00ea precisa executar um projeto em um novo ambiente ou durante a execu\u00e7\u00e3o de ferramentas de integra\u00e7\u00e3o cont\u00ednua.<\/p>\n<p>Mas, e quando o projeto \u00e9 aquele <del datetime=\"2017-07-04T11:37:08+00:00\">aerolito<\/del> <a href=\"\/\/blog.umbler.com\/br\/utilizando-microservices-na-umbler\/\" target=\"_blank\" rel=\"noopener\">monolito<\/a>, com tantas depend\u00eancias que voc\u00ea at\u00e9 cogita ver um epis\u00f3dio da sua s\u00e9rie favorita enquanto instala? \u00c9 a\u00ed que o Yarn se torna atrativo em compara\u00e7\u00e3o ao <em>npm<\/em>.<\/p>\n<h2>Yarn: uma hist\u00f3ria<\/h2>\n<p>Em outubro de 2016, o Facebook lan\u00e7ou o <a href=\"https:\/\/yarnpkg.com\/en\/\" target=\"_blank\" rel=\"nofollow noopener\">Yarn<\/a> em conjunto com o Google, Exponent e Tilde, com o objetivo de tornar o processo de instala\u00e7\u00e3o das depend\u00eancias n\u00e3o s\u00f3 mais r\u00e1pido, mas tamb\u00e9m mais seguro.<\/p>\n<p>No Facebook, muitos dos projetos que dependiam do <em>npm<\/em> apresentavam certos problemas, como:<\/p>\n<ul>\n<li>Demora no tempo de instala\u00e7\u00e3o<\/li>\n<li>Depend\u00eancia que n\u00e3o possu\u00edam a mesma vers\u00e3o em diversas m\u00e1quinas<\/li>\n<li>A forma que o <em>npm<\/em> executa c\u00f3digos das depend\u00eancias de forma autom\u00e1tica<\/li>\n<\/ul>\n<p>Ap\u00f3s tentar algumas solu\u00e7\u00f5es alternativas para resolver estas quest\u00f5es, alguns engenheiros come\u00e7aram a trabalhar em um cliente novo, buscando resolver estes problemas a partir da raiz.<\/p>\n<p>At\u00e9 o lan\u00e7amento do Yarn, o <em>npm<\/em> realizava as instala\u00e7\u00f5es das depend\u00eancias de forma n\u00e3o determin\u00edstica, ou seja, a estrutura da pasta node_modules poderia ser diferente de uma pessoa para outra, causando aquele velho problema do \u201cMas na minha m\u00e1quina funciona!\u201d. Para contornar este problema, o Yarn faz uso de arquivos de lock (yarn.lock) e de um algoritmo de instala\u00e7\u00e3o determin\u00edstico. No arquivo de lock a vers\u00e3o exata da depend\u00eancia \u00e9 armazenada, garantindo que todas as instala\u00e7\u00f5es s\u00e3o iguais. Apesar de o <em>npm<\/em> j\u00e1 possuir uma op\u00e7\u00e3o para gerar arquivos de lock, o Yarn gera seu arquivo de lock automaticamente.<\/p>\n<p>Para acelerar a instala\u00e7\u00e3o, o Yarn consulta um diret\u00f3rio de cache global, que \u00e9 usado tanto para evitar que o download seja feito, quanto para permitir a instala\u00e7\u00e3o enquanto estiver offline, o que n\u00e3o era poss\u00edvel realizar com o <em>npm<\/em>.<\/p>\n<p>O processo de instala\u00e7\u00e3o atrav\u00e9s do Yarn \u00e9 feito em tr\u00eas etapas, sendo elas:<\/p>\n<ol>\n<li>Busca recursiva de depend\u00eancias no reposit\u00f3rio do <em>npm<\/em><\/li>\n<li>Procura no cache global e, caso a depend\u00eancia ainda n\u00e3o tenha sido baixada, salva uma c\u00f3pia no cache global<\/li>\n<li>Conecta as depend\u00eancias ao copi\u00e1-las do cache global para a pasta node_modules local<\/li>\n<\/ol>\n<p>Desta forma, o Yarn consegue maximizar o uso dos recursos dispon\u00edveis e reduzir o tempo de instala\u00e7\u00e3o. Em diversos testes de performance realizados ap\u00f3s o lan\u00e7amento do Yarn, <a href=\"https:\/\/yarnpkg.com\/lang\/en\/compare\/\" target=\"_blank\" rel=\"nofollow noopener\">ele mostrou-se muito mais r\u00e1pido que o <em>npm<\/em><\/a>.<\/p>\n<p>Em mar\u00e7o de 2017, ap\u00f3s um ano e meio de desenvolvimento, foi lan\u00e7ada vers\u00e3o 5 do <em>npm<\/em>, trazendo diversas melhorias de performance semelhantes \u00e0s presentes no Yarn. Nesta vers\u00e3o, o <em>npm<\/em> j\u00e1 cria um arquivo de lock chamado <em>package-lock.json<\/em> automaticamente; \u00e9 capaz de instalar depend\u00eancias a partir do cache; realiza valida\u00e7\u00f5es de hashes SHA-512 e a velocidade de instala\u00e7\u00e3o aumentou cerca de 5x comparada com a anterior. Se voc\u00ea j\u00e1 instalou a vers\u00e3o 8 do Node.js, ela j\u00e1 conta com o <em>npm<\/em> 5 instalado por padr\u00e3o.<\/p>\n<h2>Mas, qual utilizar?<\/h2>\n<p>O melhor de tudo \u00e9 que tanto o <em>npm<\/em> quanto o Yarn utilizam o <em>package.json<\/em>, dando a voc\u00ea a escolha sobre qual melhor se adequa \u00e0 sua necessidade. Na Umbler n\u00e3o poderia ser diferente, n\u00e3o \u00e9 mesmo?<\/p>\n<p>Se voc\u00ea usa o <em>npm<\/em>, n\u00e3o \u00e9 necess\u00e1rio mais nada. O comando <code>npm install<\/code> vai ser executado durante o deploy da sua aplica\u00e7\u00e3o. Lembrando que se voc\u00ea j\u00e1 usa o Node.js 8, \u00e9 indicado que voc\u00ea adicione o arquivo <em>package-lock.json<\/em> no versionamento de c\u00f3digo para aproveitar todos os benef\u00edcios da nova vers\u00e3o do <em>npm<\/em>.<br \/>\nJ\u00e1 se voc\u00ea usa o Yarn, \u00e9 s\u00f3 ter certeza que o arquivo yarn.lock foi adicionado no controle de vers\u00e3o que, durante o deploy, ser\u00e1 identificado o uso do Yarn e o comando <code>yarn install<\/code> ser\u00e1 executado.<\/p>\n<p>Est\u00e1 esperando o que para testar <a href=\"https:\/\/www.umbler.com\/br\/hospedagem-nodejs\" target=\"_blank\" rel=\"noopener\">Node.js (<em>npm<\/em> e Yarn) na Umbler<\/a> agora mesmo? \ud83d\ude09<br \/>\n<a href=\"https:\/\/academy.umbler.com\/boas-praticas-com-nodejs\/?utm_source=postenpmyarn&amp;utm_medium=banner&amp;utm_campaign=banner-post-npmyarn\" target=\"_blank\" rel=\"noopener noreferrer\"><img fetchpriority=\"high\" decoding=\"async\" class=\"no-lightbox aligncenter wp-image-1277 size-full\" src=\"https:\/\/blog.umbler.com\/wp-content\/uploads\/2017\/07\/cta_ebook_nodejs.png\" alt=\"Banner E-book Node.js\" width=\"750\" height=\"325\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ouvir sobre npm ou Yarn dentro da comunidade JavaScript \u00e9 bastante comum, mas voc\u00ea sabe quais s\u00e3o suas diferen\u00e7as, qual \u00e9 o melhor ou at\u00e9 para que eles servem? Podemos dizer que ambos s\u00e3o gerenciadores de depend\u00eancias\/pacotes, similares ao Composer do PHP e NuGet do .NET, permitindo o reaproveitamento de c\u00f3digo e, por consequ\u00eancia, acelerando [&hellip;]<\/p>\n","protected":false},"author":25,"featured_media":5302,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23],"tags":[256,270,271],"class_list":["post-2911","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev","tag-node-js","tag-npm","tag-yarn"],"_links":{"self":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts\/2911"}],"collection":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/users\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/comments?post=2911"}],"version-history":[{"count":0,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts\/2911\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/media\/5302"}],"wp:attachment":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/media?parent=2911"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/categories?post=2911"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/tags?post=2911"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}