{"id":1847,"date":"2017-11-06T17:22:35","date_gmt":"2017-11-06T20:22:35","guid":{"rendered":"http:\/\/www.milfont.org\/tech\/2017\/11\/06\/monitoramento-e-manipulacao-de-erros-no-pwa-com-react-e-redux\/"},"modified":"2017-11-06T17:22:35","modified_gmt":"2017-11-06T20:22:35","slug":"monitoramento-e-manipulacao-de-erros-no-pwa-com-react-e-redux","status":"publish","type":"post","link":"https:\/\/www.milfont.org\/tech\/2017\/11\/06\/monitoramento-e-manipulacao-de-erros-no-pwa-com-react-e-redux\/","title":{"rendered":"Monitoramento e manipula\u00e7\u00e3o de erros no PWA com React e Redux"},"content":{"rendered":"<p><em>Adendo: N\u00e3o sabe bem o que \u00e9 <\/em><strong><em>PWA<\/em><\/strong><em>? <\/em><a href=\"https:\/\/medium.com\/@milfont\/progressive-web-apps-a-palavra-chave-%C3%A9-progressive-n%C3%A3o-app-ou-web-dbfa25b1ebd2\" target=\"_blank\" rel=\"noopener noreferrer\"><em>Leia o resumo<\/em><\/a><em>.<\/em><\/p>\n<h4>Colocou a App em produ\u00e7\u00e3o? Vamos conversar.<\/h4>\n<p>Voc\u00ea n\u00e3o conseguir\u00e1 impedir erros em produ\u00e7\u00e3o e principalmente lidar com isso na intera\u00e7\u00e3o com o usu\u00e1rio mesmo que sua aplica\u00e7\u00e3o tenha uma cobertura de 100% com testes unit\u00e1rios, um bom ratio pra cada linha de c\u00f3digo e testes de aceita\u00e7\u00e3o\/integra\u00e7\u00e3o.<\/p>\n<blockquote>\n<p>Voc\u00ea est\u00e1 errado em todas as metodologias se n\u00e3o testa de forma automatizada.<\/p>\n<\/blockquote>\n<h4>Reagindo a erros n\u00e3o esperados<\/h4>\n<p>A vers\u00e3o 16 do React trouxe um m\u00e9todo excelente no ciclo de vida dos componentes, o <a href=\"https:\/\/reactjs.org\/blog\/2017\/07\/26\/error-handling-in-react-16.html\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>componentDidCatch<\/strong><\/a>, que captura todas as exce\u00e7\u00f5es lan\u00e7adas pelos n\u00f3s abaixo na \u00e1rvore do componente que manipula esse m\u00e9todo.<\/p>\n<p>Em outras palavras, todo erro que acontecer abaixo de <strong><em>ErrorBoundary<\/em><\/strong> (ver c\u00f3digo seguinte) ser\u00e1 capturado num \u00fanico ponto sem a necessidade de espalhar try\/catch pelo c\u00f3digo de apresenta\u00e7\u00e3o.<\/p>\n<p>De qualquer forma, todas as transforma\u00e7\u00f5es de estado devem ser concentradas no redux como o c\u00f3digo a seguir.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/cmilfont\/e4fa20e1ced19a36fcdf948916184ade\">https:\/\/gist.github.com\/cmilfont\/e4fa20e1ced19a36fcdf948916184ade<\/a><\/p>\n<p>Independente de como mostrar a UI para o usu\u00e1rio ao acontecer um erro, essa informa\u00e7\u00e3o vir\u00e1 exclusivamente de um ponto que \u00e9 administrado por transa\u00e7\u00f5es das sagas.<\/p>\n<h3>Estado Centralizado<\/h3>\n<p>Temos v\u00e1rios vantagens em centralizar a manipula\u00e7\u00e3o de erros no redux, a principal \u00e9 que podemos concentrar o monitoramento em um \u00fanico lugar com os dados trackeados pelo sua ferramenta, seja Airbreak, Logentries ou <a href=\"https:\/\/github.com\/ngokevin\/redux-raven-middleware\" target=\"_blank\" rel=\"noopener noreferrer\">Sentry<\/a>.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/cmilfont\/a0009b8e0af3e4ce0eb1e23439324314\">https:\/\/gist.github.com\/cmilfont\/a0009b8e0af3e4ce0eb1e23439324314<\/a><\/p>\n<p>Qual a diferen\u00e7a entre colocar um window.onError?<\/p>\n<p>Facilitar coordenar tipos de erros junto ao estado da aplica\u00e7\u00e3o, al\u00e9m de indicar um \u00fanico ponto de manuten\u00e7\u00e3o porque esses tipos precisam de transforma\u00e7\u00f5es e Tracking.<\/p>\n<h3>Track dos\u00a0erros<\/h3>\n<p>Dado a centraliza\u00e7\u00e3o dos erros, agora partir para logar direto no seu servi\u00e7o que provavelmente tem dezenas de m\u00e9todos de notifica\u00e7\u00f5es e habilitar a integra\u00e7\u00e3o com seu Issue Tracking.<\/p>\n<figure>\n<p><img decoding=\"async\" data-width=\"994\" data-height=\"781\" src=\"https:\/\/cdn-images-1.medium.com\/max\/600\/1*pdkK6DIIEbFEZhJcenyJgw.png\"><br \/>\n<\/figure>\n<figure class=\"wp-caption\">\n<p><img decoding=\"async\" data-width=\"831\" data-height=\"567\" src=\"https:\/\/cdn-images-1.medium.com\/max\/600\/1*8qZ0MqSDxuun89SFX5m3TA.png\"><figcaption class=\"wp-caption-text\">Tracking, notifica\u00e7\u00e3o e resolu\u00e7\u00e3o de\u00a0erros.<\/figcaption><\/figure>\n<h3>Offline<\/h3>\n<p>O ecossistema Redux tamb\u00e9m agrega a vantagem de facilitar a persist\u00eancia dos erros para tracking e an\u00e1lise futura ou evitar a submiss\u00e3o constante de notifica\u00e7\u00f5es aproveitando para enviar em Batch num tempo determinado.<\/p>\n<p>Em alguns casos extremos, principalmente em integra\u00e7\u00e3o, voc\u00ea pode exportar o store na window para disparar um error que extrapola a aplica\u00e7\u00e3o com <strong><em>window.onError = error=&gt; (window.store.dispatch({ type: &#8216;GLOBAL_ERROR&#8217;, payload: error }));<\/em><\/strong><\/p>\n<div class=\"embed-twitter\">\n<blockquote class=\"twitter-tweet\" data-width=\"450\" data-dnt=\"true\">\n<p lang=\"en\" dir=\"ltr\">Unit tests: 100% coverage<br \/>Integration tests: n\/a <a href=\"https:\/\/t.co\/ptMkXTXZSV\">pic.twitter.com\/ptMkXTXZSV<\/a><\/p>\n<p>&mdash; Daniel Martins (@danielfmt) <a href=\"https:\/\/twitter.com\/danielfmt\/status\/892847112026701824?ref_src=twsrc%5Etfw\">August 2, 2017<\/a><\/p>\n<\/blockquote>\n<p><script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/div>\n<p>Espero que essas dicas agreguem valor a sua App, porque \u00e9 praticamente imposs\u00edvel evitar erros, \u00e9 sempre melhor estar preparado pra agir quando eles surgem.<\/p>\n<p>Comenta sobre algo que acontece(u) na sua App que essas dicas ainda n\u00e3o cobrem para eu melhorar o artigo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Adendo: N\u00e3o sabe bem o que \u00e9 PWA? Leia o resumo. Colocou a App em produ\u00e7\u00e3o? Vamos conversar. Voc\u00ea n\u00e3o conseguir\u00e1 impedir erros em produ\u00e7\u00e3o e principalmente lidar com isso na intera\u00e7\u00e3o com o usu\u00e1rio mesmo que sua aplica\u00e7\u00e3o tenha uma cobertura de 100% com testes unit\u00e1rios, um bom ratio pra cada linha de c\u00f3digo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/1847"}],"collection":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/comments?post=1847"}],"version-history":[{"count":0,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/1847\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/media?parent=1847"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/categories?post=1847"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/tags?post=1847"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}