<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Pony Foo Weekly]]></title><description><![CDATA[Latest Pony Foo Weekly issues]]></description><link>https://ponyfoo.com</link><image><url>https://ponyfoo.com/img/banners/branded.b2b85b77.png</url><title>Pony Foo Weekly</title><link>https://ponyfoo.com</link></image><generator>ponyfoo/ponyfoo</generator><lastBuildDate>Sat, 01 Jul 2023 14:10:29 GMT</lastBuildDate><atom:link href="https://ponyfoo.com/weekly/feed" rel="self" type="application/rss+xml"/><pubDate>Sat, 01 Jul 2023 14:10:29 GMT</pubDate><copyright><![CDATA[Nicolás Bevacqua, 2023]]></copyright><language><![CDATA[en]]></language><managingEditor><![CDATA[feed@ponyfoo.com (Nicolás Bevacqua)]]></managingEditor><webMaster><![CDATA[feed@ponyfoo.com (Nicolás Bevacqua)]]></webMaster><ttl>15</ttl><category><![CDATA[deep-dive]]></category><category><![CDATA[webassembly]]></category><category><![CDATA[node.js]]></category><category><![CDATA[best-practices]]></category><category><![CDATA[news]]></category><category><![CDATA[javascript]]></category><category><![CDATA[css]]></category><category><![CDATA[performance]]></category><category><![CDATA[article]]></category><category><![CDATA[talk]]></category><category><![CDATA[graphql]]></category><category><![CDATA[introductory]]></category><category><![CDATA[job]]></category><category><![CDATA[tutorial]]></category><category><![CDATA[code]]></category><category><![CDATA[point-of-view]]></category><category><![CDATA[survey]]></category><category><![CDATA[inspiration]]></category><category><![CDATA[tools]]></category><item><title><![CDATA[Fractals in WebAssembly, Async Iteration for Node.js Streams, TDD, Scroll to Text Fragment, and Immutable code 🥺  — Pony Foo Weekly]]></title><description><![CDATA[<div class="f-core"><div class="md-markdown"></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://2ality.com/2019/11/nodejs-streams-async-iteration.html?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-195" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Node.js streams via Async Iteration</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/deep-dive" style="color:#f7f0f5;background-color:#900070" class="wy-link-tag">Deep Dive</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Working with Node.js streams is much more pleasant if we use asynchronous iteration. Axel shows how to do just that.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/rauschma?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-195" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Axel Rauschmayer</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://www.youtube.com/watch?v=9TLw4Ri2lK8&amp;utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-195" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>A WebAssembly tutorial with fractals</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/webassembly" class="wy-link-tag">webassembly</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Learn how to port an interactive fractals app to the web by compiling it from C to WebAssembly.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/RobAboukhalil?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-195" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Robert Aboukhalil</p> </a></div></td><td class="wy-td wy-link-cell-image"><a href="https://www.youtube.com/watch?v=9TLw4Ri2lK8&amp;utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-195" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://i.ytimg.com/vi/9TLw4Ri2lK8/hqdefault.jpg" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-primary"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://tinyurl.com/yxcbnnvw?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-195" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>How to measure and improve Node.js performance</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/node.js" class="wy-link-tag">node.js</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>If JavaScript is so fast, why are so many Node.js applications slow? I&#x2019;ll show how we can profile a Node app using both the built-in profiler and Raygun.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/raygunio?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-195" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Raygun</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/sponsored" class="wy-link-tag wy-link-sponsor">Sponsored</a></div></td><td class="wy-td wy-link-cell-image"><a href="https://tinyurl.com/yxcbnnvw?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-195" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://raygun.com/blog/images/measure-node-performance/feature.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://blog.sapegin.me/all/avoid-mutation/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-195" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Washing your code: avoid mutation</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/best-practices" style="color:#900070;background-color:#ffe270" class="wy-link-tag">Best Practices</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Mutations happen when we change a JavaScript object or array without creating a new variable or reassigning an existing one. Mutations make code harder to understand and can lead to hard-to-find bugs.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/iamsapegin?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-195" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Artem Sapegin</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://mgearon.com/html/text-fragments/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-195" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Scroll to text fragment</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/news" style="color:#1bc211;background-color:#e4f9e3" class="wy-link-tag">News</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>How to use text fragments to highlight part of a web page when you link to it without using the ID HTML tag. A quick way to grab the users attention.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/michaelgearon?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-195" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Michael Gearon</p> </a></div></td><td class="wy-td wy-link-cell-image"><a href="https://mgearon.com/html/text-fragments/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-195" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://mgearon.com/wp-content/uploads/2020/07/text-fragments-start-and-end.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://frosinastamatoska.medium.com/10-rules-of-front-end-tdd-to-abide-by-f48987dc2ffc?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-195" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Front-end TDD rules to abide by</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/deep-dive" style="color:#f7f0f5;background-color:#900070" class="wy-link-tag">Deep Dive</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>It has been one year since I&#x2019;ve joined my current team. It is a team consisting of three members, me and two other backend developers.</p> </div></div><div class="wy-link-source-section"><a href="https://github.com/FrosinaS?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-195" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Frosina Stamatoska</p> </a></div></td><td class="wy-td wy-link-cell-image"><a href="https://frosinastamatoska.medium.com/10-rules-of-front-end-tdd-to-abide-by-f48987dc2ffc?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-195" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://miro.medium.com/max/789/1*vZcY9vv64smudvYVDhKwmQ.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div></div><style>html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;position:relative;vertical-align:baseline}sup{top:-.5em}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto;resize:vertical;min-height:280px;max-height:900px}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item;margin:-10px -20px;padding:10px;background-color:#f6f6f6;cursor:pointer;border-bottom:2px solid #ddd}[hidden],template{display:none}body,body:after,body:before,html,html:after,html:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*,:after,:before{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}@-moz-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-webkit-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-o-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-moz-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-webkit-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-o-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}.f-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.f-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .f-heading,.ly-custom-heading h1,.ly-custom-heading h2,.ly-custom-heading h3,.ly-custom-heading h4,.ly-custom-heading h5,.ly-custom-heading h6,.ly-lean .f-heading,.ly-lean h1,.ly-lean h2,.ly-lean h3,.ly-lean h4,.ly-lean h5,.ly-lean h6{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .f-subheading,.ly-lean .f-subheading{font-family:Merriweather,Georgia,serif}body{margin:0;font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif;background:#fcfcfc;color:#333}img{max-width:100%;border:none}.md-markdown figure:not(.twitter-tweet-figure){background-color:#f6f6f6}.md-markdown figure:not(.twitter-tweet-figure)>a{display:block}.md-markdown figure:not(.twitter-tweet-figure)>a>img,.md-markdown figure:not(.twitter-tweet-figure)>img{display:block;margin-left:auto;margin-right:auto}.md-markdown figcaption{padding:10px;font-style:italic;font-size:14px;background:-webkit-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-moz-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-o-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-ms-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:linear-gradient(to right,#fff9e2 33%,#fcf9ee 100%);color:#555}.md-markdown .figure-has-loaded{background:-webkit-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-moz-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-o-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-ms-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fcf9ee 100%)}b,em,font-style italic,font-weight bold,i,ins,strong{text-decoration:none}del{text-decoration:line-through}sub,sup{bottom:0;line-height:18px}button,input{overflow:visible;border-radius:0}button{border:none;padding:6px 8px;font-size:1.2em;background:0 0}button[disabled]{color:#cbccbc!important}input,select,textarea{display:block;width:100%;padding:10px 8px;line-height:18px;border:none;font:inherit}select{height:38px}ol,ul{padding:0;margin:0;list-style-position:inside}li>ol,li>ul{margin-left:20px}hr{border:none;border-top:5px solid rgba(0,0,0,.05);margin:20px 0}kbd{display:inline-block;border:1px solid #ccc;margin:0 .1em;padding:.1em .6em;line-height:1.4;font-size:11px;background-color:#f7f7f7;-webkit-box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;border-radius:3px;color:#333;text-shadow:0 1px 0 #fff;white-space:nowrap}iframe{display:inline-block;border:none;max-width:100%}summary:hover{opacity:.8}details{padding:10px 20px 20px;border-bottom:2px dashed #ddd}details[open] summary{margin-bottom:20px}blockquote{border:none;margin:0!important}ol,p,ul{line-height:35px}p{margin:35px 0}@media only screen and (min-width:768px){ol,p,ul{line-height:30px}}a,button,input[type=submit]{cursor:pointer;text-decoration:none}.lk-link{color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.lk-link .md-code-inline{position:relative}.lk-link .md-code-inline:only-child{display:inline-block;line-height:17px}.lk-link .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.lk-link:visited{background-color:rgba(233,44,108,.04)}.lk-link:visited .md-code-inline:before{background-color:#e92c6c}.lk-link:hover{border-bottom:1px solid #e92c6c}.lk-rainbows{position:relative;color:#333;margin-bottom:5px}.lk-rainbows:hover:before{position:absolute;content:'';left:0;right:0;bottom:-8px;height:3px;opacity:.8;-webkit-transition:.1s ease-in-out;-moz-transition:.1s ease-in-out;-o-transition:.1s ease-in-out;-ms-transition:all .1s ease-in-out;transition:.1s ease-in-out;-webkit-animation:.5s infinite bg-rainbow;-moz-animation:.5s infinite bg-rainbow;-o-animation:.5s infinite bg-rainbow;-ms-animation:bg-rainbow .5s infinite;animation:.5s infinite bg-rainbow}.lk-icon{color:#333}.lk-icon:hover{color:#e92c6c}.lk-visitor{color:#333}.lk-visitor:after{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-left:5px}.lk-visitor.lk-visitor-large:after{font-size:1em}.lk-visitor:hover:after{color:#333;border-bottom-style:solid}.lk-visitor:visited:after{color:#7d5cff}.lk-visitor-inside{color:#333}.lk-visitor-inside .lk-visitor-target:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-inside.lk-visitor-large .lk-visitor-target:before{font-size:1em}.lk-visitor-inside:hover .lk-visitor-target:before{color:#333;border-bottom-style:solid}.lk-visitor-inside:visited .lk-visitor-target:before{color:#7d5cff}.lk-visitor-before{color:#333}.lk-visitor-before:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-before.lk-visitor-large:before{font-size:1em}.lk-visitor-before:hover:before{color:#333;border-bottom-style:solid}.lk-visitor-before:visited:before{color:#7d5cff}.lk-visitor-before-no-underline:before{border-bottom-width:0}.lk-link-to-green{color:#cbccbc}.lk-link-to-green:visited,.lk-link-to-green:visited:before{color:#1bc211;background-color:#1bc211}.lk-link-to-green:active{outline-color:#1bc211}.lk-link-to-green:hover,.lk-link-to-green:hover:before{color:#8be186;border-bottom-color:#1bc211}.lk-green .lk-link,a.lk-green{color:#1bc211}.lk-green .lk-link:visited,a.lk-green:visited{background-color:rgba(27,194,17,.04)}.lk-green .lk-link:visited .md-code-inline:before,a.lk-green:visited .md-code-inline:before{background-color:#1bc211}.lk-green .lk-link:active,a.lk-green:active{outline-color:#1bc211}.lk-green .lk-link:hover,a.lk-green:hover{border-bottom-color:#1bc211}.lk-green.lk-icon:hover{color:#1bc211}.lk-pink-light .lk-link,a.lk-pink-light{color:#ea6c93}.lk-pink-light .lk-link:visited,a.lk-pink-light:visited{background-color:rgba(234,108,147,.04)}.lk-pink-light .lk-link:visited .md-code-inline:before,a.lk-pink-light:visited .md-code-inline:before{background-color:#ea6c93}.lk-pink-light .lk-link:active,a.lk-pink-light:active{outline-color:#ea6c93}.lk-pink-light .lk-link:hover,a.lk-pink-light:hover{border-bottom-color:#ea6c93}.lk-pink-light.lk-icon:hover{color:#ea6c93}.lk-black .lk-link,a.lk-black{color:#333}.lk-black .lk-link:visited,a.lk-black:visited{background-color:rgba(51,51,51,.04)}.lk-black .lk-link:visited .md-code-inline:before,a.lk-black:visited .md-code-inline:before{background-color:#333}.lk-black .lk-link:active,a.lk-black:active{outline-color:#333}.lk-black .lk-link:hover,a.lk-black:hover{border-bottom-color:#333}.lk-black.lk-icon:hover{color:#333}.lk-gray .lk-link,a.lk-gray{color:#999}.lk-gray .lk-link:visited,a.lk-gray:visited{background-color:rgba(153,153,153,.04)}.lk-gray .lk-link:visited .md-code-inline:before,a.lk-gray:visited .md-code-inline:before{background-color:#999}.lk-gray .lk-link:active,a.lk-gray:active{outline-color:#999}.lk-gray .lk-link:hover,a.lk-gray:hover{border-bottom-color:#999}.lk-gray.lk-icon:hover{color:#999}.lk-white .lk-link,a.lk-white{color:#fcfcfc}.lk-white .lk-link:visited,a.lk-white:visited{background-color:rgba(252,252,252,.04)}.lk-white .lk-link:visited .md-code-inline:before,a.lk-white:visited .md-code-inline:before{background-color:#fcfcfc}.lk-white .lk-link:active,a.lk-white:active{outline-color:#fcfcfc}.lk-white .lk-link:hover,a.lk-white:hover{border-bottom-color:#fcfcfc}.lk-white.lk-icon:hover{color:#fcfcfc}.lk-orange .lk-link,a.lk-orange{color:#f3720d}.lk-orange .lk-link:visited,a.lk-orange:visited{background-color:rgba(243,114,13,.04)}.lk-orange .lk-link:visited .md-code-inline:before,a.lk-orange:visited .md-code-inline:before{background-color:#f3720d}.lk-orange .lk-link:active,a.lk-orange:active{outline-color:#f3720d}.lk-orange .lk-link:hover,a.lk-orange:hover{border-bottom-color:#f3720d}.lk-orange.lk-icon:hover{color:#f3720d}.lk-lilly .lk-link,a.lk-lilly{color:#7d5cff}.lk-lilly .lk-link:visited,a.lk-lilly:visited{background-color:rgba(125,92,255,.04)}.lk-lilly .lk-link:visited .md-code-inline:before,a.lk-lilly:visited .md-code-inline:before{background-color:#7d5cff}.lk-lilly .lk-link:active,a.lk-lilly:active{outline-color:#7d5cff}.lk-lilly .lk-link:hover,a.lk-lilly:hover{border-bottom-color:#7d5cff}.lk-lilly.lk-icon:hover{color:#7d5cff}.lk-blue .lk-link,a.lk-blue{color:#1a4d7f}.lk-blue .lk-link:visited,a.lk-blue:visited{background-color:rgba(26,77,127,.04)}.lk-blue .lk-link:visited .md-code-inline:before,a.lk-blue:visited .md-code-inline:before{background-color:#1a4d7f}.lk-blue .lk-link:active,a.lk-blue:active{outline-color:#1a4d7f}.lk-blue .lk-link:hover,a.lk-blue:hover{border-bottom-color:#1a4d7f}.lk-blue.lk-icon:hover{color:#1a4d7f}.lk-inherited .lk-link,a.lk-inherited{color:inherit}.lk-inherited .lk-link:active,a.lk-inherited:active{outline-color:inherit}.lk-inherited .lk-link:hover,a.lk-inherited:hover{border-bottom-color:inherit}.lk-inherited.lk-icon:hover{color:inherit}.lk-twitter .lk-link,a.lk-twitter{color:#55acee}.lk-twitter .lk-link:visited,a.lk-twitter:visited{background-color:rgba(85,172,238,.04)}.lk-twitter .lk-link:visited .md-code-inline:before,a.lk-twitter:visited .md-code-inline:before{background-color:#55acee}.lk-twitter .lk-link:active,a.lk-twitter:active{outline-color:#55acee}.lk-twitter .lk-link:hover,a.lk-twitter:hover{border-bottom-color:#55acee}.lk-twitter.lk-icon:hover{color:#55acee}.lk-facebook .lk-link,a.lk-facebook{color:#3b5998}.lk-facebook .lk-link:visited,a.lk-facebook:visited{background-color:rgba(59,89,152,.04)}.lk-facebook .lk-link:visited .md-code-inline:before,a.lk-facebook:visited .md-code-inline:before{background-color:#3b5998}.lk-facebook .lk-link:active,a.lk-facebook:active{outline-color:#3b5998}.lk-facebook .lk-link:hover,a.lk-facebook:hover{border-bottom-color:#3b5998}.lk-facebook.lk-icon:hover{color:#3b5998}.lk-clean{background-color:transparent}.lk-chrome:hover{color:#4989f4}.lk-teal .lk-link,a.lk-teal{color:#00a19c}.lk-teal .lk-link:visited,a.lk-teal:visited{background-color:rgba(0,161,156,.04)}.lk-teal .lk-link:visited .md-code-inline:before,a.lk-teal:visited .md-code-inline:before{background-color:#00a19c}.lk-teal .lk-link:active,a.lk-teal:active{outline-color:#00a19c}.lk-teal .lk-link:hover,a.lk-teal:hover{border-bottom-color:#00a19c}.lk-teal.lk-icon:hover{color:#00a19c}table{width:100%;border-spacing:0;border-collapse:separate}td,th{padding:8px}@media only screen and (max-width:950px){.table-responsive{display:block}.table-responsive>thead{display:none}.table-responsive>tbody,.table-responsive>tfoot{display:block}.table-responsive>tbody>tr,.table-responsive>tfoot>tr{display:block;background-color:rgba(203,204,188,.1);margin-bottom:30px}.table-responsive>tbody>tr:nth-child(even),.table-responsive>tfoot>tr:nth-child(even){background-color:rgba(203,204,188,.15)}.table-responsive>tbody>tr:last-child,.table-responsive>tfoot>tr:last-child{margin-bottom:0}.table-responsive>tbody>tr>td,.table-responsive>tfoot>tr>td{display:block;text-align:left}.table-responsive>tbody>tr>td:before,.table-responsive>tfoot>tr>td:before{display:block;content:attr(data-label);color:#555;font-size:13px;margin:0 0 5px}.table-responsive .table-responsive-hide{display:none}}.c-oreilly-teal{color:#00a19c}.c-yellow-highlight{color:#ffe270}.c-dark-orange{color:#f3720d}.c-pink{color:#e92c6c}.c-purple{color:#900070}.c-blue{color:#1a4d7f}.c-dark-turquoise{color:#1686a2}.c-dark-green{color:#1bc211}.c-white{color:#fcfcfc}.c-gray{color:#b7b7b7}.c-lilly{color:#7d5cff}.c-teal{color:#3aca96}.c-bg-oreilly-teal{background-color:#00a19c}.c-bg-yellow-highlight{background-color:#ffe270}.c-bg-dark-orange{background-color:#f3720d}.c-bg-pink{background-color:#e92c6c}.c-bg-purple{background-color:#900070}.c-bg-blue{background-color:#1a4d7f}.c-bg-dark-turquoise{background-color:#1686a2}.c-bg-dark-green{background-color:#1bc211}.c-bg-white{background-color:#fcfcfc}.c-bg-gray{background-color:#b7b7b7}.c-bg-lilly{background-color:#7d5cff}.c-bg-teal{background-color:#3aca96}.tj-emoji{width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em}.dc-header{margin-bottom:60px}.dc-heading{text-align:center;font-size:4em;padding:0 10px;margin-top:0;margin-bottom:10px}.dc-role{line-height:26px;padding:0 20px;margin-top:10px;text-align:center;font-style:italic;color:#cbccbc}.dc-colored{background:#f6f6f6;border-top:9px solid rgba(125,92,255,.5)}.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:800px}.md-markdown blockquote:not(.twitter-tweet){margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.md-markdown blockquote:not(.twitter-tweet) h1,.md-markdown blockquote:not(.twitter-tweet) h2,.md-markdown blockquote:not(.twitter-tweet) h3,.md-markdown blockquote:not(.twitter-tweet) h4,.md-markdown blockquote:not(.twitter-tweet) h5,.md-markdown blockquote:not(.twitter-tweet) h6{margin:-20px 0;padding:20px 0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block{margin:0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block:last-child{margin-bottom:-20px}.md-markdown img:first-child{margin-top:0}.md-markdown img:last-child{margin-bottom:0}.md-markdown p:first-child{margin-top:0}.md-markdown p:last-child{margin-bottom:0}.md-markdown .md-code-block+ol,.md-markdown .md-code-block+ul,.md-markdown ol+.md-code-block,.md-markdown ul+.md-code-block{margin-top:35px}.md-markdown a:not(.md-heading){color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.md-markdown a:not(.md-heading) .md-code-inline{position:relative}.md-markdown a:not(.md-heading) .md-code-inline:only-child{display:inline-block;line-height:17px}.md-markdown a:not(.md-heading) .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.md-markdown a:not(.md-heading):visited{background-color:rgba(233,44,108,.04)}.md-markdown a:not(.md-heading):visited .md-code-inline:before{background-color:#e92c6c}.md-markdown a:not(.md-heading):hover{border-bottom:1px solid #e92c6c}.md-markdown thead{background-color:#e0e0e0}.md-markdown tbody{background-color:#f6f6f6}.md-markdown tbody tr:nth-child(even){background-color:#f9f9f9}.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{padding:10px 0}.md-markdown h1:first-child,.md-markdown h2:first-child,.md-markdown h3:first-child,.md-markdown h4:first-child,.md-markdown h5:first-child,.md-markdown h6:first-child{margin-top:0}.md-markdown h1:last-child,.md-markdown h2:last-child,.md-markdown h3:last-child,.md-markdown h4:last-child,.md-markdown h5:last-child,.md-markdown h6:last-child{margin-bottom:0}.md-markdown iframe{display:block;margin:35px auto}.md-markdown iframe:first-child{margin-top:0}.md-markdown iframe:last-child{margin-bottom:0}.md-markdown li>p:only-child{display:inline}.md-markdown ul{list-style-type:none}.md-markdown ul>li:before{content:'◯';margin-right:5px}.md-heading{color:inherit}.md-markdown-inline{display:inline}.md-markdown-inline p{display:inline;line-height:initial}.md-code-block,.ocha-highlighted{margin:0 -20px}.ocha-code-block{padding:18px 50px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{max-width:inherit!important;margin:0 -20px;padding-left:20px;padding-right:20px}.md-code-block .md-code{display:block}.md-markdown-summary p{margin:10px 0}@media only screen and (min-width:768px){.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{margin-left:-40px;margin-right:-40px;padding:10px 40px}.md-code-block,.ocha-highlighted{margin:0 -40px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{margin:0 -40px;padding-left:40px;padding-right:40px}}@media only screen and (min-width:1300px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:900px}}@media only screen and (min-width:1400px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:1000px}.md-code-block,.md-markdown:not(.mm-content-html) .md-code-block+blockquote,.ocha-highlighted{margin:0 -400px 0 -40px}}.md-markdown-large blockquote,.md-markdown-large code,.md-markdown-large ol,.md-markdown-large p,.md-markdown-large table,.md-markdown-large ul{max-width:inherit}.md-footnotes{margin-top:80px;padding:20px 0;border-top:1px dashed #cbccbc}.md-footnote{margin:0;padding:8px 0;font-size:14px;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.md-footnote p{line-height:16px}.md-footnote-anchor{padding:2px 6px;margin-right:10px;text-align:center;font-weight:700;color:#e92c6c}.ly-custom-subheading .md-footnote-anchor,.ly-lean .md-footnote-anchor{font-family:Merriweather,Georgia,serif}.md-markdown a.md-footnote-anchor{border:1px solid #e92c6c}.md-markdown a.md-footnote-anchor:hover{background-color:#e92c6c;color:#fcfcfc}.md-footnote-ref{margin-left:1px;margin-right:3px}.md-markdown a.md-footnote-ref{border-bottom:1px dotted}.md-code-block,.md-code-inline{-webkit-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none;background:#fcfcf5;color:#4d4d4c}.md-code-block{line-height:24px}.md-code{padding:8px 10px}.md-code-inline{padding:0 6px}a .md-code{color:inherit}.md-code-comment{color:#8e908c}.md-code-attribute,.md-code-built_in,.md-code-constant,.md-code-literal,.md-code-number,.md-code-params,.md-code-pragma,.md-code-preprocessor,.md-code-regexp,.md-code-tag,.md-code-variable,.md-lang-css .md-code-class,.md-lang-css .md-code-id,.md-lang-css .md-code-pseudo,.md-lang-html .md-code-doctype,.md-lang-ruby .md-code-constant,.md-lang-xml .md-code-doctype,.md-lang-xml .md-code-pi,.md-lang-xml .md-code-tag .md-code-title,color #c82829{color:#f5871f}.md-lang-css .md-code-rule .md-code-attribute,.md-lang-ruby .md-code-class .md-code-title{color:#eab700}.md-code-header,.md-code-inheritance,.md-code-name,.md-code-string,.md-code-value,.md-lang-ruby .md-code-symbol,.md-lang-xml .md-code-cdata{color:#718c00}.md-code-title,.md-lang-css .md-code-hexcolor{color:#3e999f}.md-code-function,.md-lang-coffeescript .md-code-title,.md-lang-javascript .md-code-title,.md-lang-perl .md-code-sub,.md-lang-python .md-code-decorator,.md-lang-python .md-code-title,.md-lang-ruby .md-code-function .md-code-title,.md-lang-ruby .md-code-title .md-code-keyword{color:#4271ae}.md-code-keyword,.md-lang-javascript .md-code-function{color:#8959a8}.md-lang-coffeescript .md-lang-javascript,.md-lang-javascript .md-lang-xml,.md-lang-tex .md-code-formula,.md-lang-xml .md-code-cdata,.md-lang-xml .md-lang-css,.md-lang-xml .md-lang-javascript,.md-lang-xml .vbscript{opacity:.5}.md-code-deletion{background-color:rgba(244,0,30,.05);color:#f4001e}.md-code-addition{background-color:rgba(27,194,17,.05);color:#1bc211}.md-mark{background-color:rgba(255,226,112,.5);color:inherit}.md-mark span{color:inherit}.md-heading-hover{cursor:pointer;background-color:rgba(22,134,162,.1)}.mde-text-left{text-align:left}.mde-text-center{text-align:center}.mde-text-right{text-align:right}.mde-size-small{font-size:12px}.mde-size-small,.mde-size-small p{line-height:12px}.mde-size-large{font-size:36px}.mde-size-large,.mde-size-large p{line-height:36px}.mde-size-giant{font-size:72px}.mde-size-giant,.mde-size-giant p{line-height:72px}.mde-clearfix:after{content:' ';display:block;visibility:hidden;clear:both;font-size:0;height:0}.mde-quote{margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.mde-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.mde-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .mde-heading,.ly-lean .mde-heading{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .mde-subheading,.ly-lean .mde-subheading{font-family:Merriweather,Georgia,serif}.mde-pad-0{padding:0}.mde-pad-5{padding:5px}.mde-pad-10{padding:10px}.mde-pad-15{padding:15px}.mde-pad-20{padding:20px}.mde-pad-25{padding:25px}.mde-pad-30{padding:30px}.mde-pad-50{padding:50px}.mde-mar-0{margin:0}.mde-mar-5{margin:5px}.mde-mar-10{margin:10px}.mde-mar-15{margin:15px}.mde-mar-20{margin:20px}.mde-mar-25{margin:25px}.mde-mar-30{margin:30px}.mde-mar-50{margin:50px}@media only screen and (min-width:900px){.mde-left{float:left}.mde-right{float:right}.mde-inline{display:inline-block;vertical-align:top}.mde-20{max-width:20%}.mde-25{max-width:25%}.mde-33{max-width:33.3333333333%}.mde-50{max-width:50%}.mde-66{max-width:66.6666666666%}.mde-75{max-width:75%}}.twitter-tweet-figure{background:0 0;padding:0}.twitter-tweet-figure:before{content:none}.twitter-tweet-figure .twitter-tweet{margin:0 auto}blockquote.twitter-tweet{overflow:hidden;color:#1c2022;background-color:#fff;border:1px solid #e1e8ed;border-radius:4px;width:500px;max-width:100%;min-width:220px;padding:1.25rem 1.25rem .725rem}blockquote.twitter-tweet:before{content:none}blockquote.twitter-tweet p{white-space:pre-wrap;font:16px/1.4 Helvetica,Roboto,'Segoe UI',Calibri,'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}blockquote.twitter-tweet a,blockquote.twitter-tweet a:visited{color:#2b7bb9}.wy-container{margin:0 auto;padding:20px 0;max-width:800px}.wy-container .md-markdown p{line-height:22px;margin:10px 0}.wy-container .md-markdown p:first-child{margin-top:0}.wy-container .md-markdown p:last-child{margin-bottom:0}.wy-container .md-markdown blockquote:not(.twitter-tweet){padding:10px 0}.wy-container .md-code-block{margin:0;padding:10px;white-space:pre-wrap}.wy-table{width:100%;padding:0}.wy-td{padding:0}.wy-section-link,.wy-section-markdown,.wy-section-poll,.wy-section-summary{padding-top:25px}.wy-section-thanks{margin-top:25px;padding:10px;font-size:15px;background-color:#f2fcf2}.wy-header-text,.wy-issue{display:inline-block;margin:10px 0;line-height:24px}.wy-issue{float:right;font-size:12px}.wy-issue-content{display:block;padding:0 5px;background-color:#fcfcfc}.wy-section-header{padding-top:40px}.wy-section-header h1,.wy-section-header h2,.wy-section-header h3,.wy-section-header h4,.wy-section-header h5,.wy-section-header h6{margin:0}.wy-section-header p{line-height:inherit}.wy-header-td{padding:0}.wy-header-content{margin:0 10px}.wy-header-text{color:#fcfcfc;text-shadow:1px 1px 0 #1a4d7f;font-weight:700;font-size:24px}.wy-content{padding-bottom:25px}.wy-link-addendum,.wy-link-tag,.wy-link-title{display:inline-block;vertical-align:bottom;margin-bottom:10px}.wy-link-title{border-bottom:1px solid;font-size:20px;margin-right:10px}.wy-link-tag{background-color:#1a4d7f;color:#fcfcfc;text-transform:uppercase;font-size:13px;margin-right:5px;padding:2px 4px}.wy-link-tag:last-child{margin-right:0}.wy-link-addendum{color:#999;margin-left:5px}.wy-link-addendum:hover{border-bottom-color:transparent}.wy-link-title-section{position:relative}.wy-link-stats{position:absolute;right:0;background-color:#3aca96;color:#fcfcfc;border-bottom:1px solid #299a71}.wy-link-stats-logo{background-color:rgba(0,0,0,.1);color:#299a71}.wy-link-stat{margin:3px}.wy-link-description{font-size:14px;color:#666}.wy-link-source-section{margin-top:10px}.wy-link-source{margin-right:10px;margin-bottom:10px;display:inline-block;vertical-align:middle;color:#55acee}.wy-link-source-plain{color:#333}.wy-link-source.wy-link-source-plain a{color:#55acee}.wy-link-source.wy-link-source-plain a:visited{background-color:rgba(85,172,238,.04)}.wy-link-source.wy-link-source-plain a:visited .md-code-inline:before{background-color:#55acee}.wy-link-source.wy-link-source-plain a:active{outline-color:#55acee}.wy-link-source.wy-link-source-plain a:hover{border-bottom-color:#55acee}.wy-link-sponsor{background-color:transparent;color:#999;outline:#999 solid 1px}.wy-link-cell-before-image{vertical-align:middle;width:70%}.wy-link-cell-image{padding-left:10px}.wy-link-image-anchor{display:block;overflow:hidden;max-height:300px}.wy-link-image{display:block;margin:0 auto}.wy-footer-table{margin:20px 0}.wy-footer-cell{text-align:center}.wy-read-online{font-size:13px}.wy-section-link-job .wy-link-source,.wy-section-link-job .wy-link-title{font-size:14px}.wy-section-link-job .wy-link-description{font-size:12px}.wy-link-pixel{float:right}@media only screen and (max-width:500px){.wy-issue-publication,.wy-issue-separator{display:none}}.md-code-block{margin:0!important;padding:10px}</style>]]></description><link>https://ponyfoo.com/weekly/195/fractals-in-webassembly-async-iteration-for-nodejs-streams-tdd-scroll-to-text-fragment-and-immutable-code</link><guid isPermaLink="true">https://ponyfoo.com/weekly/195/fractals-in-webassembly-async-iteration-for-nodejs-streams-tdd-scroll-to-text-fragment-and-immutable-code</guid><category><![CDATA[deep-dive]]></category><category><![CDATA[webassembly]]></category><category><![CDATA[node.js]]></category><category><![CDATA[best-practices]]></category><category><![CDATA[news]]></category><category><![CDATA[javascript]]></category><category><![CDATA[css]]></category><dc:creator><![CDATA[nico@ponyfoo.com (Nicolás Bevacqua)]]></dc:creator><pubDate>Thu, 18 Feb 2021 12:00:51 GMT</pubDate></item><item><title><![CDATA[React Performance, Effortless Web Security, TypeScript Unions, WebAssembly, and MORE! 🤪  — Pony Foo Weekly]]></title><description><![CDATA[<div class="f-core"><div class="md-markdown"></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://nosleepjavascript.com/react-performance/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-194" style="color:#555;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>React is slow, what now?</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/performance" class="wy-link-tag">performance</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Grab a cup of coffee and enjoy the ride as we study React applications performance from the ground up, the processes involved, the tools to measure and identify slow parts, the important metrics to take in account, how these impact the UX and the various ways there are available to make applications super fast and smooth.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/franleplant?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-194" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>franleplant</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://engineering.q42.nl/passwordless-authentication?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-194" style="color:#555;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Effortless security on the web</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/best-practices" style="color:#900070;background-color:#ffe270" class="wy-link-tag">Best Practices</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>How to implement multi-device passwordless authentication on the web with the Web Authentication API.</p> </div></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-job"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://tinyurl.com/y56jwhqr?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-194" style="color:#555;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>The widest selection of tech remote jobs (powered by AI)</p> </a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Tired of looking for remote roles on multiple websites? Try <a href="http://bergamot.io/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-194" target="_blank" rel="noopener noreferrer">Bergamot.io</a>, a brand new website that aggregates vacancies from over 150,000 companies&#x2019; career pages. Select your stack or just past URL to Linkedin profile and you&#x2019;ll get relevant and up-to-date job selection.</p> </div></div><div class="wy-link-source-section"><span class="wy-link-source wy-link-source-plain md-markdown md-markdown-inline"><p><a href="http://bergamot.io/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-194" target="_blank" rel="noopener noreferrer">Bergamot.io</a></p> </span><a href="https://ponyfoo.com/weekly/links/tagged/sponsored" class="wy-link-tag wy-link-sponsor">Sponsored</a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://vasilyev-maksim.medium.com/discriminated-unions-in-typescript-why-is-it-so-good-6325681b2c3e?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-194" style="color:#555;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Discriminated unions in TypeScript</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/article" style="color:#e4f9e3;background-color:#1bc211" class="wy-link-tag">Article</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Discriminated unions allow us to precisely describe the structure of variadic models, instead of mixing all the fields into a single &#x201C;Frankenstein&#x201D; model.</p> </div></div><div class="wy-link-source-section"><span class="wy-link-source wy-link-source-plain md-markdown md-markdown-inline"><p>Vasilyev Maksim</p> </span></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://medium.com/@robaboukhalil/7a7daa4f2ecd?source=friends_link&amp;sk=9029f95ccadfbf82a026f282a4df6b2c&amp;utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-194" style="color:#555;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>WebAssembly and SIMD: A match made in the browser</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/webassembly" class="wy-link-tag">webassembly</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>How WebAssembly and SIMD enables running compute-intensive apps on the web</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/RobAboukhalil?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-194" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Robert Aboukhalil</p> </a></div></td><td class="wy-td wy-link-cell-image"><a href="https://medium.com/@robaboukhalil/7a7daa4f2ecd?source=friends_link&amp;sk=9029f95ccadfbf82a026f282a4df6b2c&amp;utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-194" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://miro.medium.com/max/759/1*OChqO9y1iP2XddAGOLY8tA.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://www.rainforestqa.com/blog/2020-03-09-replacing-recompose-with-react-hooks?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-194" style="color:#555;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Replacing Recompose with React Hooks</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/article" style="color:#e4f9e3;background-color:#1bc211" class="wy-link-tag">Article</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>AJ explains how their team recently made the decision to remove Recompose entirely &#x2013; which was a large endeavor. It touched over 200 files, and in some places was deeply coupled to core functionality of our app.This post covers why we decided to replace Recompose.</p> </div></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://tomekdev.com/posts/input-and-form/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-194" style="color:#555;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>If there is an input, there should be a form</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/best-practices" style="color:#900070;background-color:#ffe270" class="wy-link-tag">Best Practices</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Make every input on your page a bit happier and wrap it with a form. That&#x2019;s going to pay off in better UX, argues Tomek.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/tomekdev_?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-194" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Tomek Nie&#x17C;urawski</p> </a></div></td><td class="wy-td wy-link-cell-image"><a href="https://tomekdev.com/posts/input-and-form/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-194" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://tomekdev.com/static/a74ea3b3d44f7a89f8bdc6a17d971a41/003-form-is-there.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div></div><style>html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;position:relative;vertical-align:baseline}sup{top:-.5em}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto;resize:vertical;min-height:280px;max-height:900px}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item;margin:-10px -20px;padding:10px;background-color:#f6f6f6;cursor:pointer;border-bottom:2px solid #ddd}[hidden],template{display:none}body,body:after,body:before,html,html:after,html:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*,:after,:before{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}@-moz-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-webkit-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-o-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-moz-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-webkit-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-o-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}.f-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.f-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .f-heading,.ly-custom-heading h1,.ly-custom-heading h2,.ly-custom-heading h3,.ly-custom-heading h4,.ly-custom-heading h5,.ly-custom-heading h6,.ly-lean .f-heading,.ly-lean h1,.ly-lean h2,.ly-lean h3,.ly-lean h4,.ly-lean h5,.ly-lean h6{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .f-subheading,.ly-lean .f-subheading{font-family:Merriweather,Georgia,serif}body{margin:0;font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif;background:#fcfcfc;color:#333}img{max-width:100%;border:none}.md-markdown figure:not(.twitter-tweet-figure){background-color:#f6f6f6}.md-markdown figure:not(.twitter-tweet-figure)>a{display:block}.md-markdown figure:not(.twitter-tweet-figure)>a>img,.md-markdown figure:not(.twitter-tweet-figure)>img{display:block;margin-left:auto;margin-right:auto}.md-markdown figcaption{padding:10px;font-style:italic;font-size:14px;background:-webkit-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-moz-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-o-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-ms-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:linear-gradient(to right,#fff9e2 33%,#fcf9ee 100%);color:#555}.md-markdown .figure-has-loaded{background:-webkit-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-moz-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-o-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-ms-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fcf9ee 100%)}b,em,font-style italic,font-weight bold,i,ins,strong{text-decoration:none}del{text-decoration:line-through}sub,sup{bottom:0;line-height:18px}button,input{overflow:visible;border-radius:0}button{border:none;padding:6px 8px;font-size:1.2em;background:0 0}button[disabled]{color:#cbccbc!important}input,select,textarea{display:block;width:100%;padding:10px 8px;line-height:18px;border:none;font:inherit}select{height:38px}ol,ul{padding:0;margin:0;list-style-position:inside}li>ol,li>ul{margin-left:20px}hr{border:none;border-top:5px solid rgba(0,0,0,.05);margin:20px 0}kbd{display:inline-block;border:1px solid #ccc;margin:0 .1em;padding:.1em .6em;line-height:1.4;font-size:11px;background-color:#f7f7f7;-webkit-box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;border-radius:3px;color:#333;text-shadow:0 1px 0 #fff;white-space:nowrap}iframe{display:inline-block;border:none;max-width:100%}summary:hover{opacity:.8}details{padding:10px 20px 20px;border-bottom:2px dashed #ddd}details[open] summary{margin-bottom:20px}blockquote{border:none;margin:0!important}ol,p,ul{line-height:35px}p{margin:35px 0}@media only screen and (min-width:768px){ol,p,ul{line-height:30px}}a,button,input[type=submit]{cursor:pointer;text-decoration:none}.lk-link{color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.lk-link .md-code-inline{position:relative}.lk-link .md-code-inline:only-child{display:inline-block;line-height:17px}.lk-link .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.lk-link:visited{background-color:rgba(233,44,108,.04)}.lk-link:visited .md-code-inline:before{background-color:#e92c6c}.lk-link:hover{border-bottom:1px solid #e92c6c}.lk-rainbows{position:relative;color:#333;margin-bottom:5px}.lk-rainbows:hover:before{position:absolute;content:'';left:0;right:0;bottom:-8px;height:3px;opacity:.8;-webkit-transition:.1s ease-in-out;-moz-transition:.1s ease-in-out;-o-transition:.1s ease-in-out;-ms-transition:all .1s ease-in-out;transition:.1s ease-in-out;-webkit-animation:.5s infinite bg-rainbow;-moz-animation:.5s infinite bg-rainbow;-o-animation:.5s infinite bg-rainbow;-ms-animation:bg-rainbow .5s infinite;animation:.5s infinite bg-rainbow}.lk-icon{color:#333}.lk-icon:hover{color:#e92c6c}.lk-visitor{color:#333}.lk-visitor:after{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-left:5px}.lk-visitor.lk-visitor-large:after{font-size:1em}.lk-visitor:hover:after{color:#333;border-bottom-style:solid}.lk-visitor:visited:after{color:#7d5cff}.lk-visitor-inside{color:#333}.lk-visitor-inside .lk-visitor-target:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-inside.lk-visitor-large .lk-visitor-target:before{font-size:1em}.lk-visitor-inside:hover .lk-visitor-target:before{color:#333;border-bottom-style:solid}.lk-visitor-inside:visited .lk-visitor-target:before{color:#7d5cff}.lk-visitor-before{color:#333}.lk-visitor-before:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-before.lk-visitor-large:before{font-size:1em}.lk-visitor-before:hover:before{color:#333;border-bottom-style:solid}.lk-visitor-before:visited:before{color:#7d5cff}.lk-visitor-before-no-underline:before{border-bottom-width:0}.lk-link-to-green{color:#cbccbc}.lk-link-to-green:visited,.lk-link-to-green:visited:before{color:#1bc211;background-color:#1bc211}.lk-link-to-green:active{outline-color:#1bc211}.lk-link-to-green:hover,.lk-link-to-green:hover:before{color:#8be186;border-bottom-color:#1bc211}.lk-green .lk-link,a.lk-green{color:#1bc211}.lk-green .lk-link:visited,a.lk-green:visited{background-color:rgba(27,194,17,.04)}.lk-green .lk-link:visited .md-code-inline:before,a.lk-green:visited .md-code-inline:before{background-color:#1bc211}.lk-green .lk-link:active,a.lk-green:active{outline-color:#1bc211}.lk-green .lk-link:hover,a.lk-green:hover{border-bottom-color:#1bc211}.lk-green.lk-icon:hover{color:#1bc211}.lk-pink-light .lk-link,a.lk-pink-light{color:#ea6c93}.lk-pink-light .lk-link:visited,a.lk-pink-light:visited{background-color:rgba(234,108,147,.04)}.lk-pink-light .lk-link:visited .md-code-inline:before,a.lk-pink-light:visited .md-code-inline:before{background-color:#ea6c93}.lk-pink-light .lk-link:active,a.lk-pink-light:active{outline-color:#ea6c93}.lk-pink-light .lk-link:hover,a.lk-pink-light:hover{border-bottom-color:#ea6c93}.lk-pink-light.lk-icon:hover{color:#ea6c93}.lk-black .lk-link,a.lk-black{color:#333}.lk-black .lk-link:visited,a.lk-black:visited{background-color:rgba(51,51,51,.04)}.lk-black .lk-link:visited .md-code-inline:before,a.lk-black:visited .md-code-inline:before{background-color:#333}.lk-black .lk-link:active,a.lk-black:active{outline-color:#333}.lk-black .lk-link:hover,a.lk-black:hover{border-bottom-color:#333}.lk-black.lk-icon:hover{color:#333}.lk-gray .lk-link,a.lk-gray{color:#999}.lk-gray .lk-link:visited,a.lk-gray:visited{background-color:rgba(153,153,153,.04)}.lk-gray .lk-link:visited .md-code-inline:before,a.lk-gray:visited .md-code-inline:before{background-color:#999}.lk-gray .lk-link:active,a.lk-gray:active{outline-color:#999}.lk-gray .lk-link:hover,a.lk-gray:hover{border-bottom-color:#999}.lk-gray.lk-icon:hover{color:#999}.lk-white .lk-link,a.lk-white{color:#fcfcfc}.lk-white .lk-link:visited,a.lk-white:visited{background-color:rgba(252,252,252,.04)}.lk-white .lk-link:visited .md-code-inline:before,a.lk-white:visited .md-code-inline:before{background-color:#fcfcfc}.lk-white .lk-link:active,a.lk-white:active{outline-color:#fcfcfc}.lk-white .lk-link:hover,a.lk-white:hover{border-bottom-color:#fcfcfc}.lk-white.lk-icon:hover{color:#fcfcfc}.lk-orange .lk-link,a.lk-orange{color:#f3720d}.lk-orange .lk-link:visited,a.lk-orange:visited{background-color:rgba(243,114,13,.04)}.lk-orange .lk-link:visited .md-code-inline:before,a.lk-orange:visited .md-code-inline:before{background-color:#f3720d}.lk-orange .lk-link:active,a.lk-orange:active{outline-color:#f3720d}.lk-orange .lk-link:hover,a.lk-orange:hover{border-bottom-color:#f3720d}.lk-orange.lk-icon:hover{color:#f3720d}.lk-lilly .lk-link,a.lk-lilly{color:#7d5cff}.lk-lilly .lk-link:visited,a.lk-lilly:visited{background-color:rgba(125,92,255,.04)}.lk-lilly .lk-link:visited .md-code-inline:before,a.lk-lilly:visited .md-code-inline:before{background-color:#7d5cff}.lk-lilly .lk-link:active,a.lk-lilly:active{outline-color:#7d5cff}.lk-lilly .lk-link:hover,a.lk-lilly:hover{border-bottom-color:#7d5cff}.lk-lilly.lk-icon:hover{color:#7d5cff}.lk-blue .lk-link,a.lk-blue{color:#1a4d7f}.lk-blue .lk-link:visited,a.lk-blue:visited{background-color:rgba(26,77,127,.04)}.lk-blue .lk-link:visited .md-code-inline:before,a.lk-blue:visited .md-code-inline:before{background-color:#1a4d7f}.lk-blue .lk-link:active,a.lk-blue:active{outline-color:#1a4d7f}.lk-blue .lk-link:hover,a.lk-blue:hover{border-bottom-color:#1a4d7f}.lk-blue.lk-icon:hover{color:#1a4d7f}.lk-inherited .lk-link,a.lk-inherited{color:inherit}.lk-inherited .lk-link:active,a.lk-inherited:active{outline-color:inherit}.lk-inherited .lk-link:hover,a.lk-inherited:hover{border-bottom-color:inherit}.lk-inherited.lk-icon:hover{color:inherit}.lk-twitter .lk-link,a.lk-twitter{color:#55acee}.lk-twitter .lk-link:visited,a.lk-twitter:visited{background-color:rgba(85,172,238,.04)}.lk-twitter .lk-link:visited .md-code-inline:before,a.lk-twitter:visited .md-code-inline:before{background-color:#55acee}.lk-twitter .lk-link:active,a.lk-twitter:active{outline-color:#55acee}.lk-twitter .lk-link:hover,a.lk-twitter:hover{border-bottom-color:#55acee}.lk-twitter.lk-icon:hover{color:#55acee}.lk-facebook .lk-link,a.lk-facebook{color:#3b5998}.lk-facebook .lk-link:visited,a.lk-facebook:visited{background-color:rgba(59,89,152,.04)}.lk-facebook .lk-link:visited .md-code-inline:before,a.lk-facebook:visited .md-code-inline:before{background-color:#3b5998}.lk-facebook .lk-link:active,a.lk-facebook:active{outline-color:#3b5998}.lk-facebook .lk-link:hover,a.lk-facebook:hover{border-bottom-color:#3b5998}.lk-facebook.lk-icon:hover{color:#3b5998}.lk-clean{background-color:transparent}.lk-chrome:hover{color:#4989f4}.lk-teal .lk-link,a.lk-teal{color:#00a19c}.lk-teal .lk-link:visited,a.lk-teal:visited{background-color:rgba(0,161,156,.04)}.lk-teal .lk-link:visited .md-code-inline:before,a.lk-teal:visited .md-code-inline:before{background-color:#00a19c}.lk-teal .lk-link:active,a.lk-teal:active{outline-color:#00a19c}.lk-teal .lk-link:hover,a.lk-teal:hover{border-bottom-color:#00a19c}.lk-teal.lk-icon:hover{color:#00a19c}table{width:100%;border-spacing:0;border-collapse:separate}td,th{padding:8px}@media only screen and (max-width:950px){.table-responsive{display:block}.table-responsive>thead{display:none}.table-responsive>tbody,.table-responsive>tfoot{display:block}.table-responsive>tbody>tr,.table-responsive>tfoot>tr{display:block;background-color:rgba(203,204,188,.1);margin-bottom:30px}.table-responsive>tbody>tr:nth-child(even),.table-responsive>tfoot>tr:nth-child(even){background-color:rgba(203,204,188,.15)}.table-responsive>tbody>tr:last-child,.table-responsive>tfoot>tr:last-child{margin-bottom:0}.table-responsive>tbody>tr>td,.table-responsive>tfoot>tr>td{display:block;text-align:left}.table-responsive>tbody>tr>td:before,.table-responsive>tfoot>tr>td:before{display:block;content:attr(data-label);color:#555;font-size:13px;margin:0 0 5px}.table-responsive .table-responsive-hide{display:none}}.c-oreilly-teal{color:#00a19c}.c-yellow-highlight{color:#ffe270}.c-dark-orange{color:#f3720d}.c-pink{color:#e92c6c}.c-purple{color:#900070}.c-blue{color:#1a4d7f}.c-dark-turquoise{color:#1686a2}.c-dark-green{color:#1bc211}.c-white{color:#fcfcfc}.c-gray{color:#b7b7b7}.c-lilly{color:#7d5cff}.c-teal{color:#3aca96}.c-bg-oreilly-teal{background-color:#00a19c}.c-bg-yellow-highlight{background-color:#ffe270}.c-bg-dark-orange{background-color:#f3720d}.c-bg-pink{background-color:#e92c6c}.c-bg-purple{background-color:#900070}.c-bg-blue{background-color:#1a4d7f}.c-bg-dark-turquoise{background-color:#1686a2}.c-bg-dark-green{background-color:#1bc211}.c-bg-white{background-color:#fcfcfc}.c-bg-gray{background-color:#b7b7b7}.c-bg-lilly{background-color:#7d5cff}.c-bg-teal{background-color:#3aca96}.tj-emoji{width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em}.dc-header{margin-bottom:60px}.dc-heading{text-align:center;font-size:4em;padding:0 10px;margin-top:0;margin-bottom:10px}.dc-role{line-height:26px;padding:0 20px;margin-top:10px;text-align:center;font-style:italic;color:#cbccbc}.dc-colored{background:#f6f6f6;border-top:9px solid rgba(125,92,255,.5)}.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:800px}.md-markdown blockquote:not(.twitter-tweet){margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.md-markdown blockquote:not(.twitter-tweet) h1,.md-markdown blockquote:not(.twitter-tweet) h2,.md-markdown blockquote:not(.twitter-tweet) h3,.md-markdown blockquote:not(.twitter-tweet) h4,.md-markdown blockquote:not(.twitter-tweet) h5,.md-markdown blockquote:not(.twitter-tweet) h6{margin:-20px 0;padding:20px 0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block{margin:0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block:last-child{margin-bottom:-20px}.md-markdown img:first-child{margin-top:0}.md-markdown img:last-child{margin-bottom:0}.md-markdown p:first-child{margin-top:0}.md-markdown p:last-child{margin-bottom:0}.md-markdown .md-code-block+ol,.md-markdown .md-code-block+ul,.md-markdown ol+.md-code-block,.md-markdown ul+.md-code-block{margin-top:35px}.md-markdown a:not(.md-heading){color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.md-markdown a:not(.md-heading) .md-code-inline{position:relative}.md-markdown a:not(.md-heading) .md-code-inline:only-child{display:inline-block;line-height:17px}.md-markdown a:not(.md-heading) .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.md-markdown a:not(.md-heading):visited{background-color:rgba(233,44,108,.04)}.md-markdown a:not(.md-heading):visited .md-code-inline:before{background-color:#e92c6c}.md-markdown a:not(.md-heading):hover{border-bottom:1px solid #e92c6c}.md-markdown thead{background-color:#e0e0e0}.md-markdown tbody{background-color:#f6f6f6}.md-markdown tbody tr:nth-child(even){background-color:#f9f9f9}.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{padding:10px 0}.md-markdown h1:first-child,.md-markdown h2:first-child,.md-markdown h3:first-child,.md-markdown h4:first-child,.md-markdown h5:first-child,.md-markdown h6:first-child{margin-top:0}.md-markdown h1:last-child,.md-markdown h2:last-child,.md-markdown h3:last-child,.md-markdown h4:last-child,.md-markdown h5:last-child,.md-markdown h6:last-child{margin-bottom:0}.md-markdown iframe{display:block;margin:35px auto}.md-markdown iframe:first-child{margin-top:0}.md-markdown iframe:last-child{margin-bottom:0}.md-markdown li>p:only-child{display:inline}.md-markdown ul{list-style-type:none}.md-markdown ul>li:before{content:'◯';margin-right:5px}.md-heading{color:inherit}.md-markdown-inline{display:inline}.md-markdown-inline p{display:inline;line-height:initial}.md-code-block,.ocha-highlighted{margin:0 -20px}.ocha-code-block{padding:18px 50px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{max-width:inherit!important;margin:0 -20px;padding-left:20px;padding-right:20px}.md-code-block .md-code{display:block}.md-markdown-summary p{margin:10px 0}@media only screen and (min-width:768px){.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{margin-left:-40px;margin-right:-40px;padding:10px 40px}.md-code-block,.ocha-highlighted{margin:0 -40px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{margin:0 -40px;padding-left:40px;padding-right:40px}}@media only screen and (min-width:1300px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:900px}}@media only screen and (min-width:1400px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:1000px}.md-code-block,.md-markdown:not(.mm-content-html) .md-code-block+blockquote,.ocha-highlighted{margin:0 -400px 0 -40px}}.md-markdown-large blockquote,.md-markdown-large code,.md-markdown-large ol,.md-markdown-large p,.md-markdown-large table,.md-markdown-large ul{max-width:inherit}.md-footnotes{margin-top:80px;padding:20px 0;border-top:1px dashed #cbccbc}.md-footnote{margin:0;padding:8px 0;font-size:14px;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.md-footnote p{line-height:16px}.md-footnote-anchor{padding:2px 6px;margin-right:10px;text-align:center;font-weight:700;color:#e92c6c}.ly-custom-subheading .md-footnote-anchor,.ly-lean .md-footnote-anchor{font-family:Merriweather,Georgia,serif}.md-markdown a.md-footnote-anchor{border:1px solid #e92c6c}.md-markdown a.md-footnote-anchor:hover{background-color:#e92c6c;color:#fcfcfc}.md-footnote-ref{margin-left:1px;margin-right:3px}.md-markdown a.md-footnote-ref{border-bottom:1px dotted}.md-code-block,.md-code-inline{-webkit-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none;background:#fcfcf5;color:#4d4d4c}.md-code-block{line-height:24px}.md-code{padding:8px 10px}.md-code-inline{padding:0 6px}a .md-code{color:inherit}.md-code-comment{color:#8e908c}.md-code-attribute,.md-code-built_in,.md-code-constant,.md-code-literal,.md-code-number,.md-code-params,.md-code-pragma,.md-code-preprocessor,.md-code-regexp,.md-code-tag,.md-code-variable,.md-lang-css .md-code-class,.md-lang-css .md-code-id,.md-lang-css .md-code-pseudo,.md-lang-html .md-code-doctype,.md-lang-ruby .md-code-constant,.md-lang-xml .md-code-doctype,.md-lang-xml .md-code-pi,.md-lang-xml .md-code-tag .md-code-title,color #c82829{color:#f5871f}.md-lang-css .md-code-rule .md-code-attribute,.md-lang-ruby .md-code-class .md-code-title{color:#eab700}.md-code-header,.md-code-inheritance,.md-code-name,.md-code-string,.md-code-value,.md-lang-ruby .md-code-symbol,.md-lang-xml .md-code-cdata{color:#718c00}.md-code-title,.md-lang-css .md-code-hexcolor{color:#3e999f}.md-code-function,.md-lang-coffeescript .md-code-title,.md-lang-javascript .md-code-title,.md-lang-perl .md-code-sub,.md-lang-python .md-code-decorator,.md-lang-python .md-code-title,.md-lang-ruby .md-code-function .md-code-title,.md-lang-ruby .md-code-title .md-code-keyword{color:#4271ae}.md-code-keyword,.md-lang-javascript .md-code-function{color:#8959a8}.md-lang-coffeescript .md-lang-javascript,.md-lang-javascript .md-lang-xml,.md-lang-tex .md-code-formula,.md-lang-xml .md-code-cdata,.md-lang-xml .md-lang-css,.md-lang-xml .md-lang-javascript,.md-lang-xml .vbscript{opacity:.5}.md-code-deletion{background-color:rgba(244,0,30,.05);color:#f4001e}.md-code-addition{background-color:rgba(27,194,17,.05);color:#1bc211}.md-mark{background-color:rgba(255,226,112,.5);color:inherit}.md-mark span{color:inherit}.md-heading-hover{cursor:pointer;background-color:rgba(22,134,162,.1)}.mde-text-left{text-align:left}.mde-text-center{text-align:center}.mde-text-right{text-align:right}.mde-size-small{font-size:12px}.mde-size-small,.mde-size-small p{line-height:12px}.mde-size-large{font-size:36px}.mde-size-large,.mde-size-large p{line-height:36px}.mde-size-giant{font-size:72px}.mde-size-giant,.mde-size-giant p{line-height:72px}.mde-clearfix:after{content:' ';display:block;visibility:hidden;clear:both;font-size:0;height:0}.mde-quote{margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.mde-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.mde-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .mde-heading,.ly-lean .mde-heading{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .mde-subheading,.ly-lean .mde-subheading{font-family:Merriweather,Georgia,serif}.mde-pad-0{padding:0}.mde-pad-5{padding:5px}.mde-pad-10{padding:10px}.mde-pad-15{padding:15px}.mde-pad-20{padding:20px}.mde-pad-25{padding:25px}.mde-pad-30{padding:30px}.mde-pad-50{padding:50px}.mde-mar-0{margin:0}.mde-mar-5{margin:5px}.mde-mar-10{margin:10px}.mde-mar-15{margin:15px}.mde-mar-20{margin:20px}.mde-mar-25{margin:25px}.mde-mar-30{margin:30px}.mde-mar-50{margin:50px}@media only screen and (min-width:900px){.mde-left{float:left}.mde-right{float:right}.mde-inline{display:inline-block;vertical-align:top}.mde-20{max-width:20%}.mde-25{max-width:25%}.mde-33{max-width:33.3333333333%}.mde-50{max-width:50%}.mde-66{max-width:66.6666666666%}.mde-75{max-width:75%}}.twitter-tweet-figure{background:0 0;padding:0}.twitter-tweet-figure:before{content:none}.twitter-tweet-figure .twitter-tweet{margin:0 auto}blockquote.twitter-tweet{overflow:hidden;color:#1c2022;background-color:#fff;border:1px solid #e1e8ed;border-radius:4px;width:500px;max-width:100%;min-width:220px;padding:1.25rem 1.25rem .725rem}blockquote.twitter-tweet:before{content:none}blockquote.twitter-tweet p{white-space:pre-wrap;font:16px/1.4 Helvetica,Roboto,'Segoe UI',Calibri,'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}blockquote.twitter-tweet a,blockquote.twitter-tweet a:visited{color:#2b7bb9}.wy-container{margin:0 auto;padding:20px 0;max-width:800px}.wy-container .md-markdown p{line-height:22px;margin:10px 0}.wy-container .md-markdown p:first-child{margin-top:0}.wy-container .md-markdown p:last-child{margin-bottom:0}.wy-container .md-markdown blockquote:not(.twitter-tweet){padding:10px 0}.wy-container .md-code-block{margin:0;padding:10px;white-space:pre-wrap}.wy-table{width:100%;padding:0}.wy-td{padding:0}.wy-section-link,.wy-section-markdown,.wy-section-poll,.wy-section-summary{padding-top:25px}.wy-section-thanks{margin-top:25px;padding:10px;font-size:15px;background-color:#f2fcf2}.wy-header-text,.wy-issue{display:inline-block;margin:10px 0;line-height:24px}.wy-issue{float:right;font-size:12px}.wy-issue-content{display:block;padding:0 5px;background-color:#fcfcfc}.wy-section-header{padding-top:40px}.wy-section-header h1,.wy-section-header h2,.wy-section-header h3,.wy-section-header h4,.wy-section-header h5,.wy-section-header h6{margin:0}.wy-section-header p{line-height:inherit}.wy-header-td{padding:0}.wy-header-content{margin:0 10px}.wy-header-text{color:#fcfcfc;text-shadow:1px 1px 0 #1a4d7f;font-weight:700;font-size:24px}.wy-content{padding-bottom:25px}.wy-link-addendum,.wy-link-tag,.wy-link-title{display:inline-block;vertical-align:bottom;margin-bottom:10px}.wy-link-title{border-bottom:1px solid;font-size:20px;margin-right:10px}.wy-link-tag{background-color:#1a4d7f;color:#fcfcfc;text-transform:uppercase;font-size:13px;margin-right:5px;padding:2px 4px}.wy-link-tag:last-child{margin-right:0}.wy-link-addendum{color:#999;margin-left:5px}.wy-link-addendum:hover{border-bottom-color:transparent}.wy-link-title-section{position:relative}.wy-link-stats{position:absolute;right:0;background-color:#3aca96;color:#fcfcfc;border-bottom:1px solid #299a71}.wy-link-stats-logo{background-color:rgba(0,0,0,.1);color:#299a71}.wy-link-stat{margin:3px}.wy-link-description{font-size:14px;color:#666}.wy-link-source-section{margin-top:10px}.wy-link-source{margin-right:10px;margin-bottom:10px;display:inline-block;vertical-align:middle;color:#55acee}.wy-link-source-plain{color:#333}.wy-link-source.wy-link-source-plain a{color:#55acee}.wy-link-source.wy-link-source-plain a:visited{background-color:rgba(85,172,238,.04)}.wy-link-source.wy-link-source-plain a:visited .md-code-inline:before{background-color:#55acee}.wy-link-source.wy-link-source-plain a:active{outline-color:#55acee}.wy-link-source.wy-link-source-plain a:hover{border-bottom-color:#55acee}.wy-link-sponsor{background-color:transparent;color:#999;outline:#999 solid 1px}.wy-link-cell-before-image{vertical-align:middle;width:70%}.wy-link-cell-image{padding-left:10px}.wy-link-image-anchor{display:block;overflow:hidden;max-height:300px}.wy-link-image{display:block;margin:0 auto}.wy-footer-table{margin:20px 0}.wy-footer-cell{text-align:center}.wy-read-online{font-size:13px}.wy-section-link-job .wy-link-source,.wy-section-link-job .wy-link-title{font-size:14px}.wy-section-link-job .wy-link-description{font-size:12px}.wy-link-pixel{float:right}@media only screen and (max-width:500px){.wy-issue-publication,.wy-issue-separator{display:none}}.md-code-block{margin:0!important;padding:10px}</style>]]></description><link>https://ponyfoo.com/weekly/194/react-performance-effortless-web-security-typescript-unions-webassembly-and-more</link><guid isPermaLink="true">https://ponyfoo.com/weekly/194/react-performance-effortless-web-security-typescript-unions-webassembly-and-more</guid><category><![CDATA[performance]]></category><category><![CDATA[best-practices]]></category><category><![CDATA[article]]></category><category><![CDATA[webassembly]]></category><category><![CDATA[javascript]]></category><category><![CDATA[css]]></category><dc:creator><![CDATA[nico@ponyfoo.com (Nicolás Bevacqua)]]></dc:creator><pubDate>Fri, 12 Feb 2021 14:04:39 GMT</pubDate></item><item><title><![CDATA[Accidents in space, React app bugs, Color vision in Chrome DevTools, and RegExp DoS! 🛰  — Pony Foo Weekly]]></title><description><![CDATA[<div class="f-core"><div class="md-markdown"><p>We&#x2019;re glad you could make it this week! </p> <p>With your help, we can make Pony Foo Weekly <em>even more</em> awesome: <a href="https://ponyfoo.com/weekly/submissions?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-193" target="_blank" rel="noopener noreferrer">send tips about cool resources</a>.</p> </div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://evilmartians.com/chronicles/what-i-learned-as-a-developer-from-accidents-in-space?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-193" style="color:#1bc211;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>What I, as a developer, learned from accidents in space</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/article" style="color:#e4f9e3;background-color:#1bc211" class="wy-link-tag">Article</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>How Soviet space tales help the creator of PostCSS to follow best practices in development.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/sitnikcode?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-193" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Andrey Sitnik</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-primary"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://tinyurl.com/yxcbnnvw?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-193" style="color:#1bc211;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>How to measure and improve Node.js performance</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/node.js" class="wy-link-tag">node.js</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>If JavaScript is so fast, why are so many Node.js applications slow? I&#x2019;ll show how we can profile a Node app using both the built-in profiler and Raygun.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/raygunio?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-193" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Raygun</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/sponsored" class="wy-link-tag wy-link-sponsor">Sponsored</a></div></td><td class="wy-td wy-link-cell-image"><a href="https://tinyurl.com/yxcbnnvw?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-193" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://raygun.com/blog/images/measure-node-performance/feature.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://www.youtube.com/watch?v=LnapsmokM_4&amp;utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-193" style="color:#1bc211;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Simulating color vision deficiencies in the Blink Renderer</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/talk" style="color:#fbf2f5;background-color:#e92c6c" class="wy-link-tag">Talk</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>How Chrome DevTools implemented color vision deficiency simulation by combining HTML/CSS/SVG knowledge with C++.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/mathias?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-193" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Mathias Bynens</p> </a></div></td><td class="wy-td wy-link-cell-image"><a href="https://www.youtube.com/watch?v=LnapsmokM_4&amp;utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-193" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://i.ytimg.com/vi/LnapsmokM_4/maxresdefault.jpg" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://charlypoly.com/publications/blazing-fast-bug-solving-react?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-193" style="color:#1bc211;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Fast bug solving on React apps</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/best-practices" style="color:#900070;background-color:#ffe270" class="wy-link-tag">Best Practices</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Charly offers tips to improve your bug solving strategy.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/where_is_charly?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-193" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Charly Poly</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://blog.superhuman.com/how-to-eliminate-regular-expression-denial-of-service-f8983bb76afc?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-193" style="color:#1bc211;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>How to eliminate regular expression denial of service</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/best-practices" style="color:#900070;background-color:#ffe270" class="wy-link-tag">Best Practices</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>When regexes go wrong, they go devastatingly wrong. Conrad shares how to avoid catastrophic downtime that you would only see in production.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/conradirwin?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-193" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Conrad Irwin</p> </a></div></td></tr></table></td></tr></table></div></div><style>html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;position:relative;vertical-align:baseline}sup{top:-.5em}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto;resize:vertical;min-height:280px;max-height:900px}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item;margin:-10px -20px;padding:10px;background-color:#f6f6f6;cursor:pointer;border-bottom:2px solid #ddd}[hidden],template{display:none}body,body:after,body:before,html,html:after,html:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*,:after,:before{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}@-moz-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-webkit-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-o-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-moz-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-webkit-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-o-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}.f-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.f-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .f-heading,.ly-custom-heading h1,.ly-custom-heading h2,.ly-custom-heading h3,.ly-custom-heading h4,.ly-custom-heading h5,.ly-custom-heading h6,.ly-lean .f-heading,.ly-lean h1,.ly-lean h2,.ly-lean h3,.ly-lean h4,.ly-lean h5,.ly-lean h6{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .f-subheading,.ly-lean .f-subheading{font-family:Merriweather,Georgia,serif}body{margin:0;font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif;background:#fcfcfc;color:#333}img{max-width:100%;border:none}.md-markdown figure:not(.twitter-tweet-figure){background-color:#f6f6f6}.md-markdown figure:not(.twitter-tweet-figure)>a{display:block}.md-markdown figure:not(.twitter-tweet-figure)>a>img,.md-markdown figure:not(.twitter-tweet-figure)>img{display:block;margin-left:auto;margin-right:auto}.md-markdown figcaption{padding:10px;font-style:italic;font-size:14px;background:-webkit-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-moz-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-o-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-ms-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:linear-gradient(to right,#fff9e2 33%,#fcf9ee 100%);color:#555}.md-markdown .figure-has-loaded{background:-webkit-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-moz-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-o-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-ms-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fcf9ee 100%)}b,em,font-style italic,font-weight bold,i,ins,strong{text-decoration:none}del{text-decoration:line-through}sub,sup{bottom:0;line-height:18px}button,input{overflow:visible;border-radius:0}button{border:none;padding:6px 8px;font-size:1.2em;background:0 0}button[disabled]{color:#cbccbc!important}input,select,textarea{display:block;width:100%;padding:10px 8px;line-height:18px;border:none;font:inherit}select{height:38px}ol,ul{padding:0;margin:0;list-style-position:inside}li>ol,li>ul{margin-left:20px}hr{border:none;border-top:5px solid rgba(0,0,0,.05);margin:20px 0}kbd{display:inline-block;border:1px solid #ccc;margin:0 .1em;padding:.1em .6em;line-height:1.4;font-size:11px;background-color:#f7f7f7;-webkit-box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;border-radius:3px;color:#333;text-shadow:0 1px 0 #fff;white-space:nowrap}iframe{display:inline-block;border:none;max-width:100%}summary:hover{opacity:.8}details{padding:10px 20px 20px;border-bottom:2px dashed #ddd}details[open] summary{margin-bottom:20px}blockquote{border:none;margin:0!important}ol,p,ul{line-height:35px}p{margin:35px 0}@media only screen and (min-width:768px){ol,p,ul{line-height:30px}}a,button,input[type=submit]{cursor:pointer;text-decoration:none}.lk-link{color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.lk-link .md-code-inline{position:relative}.lk-link .md-code-inline:only-child{display:inline-block;line-height:17px}.lk-link .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.lk-link:visited{background-color:rgba(233,44,108,.04)}.lk-link:visited .md-code-inline:before{background-color:#e92c6c}.lk-link:hover{border-bottom:1px solid #e92c6c}.lk-rainbows{position:relative;color:#333;margin-bottom:5px}.lk-rainbows:hover:before{position:absolute;content:'';left:0;right:0;bottom:-8px;height:3px;opacity:.8;-webkit-transition:.1s ease-in-out;-moz-transition:.1s ease-in-out;-o-transition:.1s ease-in-out;-ms-transition:all .1s ease-in-out;transition:.1s ease-in-out;-webkit-animation:.5s infinite bg-rainbow;-moz-animation:.5s infinite bg-rainbow;-o-animation:.5s infinite bg-rainbow;-ms-animation:bg-rainbow .5s infinite;animation:.5s infinite bg-rainbow}.lk-icon{color:#333}.lk-icon:hover{color:#e92c6c}.lk-visitor{color:#333}.lk-visitor:after{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-left:5px}.lk-visitor.lk-visitor-large:after{font-size:1em}.lk-visitor:hover:after{color:#333;border-bottom-style:solid}.lk-visitor:visited:after{color:#7d5cff}.lk-visitor-inside{color:#333}.lk-visitor-inside .lk-visitor-target:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-inside.lk-visitor-large .lk-visitor-target:before{font-size:1em}.lk-visitor-inside:hover .lk-visitor-target:before{color:#333;border-bottom-style:solid}.lk-visitor-inside:visited .lk-visitor-target:before{color:#7d5cff}.lk-visitor-before{color:#333}.lk-visitor-before:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-before.lk-visitor-large:before{font-size:1em}.lk-visitor-before:hover:before{color:#333;border-bottom-style:solid}.lk-visitor-before:visited:before{color:#7d5cff}.lk-visitor-before-no-underline:before{border-bottom-width:0}.lk-link-to-green{color:#cbccbc}.lk-link-to-green:visited,.lk-link-to-green:visited:before{color:#1bc211;background-color:#1bc211}.lk-link-to-green:active{outline-color:#1bc211}.lk-link-to-green:hover,.lk-link-to-green:hover:before{color:#8be186;border-bottom-color:#1bc211}.lk-green .lk-link,a.lk-green{color:#1bc211}.lk-green .lk-link:visited,a.lk-green:visited{background-color:rgba(27,194,17,.04)}.lk-green .lk-link:visited .md-code-inline:before,a.lk-green:visited .md-code-inline:before{background-color:#1bc211}.lk-green .lk-link:active,a.lk-green:active{outline-color:#1bc211}.lk-green .lk-link:hover,a.lk-green:hover{border-bottom-color:#1bc211}.lk-green.lk-icon:hover{color:#1bc211}.lk-pink-light .lk-link,a.lk-pink-light{color:#ea6c93}.lk-pink-light .lk-link:visited,a.lk-pink-light:visited{background-color:rgba(234,108,147,.04)}.lk-pink-light .lk-link:visited .md-code-inline:before,a.lk-pink-light:visited .md-code-inline:before{background-color:#ea6c93}.lk-pink-light .lk-link:active,a.lk-pink-light:active{outline-color:#ea6c93}.lk-pink-light .lk-link:hover,a.lk-pink-light:hover{border-bottom-color:#ea6c93}.lk-pink-light.lk-icon:hover{color:#ea6c93}.lk-black .lk-link,a.lk-black{color:#333}.lk-black .lk-link:visited,a.lk-black:visited{background-color:rgba(51,51,51,.04)}.lk-black .lk-link:visited .md-code-inline:before,a.lk-black:visited .md-code-inline:before{background-color:#333}.lk-black .lk-link:active,a.lk-black:active{outline-color:#333}.lk-black .lk-link:hover,a.lk-black:hover{border-bottom-color:#333}.lk-black.lk-icon:hover{color:#333}.lk-gray .lk-link,a.lk-gray{color:#999}.lk-gray .lk-link:visited,a.lk-gray:visited{background-color:rgba(153,153,153,.04)}.lk-gray .lk-link:visited .md-code-inline:before,a.lk-gray:visited .md-code-inline:before{background-color:#999}.lk-gray .lk-link:active,a.lk-gray:active{outline-color:#999}.lk-gray .lk-link:hover,a.lk-gray:hover{border-bottom-color:#999}.lk-gray.lk-icon:hover{color:#999}.lk-white .lk-link,a.lk-white{color:#fcfcfc}.lk-white .lk-link:visited,a.lk-white:visited{background-color:rgba(252,252,252,.04)}.lk-white .lk-link:visited .md-code-inline:before,a.lk-white:visited .md-code-inline:before{background-color:#fcfcfc}.lk-white .lk-link:active,a.lk-white:active{outline-color:#fcfcfc}.lk-white .lk-link:hover,a.lk-white:hover{border-bottom-color:#fcfcfc}.lk-white.lk-icon:hover{color:#fcfcfc}.lk-orange .lk-link,a.lk-orange{color:#f3720d}.lk-orange .lk-link:visited,a.lk-orange:visited{background-color:rgba(243,114,13,.04)}.lk-orange .lk-link:visited .md-code-inline:before,a.lk-orange:visited .md-code-inline:before{background-color:#f3720d}.lk-orange .lk-link:active,a.lk-orange:active{outline-color:#f3720d}.lk-orange .lk-link:hover,a.lk-orange:hover{border-bottom-color:#f3720d}.lk-orange.lk-icon:hover{color:#f3720d}.lk-lilly .lk-link,a.lk-lilly{color:#7d5cff}.lk-lilly .lk-link:visited,a.lk-lilly:visited{background-color:rgba(125,92,255,.04)}.lk-lilly .lk-link:visited .md-code-inline:before,a.lk-lilly:visited .md-code-inline:before{background-color:#7d5cff}.lk-lilly .lk-link:active,a.lk-lilly:active{outline-color:#7d5cff}.lk-lilly .lk-link:hover,a.lk-lilly:hover{border-bottom-color:#7d5cff}.lk-lilly.lk-icon:hover{color:#7d5cff}.lk-blue .lk-link,a.lk-blue{color:#1a4d7f}.lk-blue .lk-link:visited,a.lk-blue:visited{background-color:rgba(26,77,127,.04)}.lk-blue .lk-link:visited .md-code-inline:before,a.lk-blue:visited .md-code-inline:before{background-color:#1a4d7f}.lk-blue .lk-link:active,a.lk-blue:active{outline-color:#1a4d7f}.lk-blue .lk-link:hover,a.lk-blue:hover{border-bottom-color:#1a4d7f}.lk-blue.lk-icon:hover{color:#1a4d7f}.lk-inherited .lk-link,a.lk-inherited{color:inherit}.lk-inherited .lk-link:active,a.lk-inherited:active{outline-color:inherit}.lk-inherited .lk-link:hover,a.lk-inherited:hover{border-bottom-color:inherit}.lk-inherited.lk-icon:hover{color:inherit}.lk-twitter .lk-link,a.lk-twitter{color:#55acee}.lk-twitter .lk-link:visited,a.lk-twitter:visited{background-color:rgba(85,172,238,.04)}.lk-twitter .lk-link:visited .md-code-inline:before,a.lk-twitter:visited .md-code-inline:before{background-color:#55acee}.lk-twitter .lk-link:active,a.lk-twitter:active{outline-color:#55acee}.lk-twitter .lk-link:hover,a.lk-twitter:hover{border-bottom-color:#55acee}.lk-twitter.lk-icon:hover{color:#55acee}.lk-facebook .lk-link,a.lk-facebook{color:#3b5998}.lk-facebook .lk-link:visited,a.lk-facebook:visited{background-color:rgba(59,89,152,.04)}.lk-facebook .lk-link:visited .md-code-inline:before,a.lk-facebook:visited .md-code-inline:before{background-color:#3b5998}.lk-facebook .lk-link:active,a.lk-facebook:active{outline-color:#3b5998}.lk-facebook .lk-link:hover,a.lk-facebook:hover{border-bottom-color:#3b5998}.lk-facebook.lk-icon:hover{color:#3b5998}.lk-clean{background-color:transparent}.lk-chrome:hover{color:#4989f4}.lk-teal .lk-link,a.lk-teal{color:#00a19c}.lk-teal .lk-link:visited,a.lk-teal:visited{background-color:rgba(0,161,156,.04)}.lk-teal .lk-link:visited .md-code-inline:before,a.lk-teal:visited .md-code-inline:before{background-color:#00a19c}.lk-teal .lk-link:active,a.lk-teal:active{outline-color:#00a19c}.lk-teal .lk-link:hover,a.lk-teal:hover{border-bottom-color:#00a19c}.lk-teal.lk-icon:hover{color:#00a19c}table{width:100%;border-spacing:0;border-collapse:separate}td,th{padding:8px}@media only screen and (max-width:950px){.table-responsive{display:block}.table-responsive>thead{display:none}.table-responsive>tbody,.table-responsive>tfoot{display:block}.table-responsive>tbody>tr,.table-responsive>tfoot>tr{display:block;background-color:rgba(203,204,188,.1);margin-bottom:30px}.table-responsive>tbody>tr:nth-child(even),.table-responsive>tfoot>tr:nth-child(even){background-color:rgba(203,204,188,.15)}.table-responsive>tbody>tr:last-child,.table-responsive>tfoot>tr:last-child{margin-bottom:0}.table-responsive>tbody>tr>td,.table-responsive>tfoot>tr>td{display:block;text-align:left}.table-responsive>tbody>tr>td:before,.table-responsive>tfoot>tr>td:before{display:block;content:attr(data-label);color:#555;font-size:13px;margin:0 0 5px}.table-responsive .table-responsive-hide{display:none}}.c-oreilly-teal{color:#00a19c}.c-yellow-highlight{color:#ffe270}.c-dark-orange{color:#f3720d}.c-pink{color:#e92c6c}.c-purple{color:#900070}.c-blue{color:#1a4d7f}.c-dark-turquoise{color:#1686a2}.c-dark-green{color:#1bc211}.c-white{color:#fcfcfc}.c-gray{color:#b7b7b7}.c-lilly{color:#7d5cff}.c-teal{color:#3aca96}.c-bg-oreilly-teal{background-color:#00a19c}.c-bg-yellow-highlight{background-color:#ffe270}.c-bg-dark-orange{background-color:#f3720d}.c-bg-pink{background-color:#e92c6c}.c-bg-purple{background-color:#900070}.c-bg-blue{background-color:#1a4d7f}.c-bg-dark-turquoise{background-color:#1686a2}.c-bg-dark-green{background-color:#1bc211}.c-bg-white{background-color:#fcfcfc}.c-bg-gray{background-color:#b7b7b7}.c-bg-lilly{background-color:#7d5cff}.c-bg-teal{background-color:#3aca96}.tj-emoji{width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em}.dc-header{margin-bottom:60px}.dc-heading{text-align:center;font-size:4em;padding:0 10px;margin-top:0;margin-bottom:10px}.dc-role{line-height:26px;padding:0 20px;margin-top:10px;text-align:center;font-style:italic;color:#cbccbc}.dc-colored{background:#f6f6f6;border-top:9px solid rgba(125,92,255,.5)}.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:800px}.md-markdown blockquote:not(.twitter-tweet){margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.md-markdown blockquote:not(.twitter-tweet) h1,.md-markdown blockquote:not(.twitter-tweet) h2,.md-markdown blockquote:not(.twitter-tweet) h3,.md-markdown blockquote:not(.twitter-tweet) h4,.md-markdown blockquote:not(.twitter-tweet) h5,.md-markdown blockquote:not(.twitter-tweet) h6{margin:-20px 0;padding:20px 0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block{margin:0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block:last-child{margin-bottom:-20px}.md-markdown img:first-child{margin-top:0}.md-markdown img:last-child{margin-bottom:0}.md-markdown p:first-child{margin-top:0}.md-markdown p:last-child{margin-bottom:0}.md-markdown .md-code-block+ol,.md-markdown .md-code-block+ul,.md-markdown ol+.md-code-block,.md-markdown ul+.md-code-block{margin-top:35px}.md-markdown a:not(.md-heading){color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.md-markdown a:not(.md-heading) .md-code-inline{position:relative}.md-markdown a:not(.md-heading) .md-code-inline:only-child{display:inline-block;line-height:17px}.md-markdown a:not(.md-heading) .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.md-markdown a:not(.md-heading):visited{background-color:rgba(233,44,108,.04)}.md-markdown a:not(.md-heading):visited .md-code-inline:before{background-color:#e92c6c}.md-markdown a:not(.md-heading):hover{border-bottom:1px solid #e92c6c}.md-markdown thead{background-color:#e0e0e0}.md-markdown tbody{background-color:#f6f6f6}.md-markdown tbody tr:nth-child(even){background-color:#f9f9f9}.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{padding:10px 0}.md-markdown h1:first-child,.md-markdown h2:first-child,.md-markdown h3:first-child,.md-markdown h4:first-child,.md-markdown h5:first-child,.md-markdown h6:first-child{margin-top:0}.md-markdown h1:last-child,.md-markdown h2:last-child,.md-markdown h3:last-child,.md-markdown h4:last-child,.md-markdown h5:last-child,.md-markdown h6:last-child{margin-bottom:0}.md-markdown iframe{display:block;margin:35px auto}.md-markdown iframe:first-child{margin-top:0}.md-markdown iframe:last-child{margin-bottom:0}.md-markdown li>p:only-child{display:inline}.md-markdown ul{list-style-type:none}.md-markdown ul>li:before{content:'◯';margin-right:5px}.md-heading{color:inherit}.md-markdown-inline{display:inline}.md-markdown-inline p{display:inline;line-height:initial}.md-code-block,.ocha-highlighted{margin:0 -20px}.ocha-code-block{padding:18px 50px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{max-width:inherit!important;margin:0 -20px;padding-left:20px;padding-right:20px}.md-code-block .md-code{display:block}.md-markdown-summary p{margin:10px 0}@media only screen and (min-width:768px){.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{margin-left:-40px;margin-right:-40px;padding:10px 40px}.md-code-block,.ocha-highlighted{margin:0 -40px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{margin:0 -40px;padding-left:40px;padding-right:40px}}@media only screen and (min-width:1300px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:900px}}@media only screen and (min-width:1400px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:1000px}.md-code-block,.md-markdown:not(.mm-content-html) .md-code-block+blockquote,.ocha-highlighted{margin:0 -400px 0 -40px}}.md-markdown-large blockquote,.md-markdown-large code,.md-markdown-large ol,.md-markdown-large p,.md-markdown-large table,.md-markdown-large ul{max-width:inherit}.md-footnotes{margin-top:80px;padding:20px 0;border-top:1px dashed #cbccbc}.md-footnote{margin:0;padding:8px 0;font-size:14px;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.md-footnote p{line-height:16px}.md-footnote-anchor{padding:2px 6px;margin-right:10px;text-align:center;font-weight:700;color:#e92c6c}.ly-custom-subheading .md-footnote-anchor,.ly-lean .md-footnote-anchor{font-family:Merriweather,Georgia,serif}.md-markdown a.md-footnote-anchor{border:1px solid #e92c6c}.md-markdown a.md-footnote-anchor:hover{background-color:#e92c6c;color:#fcfcfc}.md-footnote-ref{margin-left:1px;margin-right:3px}.md-markdown a.md-footnote-ref{border-bottom:1px dotted}.md-code-block,.md-code-inline{-webkit-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none;background:#fcfcf5;color:#4d4d4c}.md-code-block{line-height:24px}.md-code{padding:8px 10px}.md-code-inline{padding:0 6px}a .md-code{color:inherit}.md-code-comment{color:#8e908c}.md-code-attribute,.md-code-built_in,.md-code-constant,.md-code-literal,.md-code-number,.md-code-params,.md-code-pragma,.md-code-preprocessor,.md-code-regexp,.md-code-tag,.md-code-variable,.md-lang-css .md-code-class,.md-lang-css .md-code-id,.md-lang-css .md-code-pseudo,.md-lang-html .md-code-doctype,.md-lang-ruby .md-code-constant,.md-lang-xml .md-code-doctype,.md-lang-xml .md-code-pi,.md-lang-xml .md-code-tag .md-code-title,color #c82829{color:#f5871f}.md-lang-css .md-code-rule .md-code-attribute,.md-lang-ruby .md-code-class .md-code-title{color:#eab700}.md-code-header,.md-code-inheritance,.md-code-name,.md-code-string,.md-code-value,.md-lang-ruby .md-code-symbol,.md-lang-xml .md-code-cdata{color:#718c00}.md-code-title,.md-lang-css .md-code-hexcolor{color:#3e999f}.md-code-function,.md-lang-coffeescript .md-code-title,.md-lang-javascript .md-code-title,.md-lang-perl .md-code-sub,.md-lang-python .md-code-decorator,.md-lang-python .md-code-title,.md-lang-ruby .md-code-function .md-code-title,.md-lang-ruby .md-code-title .md-code-keyword{color:#4271ae}.md-code-keyword,.md-lang-javascript .md-code-function{color:#8959a8}.md-lang-coffeescript .md-lang-javascript,.md-lang-javascript .md-lang-xml,.md-lang-tex .md-code-formula,.md-lang-xml .md-code-cdata,.md-lang-xml .md-lang-css,.md-lang-xml .md-lang-javascript,.md-lang-xml .vbscript{opacity:.5}.md-code-deletion{background-color:rgba(244,0,30,.05);color:#f4001e}.md-code-addition{background-color:rgba(27,194,17,.05);color:#1bc211}.md-mark{background-color:rgba(255,226,112,.5);color:inherit}.md-mark span{color:inherit}.md-heading-hover{cursor:pointer;background-color:rgba(22,134,162,.1)}.mde-text-left{text-align:left}.mde-text-center{text-align:center}.mde-text-right{text-align:right}.mde-size-small{font-size:12px}.mde-size-small,.mde-size-small p{line-height:12px}.mde-size-large{font-size:36px}.mde-size-large,.mde-size-large p{line-height:36px}.mde-size-giant{font-size:72px}.mde-size-giant,.mde-size-giant p{line-height:72px}.mde-clearfix:after{content:' ';display:block;visibility:hidden;clear:both;font-size:0;height:0}.mde-quote{margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.mde-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.mde-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .mde-heading,.ly-lean .mde-heading{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .mde-subheading,.ly-lean .mde-subheading{font-family:Merriweather,Georgia,serif}.mde-pad-0{padding:0}.mde-pad-5{padding:5px}.mde-pad-10{padding:10px}.mde-pad-15{padding:15px}.mde-pad-20{padding:20px}.mde-pad-25{padding:25px}.mde-pad-30{padding:30px}.mde-pad-50{padding:50px}.mde-mar-0{margin:0}.mde-mar-5{margin:5px}.mde-mar-10{margin:10px}.mde-mar-15{margin:15px}.mde-mar-20{margin:20px}.mde-mar-25{margin:25px}.mde-mar-30{margin:30px}.mde-mar-50{margin:50px}@media only screen and (min-width:900px){.mde-left{float:left}.mde-right{float:right}.mde-inline{display:inline-block;vertical-align:top}.mde-20{max-width:20%}.mde-25{max-width:25%}.mde-33{max-width:33.3333333333%}.mde-50{max-width:50%}.mde-66{max-width:66.6666666666%}.mde-75{max-width:75%}}.twitter-tweet-figure{background:0 0;padding:0}.twitter-tweet-figure:before{content:none}.twitter-tweet-figure .twitter-tweet{margin:0 auto}blockquote.twitter-tweet{overflow:hidden;color:#1c2022;background-color:#fff;border:1px solid #e1e8ed;border-radius:4px;width:500px;max-width:100%;min-width:220px;padding:1.25rem 1.25rem .725rem}blockquote.twitter-tweet:before{content:none}blockquote.twitter-tweet p{white-space:pre-wrap;font:16px/1.4 Helvetica,Roboto,'Segoe UI',Calibri,'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}blockquote.twitter-tweet a,blockquote.twitter-tweet a:visited{color:#2b7bb9}.wy-container{margin:0 auto;padding:20px 0;max-width:800px}.wy-container .md-markdown p{line-height:22px;margin:10px 0}.wy-container .md-markdown p:first-child{margin-top:0}.wy-container .md-markdown p:last-child{margin-bottom:0}.wy-container .md-markdown blockquote:not(.twitter-tweet){padding:10px 0}.wy-container .md-code-block{margin:0;padding:10px;white-space:pre-wrap}.wy-table{width:100%;padding:0}.wy-td{padding:0}.wy-section-link,.wy-section-markdown,.wy-section-poll,.wy-section-summary{padding-top:25px}.wy-section-thanks{margin-top:25px;padding:10px;font-size:15px;background-color:#f2fcf2}.wy-header-text,.wy-issue{display:inline-block;margin:10px 0;line-height:24px}.wy-issue{float:right;font-size:12px}.wy-issue-content{display:block;padding:0 5px;background-color:#fcfcfc}.wy-section-header{padding-top:40px}.wy-section-header h1,.wy-section-header h2,.wy-section-header h3,.wy-section-header h4,.wy-section-header h5,.wy-section-header h6{margin:0}.wy-section-header p{line-height:inherit}.wy-header-td{padding:0}.wy-header-content{margin:0 10px}.wy-header-text{color:#fcfcfc;text-shadow:1px 1px 0 #1a4d7f;font-weight:700;font-size:24px}.wy-content{padding-bottom:25px}.wy-link-addendum,.wy-link-tag,.wy-link-title{display:inline-block;vertical-align:bottom;margin-bottom:10px}.wy-link-title{border-bottom:1px solid;font-size:20px;margin-right:10px}.wy-link-tag{background-color:#1a4d7f;color:#fcfcfc;text-transform:uppercase;font-size:13px;margin-right:5px;padding:2px 4px}.wy-link-tag:last-child{margin-right:0}.wy-link-addendum{color:#999;margin-left:5px}.wy-link-addendum:hover{border-bottom-color:transparent}.wy-link-title-section{position:relative}.wy-link-stats{position:absolute;right:0;background-color:#3aca96;color:#fcfcfc;border-bottom:1px solid #299a71}.wy-link-stats-logo{background-color:rgba(0,0,0,.1);color:#299a71}.wy-link-stat{margin:3px}.wy-link-description{font-size:14px;color:#666}.wy-link-source-section{margin-top:10px}.wy-link-source{margin-right:10px;margin-bottom:10px;display:inline-block;vertical-align:middle;color:#55acee}.wy-link-source-plain{color:#333}.wy-link-source.wy-link-source-plain a{color:#55acee}.wy-link-source.wy-link-source-plain a:visited{background-color:rgba(85,172,238,.04)}.wy-link-source.wy-link-source-plain a:visited .md-code-inline:before{background-color:#55acee}.wy-link-source.wy-link-source-plain a:active{outline-color:#55acee}.wy-link-source.wy-link-source-plain a:hover{border-bottom-color:#55acee}.wy-link-sponsor{background-color:transparent;color:#999;outline:#999 solid 1px}.wy-link-cell-before-image{vertical-align:middle;width:70%}.wy-link-cell-image{padding-left:10px}.wy-link-image-anchor{display:block;overflow:hidden;max-height:300px}.wy-link-image{display:block;margin:0 auto}.wy-footer-table{margin:20px 0}.wy-footer-cell{text-align:center}.wy-read-online{font-size:13px}.wy-section-link-job .wy-link-source,.wy-section-link-job .wy-link-title{font-size:14px}.wy-section-link-job .wy-link-description{font-size:12px}.wy-link-pixel{float:right}@media only screen and (max-width:500px){.wy-issue-publication,.wy-issue-separator{display:none}}.md-code-block{margin:0!important;padding:10px}</style>]]></description><link>https://ponyfoo.com/weekly/193/accidents-in-space-react-app-bugs-color-vision-in-chrome-devtools-and-regexp-dos</link><guid isPermaLink="true">https://ponyfoo.com/weekly/193/accidents-in-space-react-app-bugs-color-vision-in-chrome-devtools-and-regexp-dos</guid><category><![CDATA[article]]></category><category><![CDATA[node.js]]></category><category><![CDATA[talk]]></category><category><![CDATA[best-practices]]></category><category><![CDATA[javascript]]></category><category><![CDATA[css]]></category><dc:creator><![CDATA[nico@ponyfoo.com (Nicolás Bevacqua)]]></dc:creator><pubDate>Thu, 04 Feb 2021 12:01:13 GMT</pubDate></item><item><title><![CDATA[Learning new Codebases, PR Collaboration, fun with Unit Testing, GraphQL, and Maintainable React Apps! 🥦  — Pony Foo Weekly]]></title><description><![CDATA[<div class="f-core"><div class="md-markdown"><p>We&#x2019;re glad you could make it this week! </p> <p>With your help, we can make Pony Foo Weekly <em>even more</em> awesome: <a href="https://ponyfoo.com/weekly/submissions?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-192" target="_blank" rel="noopener noreferrer">send tips about cool resources</a>.</p> </div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://www.samueltaylor.org/articles/how-to-learn-a-codebase.html?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-192" style="color:#ff895c;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>How to Join a Team and Learn a Codebase</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/article" style="color:#e4f9e3;background-color:#1bc211" class="wy-link-tag">Article</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Getting familiar with a new codebase can be daunting. It doesn&#x2019;t have to be hard, though! By taking a scientific approach, leveraging prior work, and using good tools, we can get up to speed quickly.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/SamuelDataT?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-192" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Samuel Taylor</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://www.freecodecamp.org/news/optimize-pull-requests-for-reviewer-happiness/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-192" style="color:#ff895c;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Optimize pull requests for reviewer happiness</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/best-practices" style="color:#900070;background-color:#ffe270" class="wy-link-tag">Best Practices</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Aggressively rebase commits to avoid frustrating your reviewers with shuffled narratives; Stop rebasing after review has begun to avoid disorienting and frustrating your reviewers.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/cheapsteak?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-192" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Chang Wang</p> </a></div></td><td class="wy-td wy-link-cell-image"><a href="https://www.freecodecamp.org/news/optimize-pull-requests-for-reviewer-happiness/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-192" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://images.ponyfoo.com/uploads/notfound-5651b6306ab24b1f9e1fdb56b9db072b.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-primary"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="http://srv.buysellads.com/ads/long/x/TCURIRBXTTTTTT4G3ZYMOTTTTTT22DXJZATTTTTTV3WG5UYTTTTTTBDW5JYFC5JGHRSU5R75K7NC4RDC2HNCPZIQ2AUUTAIGKJBNCR3GK2UNAYSQKM7C57QGFRBUVSPX52UUPAIDKWOUTYZL5JUCPAJC5MBCBUS2KMLCLRZ2FMLNBYZQ2EIFPRD2ZRJN4SZEKHWN5SJRKQBULASH2JNC47DIHM7ULSI62HJN4RDHHMYCOSI7HMICOS72KMNN4BZKZRYI4ZQLCT7D4ZZD2RUCCBZH5QINPZZFK6NUTAIG2MUUVBZG2YIFPRD2ZRJNOSIWKMUFVGZQ2YNN4AIW2HJNY7Q2CTYLBKQI67BUVSPX5JLU6SQR5JLNCBD52HJN4S3253UNAOQ2K7UNO?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-192" style="color:#ff895c;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Stop Wasting Time Formatting Messy Spreadsheets</p> </a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Think of the last time you imported a spreadsheet. Did it work the first time? Nearly everyone has dealt with formatting CSV or Excel files so that the data can be imported into an application. It&#x2019;s a pain! Enter Flatfile Concierge. Solve data onboarding with collaborative workspaces, intuitive data validation, and best of all, <code class="md-code md-code-inline">#nocode</code>.</p> <p><a href="http://srv.buysellads.com/ads/long/x/TCURIRBXTTTTTT4G3ZYMOTTTTTT22DXJZATTTTTTV3WG5UYTTTTTTBDW5JYFC5JGHRSU5R75K7NC4RDC2HNCPZIQ2AUUTAIGKJBNCR3GK2UNAYSQKM7C57QGFRBUVSPX52UUPAIDKWOUTYZL5JUCPAJC5MBCBUS2KMLCLRZ2FMLNBYZQ2EIFPRD2ZRJN4SZEKHWN5SJRKQBULASH2JNC47DIHM7ULSI62HJN4RDHHMYCOSI7HMICOS72KMNN4BZKZRYI4ZQLCT7D4ZZD2RUCCBZH5QINPZZFK6NUTAIG2MUUVBZG2YIFPRD2ZRJNOSIWKMUFVGZQ2YNN4AIW2HJNY7Q2CTYLBKQI67BUVSPX5JLU6SQR5JLNCBD52HJN4S3253UNAOQ2K7UNO?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-192" target="_blank" rel="noopener noreferrer">Get access</a></p> </div></div><div class="wy-link-source-section"><a href="https://ponyfoo.com/weekly/links/tagged/sponsored" class="wy-link-tag wy-link-sponsor">Sponsored</a></div></td><td class="wy-td wy-link-cell-image"><a href="http://srv.buysellads.com/ads/long/x/TCURIRBXTTTTTT4G3ZYMOTTTTTT22DXJZATTTTTTV3WG5UYTTTTTTBDW5JYFC5JGHRSU5R75K7NC4RDC2HNCPZIQ2AUUTAIGKJBNCR3GK2UNAYSQKM7C57QGFRBUVSPX52UUPAIDKWOUTYZL5JUCPAJC5MBCBUS2KMLCLRZ2FMLNBYZQ2EIFPRD2ZRJN4SZEKHWN5SJRKQBULASH2JNC47DIHM7ULSI62HJN4RDHHMYCOSI7HMICOS72KMNN4BZKZRYI4ZQLCT7D4ZZD2RUCCBZH5QINPZZFK6NUTAIG2MUUVBZG2YIFPRD2ZRJNOSIWKMUFVGZQ2YNN4AIW2HJNY7Q2CTYLBKQI67BUVSPX5JLU6SQR5JLNCBD52HJN4S3253UNAOQ2K7UNO?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-192" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://images.ponyfoo.com/uploads/Pony-foo-300x300@2x-1e5a476762f94b0c943cf7cdad5a65c5.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://nosleepjavascript.com/why-i-love-jest/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-192" style="color:#ff895c;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Jest makes unit testing fun again</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/best-practices" style="color:#900070;background-color:#ffe270" class="wy-link-tag">Best Practices</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><blockquote> <p>Jest is a full-blown, batteries included, ready to rock, testing framework that has similarities with mocha and other testing frameworks but with a much more integrated experience, making it very easy to have a production ready unit test setup out of the box with very little effort.</p> </blockquote> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/franleplant?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-192" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Francisco Guijarro &#x2014; @franleplant</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://charlypoly.com/publications/from-rest-to-graphql?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-192" style="color:#ff895c;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>From REST to GraphQL</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/graphql" class="wy-link-tag">graphql</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>All the tools to get your existing REST APIs working with GraphQL</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/where_is_charly?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-192" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Charly Poly</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://codersociety.com/blog/articles/introduction-graphql?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-192" style="color:#ff895c;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Introduction to GraphQL for Developers</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/introductory" style="color:#900070;background-color:#f7f0f5" class="wy-link-tag">Introductory</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Learn GraphQL&#x2019;s core features, how it works and operational challenges.</p> </div></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-job"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://feather-insurance.com/careers/senior-frontend-engineer?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-192" style="color:#1bc211;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Senior Frontend Engineer at Feather (Berlin / Remote)</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/job" class="wy-link-tag wy-link-sponsor">job</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>We&#x2019;re looking for a senior frontend engineer to help us take our website and web app to the next level. If you love solving other people&#x2019;s problems, then you&#x2019;ll be a good fit! Our customers love us (our Trustpilot reviews speak for themselves) and we&#x2019;re committed to building our business around customer needs.</p> </div></div><div class="wy-link-source-section"><a href="https://ponyfoo.com/weekly/links/tagged/sponsored" class="wy-link-tag wy-link-sponsor">Sponsored</a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://charlypoly.com/publications/build-maintainable-react-apps-series?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-192" style="color:#ff895c;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Build maintainable React apps</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/best-practices" style="color:#900070;background-color:#ffe270" class="wy-link-tag">Best Practices</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Full of tips and principles that will help you successfully scale React application.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/whereischarly?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-192" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Charly Poly</p> </a></div></td></tr></table></td></tr></table></div></div><style>html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;position:relative;vertical-align:baseline}sup{top:-.5em}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto;resize:vertical;min-height:280px;max-height:900px}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item;margin:-10px -20px;padding:10px;background-color:#f6f6f6;cursor:pointer;border-bottom:2px solid #ddd}[hidden],template{display:none}body,body:after,body:before,html,html:after,html:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*,:after,:before{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}@-moz-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-webkit-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-o-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-moz-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-webkit-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-o-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}.f-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.f-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .f-heading,.ly-custom-heading h1,.ly-custom-heading h2,.ly-custom-heading h3,.ly-custom-heading h4,.ly-custom-heading h5,.ly-custom-heading h6,.ly-lean .f-heading,.ly-lean h1,.ly-lean h2,.ly-lean h3,.ly-lean h4,.ly-lean h5,.ly-lean h6{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .f-subheading,.ly-lean .f-subheading{font-family:Merriweather,Georgia,serif}body{margin:0;font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif;background:#fcfcfc;color:#333}img{max-width:100%;border:none}.md-markdown figure:not(.twitter-tweet-figure){background-color:#f6f6f6}.md-markdown figure:not(.twitter-tweet-figure)>a{display:block}.md-markdown figure:not(.twitter-tweet-figure)>a>img,.md-markdown figure:not(.twitter-tweet-figure)>img{display:block;margin-left:auto;margin-right:auto}.md-markdown figcaption{padding:10px;font-style:italic;font-size:14px;background:-webkit-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-moz-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-o-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-ms-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:linear-gradient(to right,#fff9e2 33%,#fcf9ee 100%);color:#555}.md-markdown .figure-has-loaded{background:-webkit-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-moz-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-o-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-ms-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fcf9ee 100%)}b,em,font-style italic,font-weight bold,i,ins,strong{text-decoration:none}del{text-decoration:line-through}sub,sup{bottom:0;line-height:18px}button,input{overflow:visible;border-radius:0}button{border:none;padding:6px 8px;font-size:1.2em;background:0 0}button[disabled]{color:#cbccbc!important}input,select,textarea{display:block;width:100%;padding:10px 8px;line-height:18px;border:none;font:inherit}select{height:38px}ol,ul{padding:0;margin:0;list-style-position:inside}li>ol,li>ul{margin-left:20px}hr{border:none;border-top:5px solid rgba(0,0,0,.05);margin:20px 0}kbd{display:inline-block;border:1px solid #ccc;margin:0 .1em;padding:.1em .6em;line-height:1.4;font-size:11px;background-color:#f7f7f7;-webkit-box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;border-radius:3px;color:#333;text-shadow:0 1px 0 #fff;white-space:nowrap}iframe{display:inline-block;border:none;max-width:100%}summary:hover{opacity:.8}details{padding:10px 20px 20px;border-bottom:2px dashed #ddd}details[open] summary{margin-bottom:20px}blockquote{border:none;margin:0!important}ol,p,ul{line-height:35px}p{margin:35px 0}@media only screen and (min-width:768px){ol,p,ul{line-height:30px}}a,button,input[type=submit]{cursor:pointer;text-decoration:none}.lk-link{color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.lk-link .md-code-inline{position:relative}.lk-link .md-code-inline:only-child{display:inline-block;line-height:17px}.lk-link .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.lk-link:visited{background-color:rgba(233,44,108,.04)}.lk-link:visited .md-code-inline:before{background-color:#e92c6c}.lk-link:hover{border-bottom:1px solid #e92c6c}.lk-rainbows{position:relative;color:#333;margin-bottom:5px}.lk-rainbows:hover:before{position:absolute;content:'';left:0;right:0;bottom:-8px;height:3px;opacity:.8;-webkit-transition:.1s ease-in-out;-moz-transition:.1s ease-in-out;-o-transition:.1s ease-in-out;-ms-transition:all .1s ease-in-out;transition:.1s ease-in-out;-webkit-animation:.5s infinite bg-rainbow;-moz-animation:.5s infinite bg-rainbow;-o-animation:.5s infinite bg-rainbow;-ms-animation:bg-rainbow .5s infinite;animation:.5s infinite bg-rainbow}.lk-icon{color:#333}.lk-icon:hover{color:#e92c6c}.lk-visitor{color:#333}.lk-visitor:after{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-left:5px}.lk-visitor.lk-visitor-large:after{font-size:1em}.lk-visitor:hover:after{color:#333;border-bottom-style:solid}.lk-visitor:visited:after{color:#7d5cff}.lk-visitor-inside{color:#333}.lk-visitor-inside .lk-visitor-target:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-inside.lk-visitor-large .lk-visitor-target:before{font-size:1em}.lk-visitor-inside:hover .lk-visitor-target:before{color:#333;border-bottom-style:solid}.lk-visitor-inside:visited .lk-visitor-target:before{color:#7d5cff}.lk-visitor-before{color:#333}.lk-visitor-before:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-before.lk-visitor-large:before{font-size:1em}.lk-visitor-before:hover:before{color:#333;border-bottom-style:solid}.lk-visitor-before:visited:before{color:#7d5cff}.lk-visitor-before-no-underline:before{border-bottom-width:0}.lk-link-to-green{color:#cbccbc}.lk-link-to-green:visited,.lk-link-to-green:visited:before{color:#1bc211;background-color:#1bc211}.lk-link-to-green:active{outline-color:#1bc211}.lk-link-to-green:hover,.lk-link-to-green:hover:before{color:#8be186;border-bottom-color:#1bc211}.lk-green .lk-link,a.lk-green{color:#1bc211}.lk-green .lk-link:visited,a.lk-green:visited{background-color:rgba(27,194,17,.04)}.lk-green .lk-link:visited .md-code-inline:before,a.lk-green:visited .md-code-inline:before{background-color:#1bc211}.lk-green .lk-link:active,a.lk-green:active{outline-color:#1bc211}.lk-green .lk-link:hover,a.lk-green:hover{border-bottom-color:#1bc211}.lk-green.lk-icon:hover{color:#1bc211}.lk-pink-light .lk-link,a.lk-pink-light{color:#ea6c93}.lk-pink-light .lk-link:visited,a.lk-pink-light:visited{background-color:rgba(234,108,147,.04)}.lk-pink-light .lk-link:visited .md-code-inline:before,a.lk-pink-light:visited .md-code-inline:before{background-color:#ea6c93}.lk-pink-light .lk-link:active,a.lk-pink-light:active{outline-color:#ea6c93}.lk-pink-light .lk-link:hover,a.lk-pink-light:hover{border-bottom-color:#ea6c93}.lk-pink-light.lk-icon:hover{color:#ea6c93}.lk-black .lk-link,a.lk-black{color:#333}.lk-black .lk-link:visited,a.lk-black:visited{background-color:rgba(51,51,51,.04)}.lk-black .lk-link:visited .md-code-inline:before,a.lk-black:visited .md-code-inline:before{background-color:#333}.lk-black .lk-link:active,a.lk-black:active{outline-color:#333}.lk-black .lk-link:hover,a.lk-black:hover{border-bottom-color:#333}.lk-black.lk-icon:hover{color:#333}.lk-gray .lk-link,a.lk-gray{color:#999}.lk-gray .lk-link:visited,a.lk-gray:visited{background-color:rgba(153,153,153,.04)}.lk-gray .lk-link:visited .md-code-inline:before,a.lk-gray:visited .md-code-inline:before{background-color:#999}.lk-gray .lk-link:active,a.lk-gray:active{outline-color:#999}.lk-gray .lk-link:hover,a.lk-gray:hover{border-bottom-color:#999}.lk-gray.lk-icon:hover{color:#999}.lk-white .lk-link,a.lk-white{color:#fcfcfc}.lk-white .lk-link:visited,a.lk-white:visited{background-color:rgba(252,252,252,.04)}.lk-white .lk-link:visited .md-code-inline:before,a.lk-white:visited .md-code-inline:before{background-color:#fcfcfc}.lk-white .lk-link:active,a.lk-white:active{outline-color:#fcfcfc}.lk-white .lk-link:hover,a.lk-white:hover{border-bottom-color:#fcfcfc}.lk-white.lk-icon:hover{color:#fcfcfc}.lk-orange .lk-link,a.lk-orange{color:#f3720d}.lk-orange .lk-link:visited,a.lk-orange:visited{background-color:rgba(243,114,13,.04)}.lk-orange .lk-link:visited .md-code-inline:before,a.lk-orange:visited .md-code-inline:before{background-color:#f3720d}.lk-orange .lk-link:active,a.lk-orange:active{outline-color:#f3720d}.lk-orange .lk-link:hover,a.lk-orange:hover{border-bottom-color:#f3720d}.lk-orange.lk-icon:hover{color:#f3720d}.lk-lilly .lk-link,a.lk-lilly{color:#7d5cff}.lk-lilly .lk-link:visited,a.lk-lilly:visited{background-color:rgba(125,92,255,.04)}.lk-lilly .lk-link:visited .md-code-inline:before,a.lk-lilly:visited .md-code-inline:before{background-color:#7d5cff}.lk-lilly .lk-link:active,a.lk-lilly:active{outline-color:#7d5cff}.lk-lilly .lk-link:hover,a.lk-lilly:hover{border-bottom-color:#7d5cff}.lk-lilly.lk-icon:hover{color:#7d5cff}.lk-blue .lk-link,a.lk-blue{color:#1a4d7f}.lk-blue .lk-link:visited,a.lk-blue:visited{background-color:rgba(26,77,127,.04)}.lk-blue .lk-link:visited .md-code-inline:before,a.lk-blue:visited .md-code-inline:before{background-color:#1a4d7f}.lk-blue .lk-link:active,a.lk-blue:active{outline-color:#1a4d7f}.lk-blue .lk-link:hover,a.lk-blue:hover{border-bottom-color:#1a4d7f}.lk-blue.lk-icon:hover{color:#1a4d7f}.lk-inherited .lk-link,a.lk-inherited{color:inherit}.lk-inherited .lk-link:active,a.lk-inherited:active{outline-color:inherit}.lk-inherited .lk-link:hover,a.lk-inherited:hover{border-bottom-color:inherit}.lk-inherited.lk-icon:hover{color:inherit}.lk-twitter .lk-link,a.lk-twitter{color:#55acee}.lk-twitter .lk-link:visited,a.lk-twitter:visited{background-color:rgba(85,172,238,.04)}.lk-twitter .lk-link:visited .md-code-inline:before,a.lk-twitter:visited .md-code-inline:before{background-color:#55acee}.lk-twitter .lk-link:active,a.lk-twitter:active{outline-color:#55acee}.lk-twitter .lk-link:hover,a.lk-twitter:hover{border-bottom-color:#55acee}.lk-twitter.lk-icon:hover{color:#55acee}.lk-facebook .lk-link,a.lk-facebook{color:#3b5998}.lk-facebook .lk-link:visited,a.lk-facebook:visited{background-color:rgba(59,89,152,.04)}.lk-facebook .lk-link:visited .md-code-inline:before,a.lk-facebook:visited .md-code-inline:before{background-color:#3b5998}.lk-facebook .lk-link:active,a.lk-facebook:active{outline-color:#3b5998}.lk-facebook .lk-link:hover,a.lk-facebook:hover{border-bottom-color:#3b5998}.lk-facebook.lk-icon:hover{color:#3b5998}.lk-clean{background-color:transparent}.lk-chrome:hover{color:#4989f4}.lk-teal .lk-link,a.lk-teal{color:#00a19c}.lk-teal .lk-link:visited,a.lk-teal:visited{background-color:rgba(0,161,156,.04)}.lk-teal .lk-link:visited .md-code-inline:before,a.lk-teal:visited .md-code-inline:before{background-color:#00a19c}.lk-teal .lk-link:active,a.lk-teal:active{outline-color:#00a19c}.lk-teal .lk-link:hover,a.lk-teal:hover{border-bottom-color:#00a19c}.lk-teal.lk-icon:hover{color:#00a19c}table{width:100%;border-spacing:0;border-collapse:separate}td,th{padding:8px}@media only screen and (max-width:950px){.table-responsive{display:block}.table-responsive>thead{display:none}.table-responsive>tbody,.table-responsive>tfoot{display:block}.table-responsive>tbody>tr,.table-responsive>tfoot>tr{display:block;background-color:rgba(203,204,188,.1);margin-bottom:30px}.table-responsive>tbody>tr:nth-child(even),.table-responsive>tfoot>tr:nth-child(even){background-color:rgba(203,204,188,.15)}.table-responsive>tbody>tr:last-child,.table-responsive>tfoot>tr:last-child{margin-bottom:0}.table-responsive>tbody>tr>td,.table-responsive>tfoot>tr>td{display:block;text-align:left}.table-responsive>tbody>tr>td:before,.table-responsive>tfoot>tr>td:before{display:block;content:attr(data-label);color:#555;font-size:13px;margin:0 0 5px}.table-responsive .table-responsive-hide{display:none}}.c-oreilly-teal{color:#00a19c}.c-yellow-highlight{color:#ffe270}.c-dark-orange{color:#f3720d}.c-pink{color:#e92c6c}.c-purple{color:#900070}.c-blue{color:#1a4d7f}.c-dark-turquoise{color:#1686a2}.c-dark-green{color:#1bc211}.c-white{color:#fcfcfc}.c-gray{color:#b7b7b7}.c-lilly{color:#7d5cff}.c-teal{color:#3aca96}.c-bg-oreilly-teal{background-color:#00a19c}.c-bg-yellow-highlight{background-color:#ffe270}.c-bg-dark-orange{background-color:#f3720d}.c-bg-pink{background-color:#e92c6c}.c-bg-purple{background-color:#900070}.c-bg-blue{background-color:#1a4d7f}.c-bg-dark-turquoise{background-color:#1686a2}.c-bg-dark-green{background-color:#1bc211}.c-bg-white{background-color:#fcfcfc}.c-bg-gray{background-color:#b7b7b7}.c-bg-lilly{background-color:#7d5cff}.c-bg-teal{background-color:#3aca96}.tj-emoji{width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em}.dc-header{margin-bottom:60px}.dc-heading{text-align:center;font-size:4em;padding:0 10px;margin-top:0;margin-bottom:10px}.dc-role{line-height:26px;padding:0 20px;margin-top:10px;text-align:center;font-style:italic;color:#cbccbc}.dc-colored{background:#f6f6f6;border-top:9px solid rgba(125,92,255,.5)}.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:800px}.md-markdown blockquote:not(.twitter-tweet){margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.md-markdown blockquote:not(.twitter-tweet) h1,.md-markdown blockquote:not(.twitter-tweet) h2,.md-markdown blockquote:not(.twitter-tweet) h3,.md-markdown blockquote:not(.twitter-tweet) h4,.md-markdown blockquote:not(.twitter-tweet) h5,.md-markdown blockquote:not(.twitter-tweet) h6{margin:-20px 0;padding:20px 0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block{margin:0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block:last-child{margin-bottom:-20px}.md-markdown img:first-child{margin-top:0}.md-markdown img:last-child{margin-bottom:0}.md-markdown p:first-child{margin-top:0}.md-markdown p:last-child{margin-bottom:0}.md-markdown .md-code-block+ol,.md-markdown .md-code-block+ul,.md-markdown ol+.md-code-block,.md-markdown ul+.md-code-block{margin-top:35px}.md-markdown a:not(.md-heading){color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.md-markdown a:not(.md-heading) .md-code-inline{position:relative}.md-markdown a:not(.md-heading) .md-code-inline:only-child{display:inline-block;line-height:17px}.md-markdown a:not(.md-heading) .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.md-markdown a:not(.md-heading):visited{background-color:rgba(233,44,108,.04)}.md-markdown a:not(.md-heading):visited .md-code-inline:before{background-color:#e92c6c}.md-markdown a:not(.md-heading):hover{border-bottom:1px solid #e92c6c}.md-markdown thead{background-color:#e0e0e0}.md-markdown tbody{background-color:#f6f6f6}.md-markdown tbody tr:nth-child(even){background-color:#f9f9f9}.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{padding:10px 0}.md-markdown h1:first-child,.md-markdown h2:first-child,.md-markdown h3:first-child,.md-markdown h4:first-child,.md-markdown h5:first-child,.md-markdown h6:first-child{margin-top:0}.md-markdown h1:last-child,.md-markdown h2:last-child,.md-markdown h3:last-child,.md-markdown h4:last-child,.md-markdown h5:last-child,.md-markdown h6:last-child{margin-bottom:0}.md-markdown iframe{display:block;margin:35px auto}.md-markdown iframe:first-child{margin-top:0}.md-markdown iframe:last-child{margin-bottom:0}.md-markdown li>p:only-child{display:inline}.md-markdown ul{list-style-type:none}.md-markdown ul>li:before{content:'◯';margin-right:5px}.md-heading{color:inherit}.md-markdown-inline{display:inline}.md-markdown-inline p{display:inline;line-height:initial}.md-code-block,.ocha-highlighted{margin:0 -20px}.ocha-code-block{padding:18px 50px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{max-width:inherit!important;margin:0 -20px;padding-left:20px;padding-right:20px}.md-code-block .md-code{display:block}.md-markdown-summary p{margin:10px 0}@media only screen and (min-width:768px){.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{margin-left:-40px;margin-right:-40px;padding:10px 40px}.md-code-block,.ocha-highlighted{margin:0 -40px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{margin:0 -40px;padding-left:40px;padding-right:40px}}@media only screen and (min-width:1300px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:900px}}@media only screen and (min-width:1400px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:1000px}.md-code-block,.md-markdown:not(.mm-content-html) .md-code-block+blockquote,.ocha-highlighted{margin:0 -400px 0 -40px}}.md-markdown-large blockquote,.md-markdown-large code,.md-markdown-large ol,.md-markdown-large p,.md-markdown-large table,.md-markdown-large ul{max-width:inherit}.md-footnotes{margin-top:80px;padding:20px 0;border-top:1px dashed #cbccbc}.md-footnote{margin:0;padding:8px 0;font-size:14px;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.md-footnote p{line-height:16px}.md-footnote-anchor{padding:2px 6px;margin-right:10px;text-align:center;font-weight:700;color:#e92c6c}.ly-custom-subheading .md-footnote-anchor,.ly-lean .md-footnote-anchor{font-family:Merriweather,Georgia,serif}.md-markdown a.md-footnote-anchor{border:1px solid #e92c6c}.md-markdown a.md-footnote-anchor:hover{background-color:#e92c6c;color:#fcfcfc}.md-footnote-ref{margin-left:1px;margin-right:3px}.md-markdown a.md-footnote-ref{border-bottom:1px dotted}.md-code-block,.md-code-inline{-webkit-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none;background:#fcfcf5;color:#4d4d4c}.md-code-block{line-height:24px}.md-code{padding:8px 10px}.md-code-inline{padding:0 6px}a .md-code{color:inherit}.md-code-comment{color:#8e908c}.md-code-attribute,.md-code-built_in,.md-code-constant,.md-code-literal,.md-code-number,.md-code-params,.md-code-pragma,.md-code-preprocessor,.md-code-regexp,.md-code-tag,.md-code-variable,.md-lang-css .md-code-class,.md-lang-css .md-code-id,.md-lang-css .md-code-pseudo,.md-lang-html .md-code-doctype,.md-lang-ruby .md-code-constant,.md-lang-xml .md-code-doctype,.md-lang-xml .md-code-pi,.md-lang-xml .md-code-tag .md-code-title,color #c82829{color:#f5871f}.md-lang-css .md-code-rule .md-code-attribute,.md-lang-ruby .md-code-class .md-code-title{color:#eab700}.md-code-header,.md-code-inheritance,.md-code-name,.md-code-string,.md-code-value,.md-lang-ruby .md-code-symbol,.md-lang-xml .md-code-cdata{color:#718c00}.md-code-title,.md-lang-css .md-code-hexcolor{color:#3e999f}.md-code-function,.md-lang-coffeescript .md-code-title,.md-lang-javascript .md-code-title,.md-lang-perl .md-code-sub,.md-lang-python .md-code-decorator,.md-lang-python .md-code-title,.md-lang-ruby .md-code-function .md-code-title,.md-lang-ruby .md-code-title .md-code-keyword{color:#4271ae}.md-code-keyword,.md-lang-javascript .md-code-function{color:#8959a8}.md-lang-coffeescript .md-lang-javascript,.md-lang-javascript .md-lang-xml,.md-lang-tex .md-code-formula,.md-lang-xml .md-code-cdata,.md-lang-xml .md-lang-css,.md-lang-xml .md-lang-javascript,.md-lang-xml .vbscript{opacity:.5}.md-code-deletion{background-color:rgba(244,0,30,.05);color:#f4001e}.md-code-addition{background-color:rgba(27,194,17,.05);color:#1bc211}.md-mark{background-color:rgba(255,226,112,.5);color:inherit}.md-mark span{color:inherit}.md-heading-hover{cursor:pointer;background-color:rgba(22,134,162,.1)}.mde-text-left{text-align:left}.mde-text-center{text-align:center}.mde-text-right{text-align:right}.mde-size-small{font-size:12px}.mde-size-small,.mde-size-small p{line-height:12px}.mde-size-large{font-size:36px}.mde-size-large,.mde-size-large p{line-height:36px}.mde-size-giant{font-size:72px}.mde-size-giant,.mde-size-giant p{line-height:72px}.mde-clearfix:after{content:' ';display:block;visibility:hidden;clear:both;font-size:0;height:0}.mde-quote{margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.mde-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.mde-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .mde-heading,.ly-lean .mde-heading{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .mde-subheading,.ly-lean .mde-subheading{font-family:Merriweather,Georgia,serif}.mde-pad-0{padding:0}.mde-pad-5{padding:5px}.mde-pad-10{padding:10px}.mde-pad-15{padding:15px}.mde-pad-20{padding:20px}.mde-pad-25{padding:25px}.mde-pad-30{padding:30px}.mde-pad-50{padding:50px}.mde-mar-0{margin:0}.mde-mar-5{margin:5px}.mde-mar-10{margin:10px}.mde-mar-15{margin:15px}.mde-mar-20{margin:20px}.mde-mar-25{margin:25px}.mde-mar-30{margin:30px}.mde-mar-50{margin:50px}@media only screen and (min-width:900px){.mde-left{float:left}.mde-right{float:right}.mde-inline{display:inline-block;vertical-align:top}.mde-20{max-width:20%}.mde-25{max-width:25%}.mde-33{max-width:33.3333333333%}.mde-50{max-width:50%}.mde-66{max-width:66.6666666666%}.mde-75{max-width:75%}}.twitter-tweet-figure{background:0 0;padding:0}.twitter-tweet-figure:before{content:none}.twitter-tweet-figure .twitter-tweet{margin:0 auto}blockquote.twitter-tweet{overflow:hidden;color:#1c2022;background-color:#fff;border:1px solid #e1e8ed;border-radius:4px;width:500px;max-width:100%;min-width:220px;padding:1.25rem 1.25rem .725rem}blockquote.twitter-tweet:before{content:none}blockquote.twitter-tweet p{white-space:pre-wrap;font:16px/1.4 Helvetica,Roboto,'Segoe UI',Calibri,'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}blockquote.twitter-tweet a,blockquote.twitter-tweet a:visited{color:#2b7bb9}.wy-container{margin:0 auto;padding:20px 0;max-width:800px}.wy-container .md-markdown p{line-height:22px;margin:10px 0}.wy-container .md-markdown p:first-child{margin-top:0}.wy-container .md-markdown p:last-child{margin-bottom:0}.wy-container .md-markdown blockquote:not(.twitter-tweet){padding:10px 0}.wy-container .md-code-block{margin:0;padding:10px;white-space:pre-wrap}.wy-table{width:100%;padding:0}.wy-td{padding:0}.wy-section-link,.wy-section-markdown,.wy-section-poll,.wy-section-summary{padding-top:25px}.wy-section-thanks{margin-top:25px;padding:10px;font-size:15px;background-color:#f2fcf2}.wy-header-text,.wy-issue{display:inline-block;margin:10px 0;line-height:24px}.wy-issue{float:right;font-size:12px}.wy-issue-content{display:block;padding:0 5px;background-color:#fcfcfc}.wy-section-header{padding-top:40px}.wy-section-header h1,.wy-section-header h2,.wy-section-header h3,.wy-section-header h4,.wy-section-header h5,.wy-section-header h6{margin:0}.wy-section-header p{line-height:inherit}.wy-header-td{padding:0}.wy-header-content{margin:0 10px}.wy-header-text{color:#fcfcfc;text-shadow:1px 1px 0 #1a4d7f;font-weight:700;font-size:24px}.wy-content{padding-bottom:25px}.wy-link-addendum,.wy-link-tag,.wy-link-title{display:inline-block;vertical-align:bottom;margin-bottom:10px}.wy-link-title{border-bottom:1px solid;font-size:20px;margin-right:10px}.wy-link-tag{background-color:#1a4d7f;color:#fcfcfc;text-transform:uppercase;font-size:13px;margin-right:5px;padding:2px 4px}.wy-link-tag:last-child{margin-right:0}.wy-link-addendum{color:#999;margin-left:5px}.wy-link-addendum:hover{border-bottom-color:transparent}.wy-link-title-section{position:relative}.wy-link-stats{position:absolute;right:0;background-color:#3aca96;color:#fcfcfc;border-bottom:1px solid #299a71}.wy-link-stats-logo{background-color:rgba(0,0,0,.1);color:#299a71}.wy-link-stat{margin:3px}.wy-link-description{font-size:14px;color:#666}.wy-link-source-section{margin-top:10px}.wy-link-source{margin-right:10px;margin-bottom:10px;display:inline-block;vertical-align:middle;color:#55acee}.wy-link-source-plain{color:#333}.wy-link-source.wy-link-source-plain a{color:#55acee}.wy-link-source.wy-link-source-plain a:visited{background-color:rgba(85,172,238,.04)}.wy-link-source.wy-link-source-plain a:visited .md-code-inline:before{background-color:#55acee}.wy-link-source.wy-link-source-plain a:active{outline-color:#55acee}.wy-link-source.wy-link-source-plain a:hover{border-bottom-color:#55acee}.wy-link-sponsor{background-color:transparent;color:#999;outline:#999 solid 1px}.wy-link-cell-before-image{vertical-align:middle;width:70%}.wy-link-cell-image{padding-left:10px}.wy-link-image-anchor{display:block;overflow:hidden;max-height:300px}.wy-link-image{display:block;margin:0 auto}.wy-footer-table{margin:20px 0}.wy-footer-cell{text-align:center}.wy-read-online{font-size:13px}.wy-section-link-job .wy-link-source,.wy-section-link-job .wy-link-title{font-size:14px}.wy-section-link-job .wy-link-description{font-size:12px}.wy-link-pixel{float:right}@media only screen and (max-width:500px){.wy-issue-publication,.wy-issue-separator{display:none}}.md-code-block{margin:0!important;padding:10px}</style>]]></description><link>https://ponyfoo.com/weekly/192/learning-new-codebases-pr-collaboration-fun-with-unit-testing-graphql-and-maintainable-react-apps</link><guid isPermaLink="true">https://ponyfoo.com/weekly/192/learning-new-codebases-pr-collaboration-fun-with-unit-testing-graphql-and-maintainable-react-apps</guid><category><![CDATA[article]]></category><category><![CDATA[best-practices]]></category><category><![CDATA[graphql]]></category><category><![CDATA[introductory]]></category><category><![CDATA[job]]></category><category><![CDATA[javascript]]></category><category><![CDATA[css]]></category><dc:creator><![CDATA[nico@ponyfoo.com (Nicolás Bevacqua)]]></dc:creator><pubDate>Thu, 14 Jan 2021 12:01:44 GMT</pubDate></item><item><title><![CDATA[Cypress React Testing, Accessibility Tooling, Offline Websites, and Chaos Engineering! 👱‍♀️  — Pony Foo Weekly]]></title><description><![CDATA[<div class="f-core"><div class="md-markdown"><p>We&#x2019;re glad you could make it this week! </p> <p>With your help, we can make Pony Foo Weekly <em>even more</em> awesome: <a href="https://ponyfoo.com/weekly/submissions?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-191" target="_blank" rel="noopener noreferrer">send tips about cool resources</a>.</p> </div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://blog.sapegin.me/all/react-testing-4-cypress/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-191" style="color:#1bc211;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Modern React testing: Cypress and Cypress Testing Library</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/tutorial" style="color:#5aa9bc;background-color:#333" class="wy-link-tag">Tutorial</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>You&#x2019;ll learn how to test React apps end-to-end with Cypress and Cypres Testing Library, how to mock network requests with Mock Service Worker, and how to apply testing best practices to write integration tests, that are good and resilient to changes.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/iamsapegin?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-191" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Artem Sapegin</p> </a></div></td><td class="wy-td wy-link-cell-image"><a href="https://blog.sapegin.me/all/react-testing-4-cypress/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-191" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://d33wubrfki0l68.cloudfront.net/c04dc381e533899e0a59fd28059b515e6365e0fa/52d0d/images/cypress-ui.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://blog.sapegin.me/all/accessibility-testing/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-191" style="color:#1bc211;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>The most useful accessibility testing tools and techniques</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/best-practices" style="color:#900070;background-color:#ffe270" class="wy-link-tag">Best Practices</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Shipping accessible features is as important for a frontend developer as shipping features without bugs, learn about tools and techniques that will help you achieve that.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/iamsapegin?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-191" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Artem Sapegin</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://codersociety.com/blog/articles/chaos-engineering?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-191" style="color:#1bc211;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>How to Effectively Implement Chaos Engineering</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/article" style="color:#e4f9e3;background-color:#1bc211" class="wy-link-tag">Article</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Chaos engineering is attracting more and more attention. But why should you break something on purpose? In this article, you learn about Chaos Engineering and how to get started using it.</p> </div></div></td><td class="wy-td wy-link-cell-image"><a href="https://codersociety.com/blog/articles/chaos-engineering?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-191" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://res.cloudinary.com/codersociety/image/fetch/w_1200,h_630,c_fill/https://cdn.codersociety.com/uploads/chaos-engineering.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-primary"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://srv.buysellads.com/ads/long/x/TFGU7IBXTTTTTTHFLS6MOTTTTTTVE6OQZATTTTTTCDCAOUYTTTTTTBDW5JYFC5JGHRSU5R75K7NC4RDC2HNCPZIQ2AUUTAIGKJBNCR3GK2UNAYSQKM7C57QGFRBUVSPX52UUPAIDKWOUTYZL5JUCPAJC5MBCBUS2KMLCLRZ2FMLNBYZQ2EIFPRD2ZRJN4SZEKHWN5SJRKQBULASH2JNC47DIHM7ULSI62HJN4RDHHMYCOSI7HMICOS72KMNN4BZKZRYIVZQLCT7DTZZD2RUCCBZH5QINPZZE5QUNBSSW2HUNAQIM5JNMOYSG27BCPSIWFMWNAZZ35QBCLYSKKWNUCADG277NOAII23WUTZQJCVNI4K3C5MBCBUSWKM7CBGZWKMJNESIQK2ENYZZE2RUFLZZC2RUE?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-191" style="color:#1bc211;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Never open Excel again with the help of Flatfile Concierge</p> </a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Think of the last time you imported a spreadsheet. Did it work the first time? Nearly everyone has dealt with formatting CSV or Excel files so that the data can be imported into an application. It&#x2019;s a pain! Enter Flatfile Concierge. Solve data onboarding with collaborative workspaces, intuitive data validation, and best of all, #nocode.</p> <p><a href="https://srv.buysellads.com/ads/long/x/TFGU7IBXTTTTTTHFLS6MOTTTTTTVE6OQZATTTTTTCDCAOUYTTTTTTBDW5JYFC5JGHRSU5R75K7NC4RDC2HNCPZIQ2AUUTAIGKJBNCR3GK2UNAYSQKM7C57QGFRBUVSPX52UUPAIDKWOUTYZL5JUCPAJC5MBCBUS2KMLCLRZ2FMLNBYZQ2EIFPRD2ZRJN4SZEKHWN5SJRKQBULASH2JNC47DIHM7ULSI62HJN4RDHHMYCOSI7HMICOS72KMNN4BZKZRYIVZQLCT7DTZZD2RUCCBZH5QINPZZE5QUNBSSW2HUNAQIM5JNMOYSG27BCPSIWFMWNAZZ35QBCLYSKKWNUCADG277NOAII23WUTZQJCVNI4K3C5MBCBUSWKM7CBGZWKMJNESIQK2ENYZZE2RUFLZZC2RUE?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-191" target="_blank" rel="noopener noreferrer">Get beta access</a></p> </div></div><div class="wy-link-source-section"><a href="https://ponyfoo.com/weekly/links/tagged/sponsored" class="wy-link-tag wy-link-sponsor">Sponsored</a></div></td><td class="wy-td wy-link-cell-image"><a href="https://srv.buysellads.com/ads/long/x/TFGU7IBXTTTTTTHFLS6MOTTTTTTVE6OQZATTTTTTCDCAOUYTTTTTTBDW5JYFC5JGHRSU5R75K7NC4RDC2HNCPZIQ2AUUTAIGKJBNCR3GK2UNAYSQKM7C57QGFRBUVSPX52UUPAIDKWOUTYZL5JUCPAJC5MBCBUS2KMLCLRZ2FMLNBYZQ2EIFPRD2ZRJN4SZEKHWN5SJRKQBULASH2JNC47DIHM7ULSI62HJN4RDHHMYCOSI7HMICOS72KMNN4BZKZRYIVZQLCT7DTZZD2RUCCBZH5QINPZZE5QUNBSSW2HUNAQIM5JNMOYSG27BCPSIWFMWNAZZ35QBCLYSKKWNUCADG277NOAII23WUTZQJCVNI4K3C5MBCBUSWKM7CBGZWKMJNESIQK2ENYZZE2RUFLZZC2RUE?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-191" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://images.ponyfoo.com/uploads/Pony-foo-300x300@2x-b05ccddbc4aa45fa850c71ba5e032584.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://itnext.io/how-to-make-your-website-work-offline-b5be47b92adc?source=friends_link&amp;sk=e7ac5aa87e5f4cbba6ad3b1a2196af99&amp;utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-191" style="color:#1bc211;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>How To Make Your Website Work Offline</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/tutorial" style="color:#5aa9bc;background-color:#333" class="wy-link-tag">Tutorial</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>How to dramatically improve the performance and user experience of your website by making it work offline in one easy step</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/dannymoerkerke?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-191" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Danny Moerkerke</p> </a></div></td></tr></table></td></tr></table></div></div><style>html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;position:relative;vertical-align:baseline}sup{top:-.5em}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto;resize:vertical;min-height:280px;max-height:900px}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item;margin:-10px -20px;padding:10px;background-color:#f6f6f6;cursor:pointer;border-bottom:2px solid #ddd}[hidden],template{display:none}body,body:after,body:before,html,html:after,html:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*,:after,:before{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}@-moz-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-webkit-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-o-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-moz-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-webkit-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-o-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}.f-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.f-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .f-heading,.ly-custom-heading h1,.ly-custom-heading h2,.ly-custom-heading h3,.ly-custom-heading h4,.ly-custom-heading h5,.ly-custom-heading h6,.ly-lean .f-heading,.ly-lean h1,.ly-lean h2,.ly-lean h3,.ly-lean h4,.ly-lean h5,.ly-lean h6{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .f-subheading,.ly-lean .f-subheading{font-family:Merriweather,Georgia,serif}body{margin:0;font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif;background:#fcfcfc;color:#333}img{max-width:100%;border:none}.md-markdown figure:not(.twitter-tweet-figure){background-color:#f6f6f6}.md-markdown figure:not(.twitter-tweet-figure)>a{display:block}.md-markdown figure:not(.twitter-tweet-figure)>a>img,.md-markdown figure:not(.twitter-tweet-figure)>img{display:block;margin-left:auto;margin-right:auto}.md-markdown figcaption{padding:10px;font-style:italic;font-size:14px;background:-webkit-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-moz-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-o-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-ms-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:linear-gradient(to right,#fff9e2 33%,#fcf9ee 100%);color:#555}.md-markdown .figure-has-loaded{background:-webkit-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-moz-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-o-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-ms-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fcf9ee 100%)}b,em,font-style italic,font-weight bold,i,ins,strong{text-decoration:none}del{text-decoration:line-through}sub,sup{bottom:0;line-height:18px}button,input{overflow:visible;border-radius:0}button{border:none;padding:6px 8px;font-size:1.2em;background:0 0}button[disabled]{color:#cbccbc!important}input,select,textarea{display:block;width:100%;padding:10px 8px;line-height:18px;border:none;font:inherit}select{height:38px}ol,ul{padding:0;margin:0;list-style-position:inside}li>ol,li>ul{margin-left:20px}hr{border:none;border-top:5px solid rgba(0,0,0,.05);margin:20px 0}kbd{display:inline-block;border:1px solid #ccc;margin:0 .1em;padding:.1em .6em;line-height:1.4;font-size:11px;background-color:#f7f7f7;-webkit-box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;border-radius:3px;color:#333;text-shadow:0 1px 0 #fff;white-space:nowrap}iframe{display:inline-block;border:none;max-width:100%}summary:hover{opacity:.8}details{padding:10px 20px 20px;border-bottom:2px dashed #ddd}details[open] summary{margin-bottom:20px}blockquote{border:none;margin:0!important}ol,p,ul{line-height:35px}p{margin:35px 0}@media only screen and (min-width:768px){ol,p,ul{line-height:30px}}a,button,input[type=submit]{cursor:pointer;text-decoration:none}.lk-link{color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.lk-link .md-code-inline{position:relative}.lk-link .md-code-inline:only-child{display:inline-block;line-height:17px}.lk-link .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.lk-link:visited{background-color:rgba(233,44,108,.04)}.lk-link:visited .md-code-inline:before{background-color:#e92c6c}.lk-link:hover{border-bottom:1px solid #e92c6c}.lk-rainbows{position:relative;color:#333;margin-bottom:5px}.lk-rainbows:hover:before{position:absolute;content:'';left:0;right:0;bottom:-8px;height:3px;opacity:.8;-webkit-transition:.1s ease-in-out;-moz-transition:.1s ease-in-out;-o-transition:.1s ease-in-out;-ms-transition:all .1s ease-in-out;transition:.1s ease-in-out;-webkit-animation:.5s infinite bg-rainbow;-moz-animation:.5s infinite bg-rainbow;-o-animation:.5s infinite bg-rainbow;-ms-animation:bg-rainbow .5s infinite;animation:.5s infinite bg-rainbow}.lk-icon{color:#333}.lk-icon:hover{color:#e92c6c}.lk-visitor{color:#333}.lk-visitor:after{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-left:5px}.lk-visitor.lk-visitor-large:after{font-size:1em}.lk-visitor:hover:after{color:#333;border-bottom-style:solid}.lk-visitor:visited:after{color:#7d5cff}.lk-visitor-inside{color:#333}.lk-visitor-inside .lk-visitor-target:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-inside.lk-visitor-large .lk-visitor-target:before{font-size:1em}.lk-visitor-inside:hover .lk-visitor-target:before{color:#333;border-bottom-style:solid}.lk-visitor-inside:visited .lk-visitor-target:before{color:#7d5cff}.lk-visitor-before{color:#333}.lk-visitor-before:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-before.lk-visitor-large:before{font-size:1em}.lk-visitor-before:hover:before{color:#333;border-bottom-style:solid}.lk-visitor-before:visited:before{color:#7d5cff}.lk-visitor-before-no-underline:before{border-bottom-width:0}.lk-link-to-green{color:#cbccbc}.lk-link-to-green:visited,.lk-link-to-green:visited:before{color:#1bc211;background-color:#1bc211}.lk-link-to-green:active{outline-color:#1bc211}.lk-link-to-green:hover,.lk-link-to-green:hover:before{color:#8be186;border-bottom-color:#1bc211}.lk-green .lk-link,a.lk-green{color:#1bc211}.lk-green .lk-link:visited,a.lk-green:visited{background-color:rgba(27,194,17,.04)}.lk-green .lk-link:visited .md-code-inline:before,a.lk-green:visited .md-code-inline:before{background-color:#1bc211}.lk-green .lk-link:active,a.lk-green:active{outline-color:#1bc211}.lk-green .lk-link:hover,a.lk-green:hover{border-bottom-color:#1bc211}.lk-green.lk-icon:hover{color:#1bc211}.lk-pink-light .lk-link,a.lk-pink-light{color:#ea6c93}.lk-pink-light .lk-link:visited,a.lk-pink-light:visited{background-color:rgba(234,108,147,.04)}.lk-pink-light .lk-link:visited .md-code-inline:before,a.lk-pink-light:visited .md-code-inline:before{background-color:#ea6c93}.lk-pink-light .lk-link:active,a.lk-pink-light:active{outline-color:#ea6c93}.lk-pink-light .lk-link:hover,a.lk-pink-light:hover{border-bottom-color:#ea6c93}.lk-pink-light.lk-icon:hover{color:#ea6c93}.lk-black .lk-link,a.lk-black{color:#333}.lk-black .lk-link:visited,a.lk-black:visited{background-color:rgba(51,51,51,.04)}.lk-black .lk-link:visited .md-code-inline:before,a.lk-black:visited .md-code-inline:before{background-color:#333}.lk-black .lk-link:active,a.lk-black:active{outline-color:#333}.lk-black .lk-link:hover,a.lk-black:hover{border-bottom-color:#333}.lk-black.lk-icon:hover{color:#333}.lk-gray .lk-link,a.lk-gray{color:#999}.lk-gray .lk-link:visited,a.lk-gray:visited{background-color:rgba(153,153,153,.04)}.lk-gray .lk-link:visited .md-code-inline:before,a.lk-gray:visited .md-code-inline:before{background-color:#999}.lk-gray .lk-link:active,a.lk-gray:active{outline-color:#999}.lk-gray .lk-link:hover,a.lk-gray:hover{border-bottom-color:#999}.lk-gray.lk-icon:hover{color:#999}.lk-white .lk-link,a.lk-white{color:#fcfcfc}.lk-white .lk-link:visited,a.lk-white:visited{background-color:rgba(252,252,252,.04)}.lk-white .lk-link:visited .md-code-inline:before,a.lk-white:visited .md-code-inline:before{background-color:#fcfcfc}.lk-white .lk-link:active,a.lk-white:active{outline-color:#fcfcfc}.lk-white .lk-link:hover,a.lk-white:hover{border-bottom-color:#fcfcfc}.lk-white.lk-icon:hover{color:#fcfcfc}.lk-orange .lk-link,a.lk-orange{color:#f3720d}.lk-orange .lk-link:visited,a.lk-orange:visited{background-color:rgba(243,114,13,.04)}.lk-orange .lk-link:visited .md-code-inline:before,a.lk-orange:visited .md-code-inline:before{background-color:#f3720d}.lk-orange .lk-link:active,a.lk-orange:active{outline-color:#f3720d}.lk-orange .lk-link:hover,a.lk-orange:hover{border-bottom-color:#f3720d}.lk-orange.lk-icon:hover{color:#f3720d}.lk-lilly .lk-link,a.lk-lilly{color:#7d5cff}.lk-lilly .lk-link:visited,a.lk-lilly:visited{background-color:rgba(125,92,255,.04)}.lk-lilly .lk-link:visited .md-code-inline:before,a.lk-lilly:visited .md-code-inline:before{background-color:#7d5cff}.lk-lilly .lk-link:active,a.lk-lilly:active{outline-color:#7d5cff}.lk-lilly .lk-link:hover,a.lk-lilly:hover{border-bottom-color:#7d5cff}.lk-lilly.lk-icon:hover{color:#7d5cff}.lk-blue .lk-link,a.lk-blue{color:#1a4d7f}.lk-blue .lk-link:visited,a.lk-blue:visited{background-color:rgba(26,77,127,.04)}.lk-blue .lk-link:visited .md-code-inline:before,a.lk-blue:visited .md-code-inline:before{background-color:#1a4d7f}.lk-blue .lk-link:active,a.lk-blue:active{outline-color:#1a4d7f}.lk-blue .lk-link:hover,a.lk-blue:hover{border-bottom-color:#1a4d7f}.lk-blue.lk-icon:hover{color:#1a4d7f}.lk-inherited .lk-link,a.lk-inherited{color:inherit}.lk-inherited .lk-link:active,a.lk-inherited:active{outline-color:inherit}.lk-inherited .lk-link:hover,a.lk-inherited:hover{border-bottom-color:inherit}.lk-inherited.lk-icon:hover{color:inherit}.lk-twitter .lk-link,a.lk-twitter{color:#55acee}.lk-twitter .lk-link:visited,a.lk-twitter:visited{background-color:rgba(85,172,238,.04)}.lk-twitter .lk-link:visited .md-code-inline:before,a.lk-twitter:visited .md-code-inline:before{background-color:#55acee}.lk-twitter .lk-link:active,a.lk-twitter:active{outline-color:#55acee}.lk-twitter .lk-link:hover,a.lk-twitter:hover{border-bottom-color:#55acee}.lk-twitter.lk-icon:hover{color:#55acee}.lk-facebook .lk-link,a.lk-facebook{color:#3b5998}.lk-facebook .lk-link:visited,a.lk-facebook:visited{background-color:rgba(59,89,152,.04)}.lk-facebook .lk-link:visited .md-code-inline:before,a.lk-facebook:visited .md-code-inline:before{background-color:#3b5998}.lk-facebook .lk-link:active,a.lk-facebook:active{outline-color:#3b5998}.lk-facebook .lk-link:hover,a.lk-facebook:hover{border-bottom-color:#3b5998}.lk-facebook.lk-icon:hover{color:#3b5998}.lk-clean{background-color:transparent}.lk-chrome:hover{color:#4989f4}.lk-teal .lk-link,a.lk-teal{color:#00a19c}.lk-teal .lk-link:visited,a.lk-teal:visited{background-color:rgba(0,161,156,.04)}.lk-teal .lk-link:visited .md-code-inline:before,a.lk-teal:visited .md-code-inline:before{background-color:#00a19c}.lk-teal .lk-link:active,a.lk-teal:active{outline-color:#00a19c}.lk-teal .lk-link:hover,a.lk-teal:hover{border-bottom-color:#00a19c}.lk-teal.lk-icon:hover{color:#00a19c}table{width:100%;border-spacing:0;border-collapse:separate}td,th{padding:8px}@media only screen and (max-width:950px){.table-responsive{display:block}.table-responsive>thead{display:none}.table-responsive>tbody,.table-responsive>tfoot{display:block}.table-responsive>tbody>tr,.table-responsive>tfoot>tr{display:block;background-color:rgba(203,204,188,.1);margin-bottom:30px}.table-responsive>tbody>tr:nth-child(even),.table-responsive>tfoot>tr:nth-child(even){background-color:rgba(203,204,188,.15)}.table-responsive>tbody>tr:last-child,.table-responsive>tfoot>tr:last-child{margin-bottom:0}.table-responsive>tbody>tr>td,.table-responsive>tfoot>tr>td{display:block;text-align:left}.table-responsive>tbody>tr>td:before,.table-responsive>tfoot>tr>td:before{display:block;content:attr(data-label);color:#555;font-size:13px;margin:0 0 5px}.table-responsive .table-responsive-hide{display:none}}.c-oreilly-teal{color:#00a19c}.c-yellow-highlight{color:#ffe270}.c-dark-orange{color:#f3720d}.c-pink{color:#e92c6c}.c-purple{color:#900070}.c-blue{color:#1a4d7f}.c-dark-turquoise{color:#1686a2}.c-dark-green{color:#1bc211}.c-white{color:#fcfcfc}.c-gray{color:#b7b7b7}.c-lilly{color:#7d5cff}.c-teal{color:#3aca96}.c-bg-oreilly-teal{background-color:#00a19c}.c-bg-yellow-highlight{background-color:#ffe270}.c-bg-dark-orange{background-color:#f3720d}.c-bg-pink{background-color:#e92c6c}.c-bg-purple{background-color:#900070}.c-bg-blue{background-color:#1a4d7f}.c-bg-dark-turquoise{background-color:#1686a2}.c-bg-dark-green{background-color:#1bc211}.c-bg-white{background-color:#fcfcfc}.c-bg-gray{background-color:#b7b7b7}.c-bg-lilly{background-color:#7d5cff}.c-bg-teal{background-color:#3aca96}.tj-emoji{width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em}.dc-header{margin-bottom:60px}.dc-heading{text-align:center;font-size:4em;padding:0 10px;margin-top:0;margin-bottom:10px}.dc-role{line-height:26px;padding:0 20px;margin-top:10px;text-align:center;font-style:italic;color:#cbccbc}.dc-colored{background:#f6f6f6;border-top:9px solid rgba(125,92,255,.5)}.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:800px}.md-markdown blockquote:not(.twitter-tweet){margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.md-markdown blockquote:not(.twitter-tweet) h1,.md-markdown blockquote:not(.twitter-tweet) h2,.md-markdown blockquote:not(.twitter-tweet) h3,.md-markdown blockquote:not(.twitter-tweet) h4,.md-markdown blockquote:not(.twitter-tweet) h5,.md-markdown blockquote:not(.twitter-tweet) h6{margin:-20px 0;padding:20px 0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block{margin:0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block:last-child{margin-bottom:-20px}.md-markdown img:first-child{margin-top:0}.md-markdown img:last-child{margin-bottom:0}.md-markdown p:first-child{margin-top:0}.md-markdown p:last-child{margin-bottom:0}.md-markdown .md-code-block+ol,.md-markdown .md-code-block+ul,.md-markdown ol+.md-code-block,.md-markdown ul+.md-code-block{margin-top:35px}.md-markdown a:not(.md-heading){color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.md-markdown a:not(.md-heading) .md-code-inline{position:relative}.md-markdown a:not(.md-heading) .md-code-inline:only-child{display:inline-block;line-height:17px}.md-markdown a:not(.md-heading) .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.md-markdown a:not(.md-heading):visited{background-color:rgba(233,44,108,.04)}.md-markdown a:not(.md-heading):visited .md-code-inline:before{background-color:#e92c6c}.md-markdown a:not(.md-heading):hover{border-bottom:1px solid #e92c6c}.md-markdown thead{background-color:#e0e0e0}.md-markdown tbody{background-color:#f6f6f6}.md-markdown tbody tr:nth-child(even){background-color:#f9f9f9}.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{padding:10px 0}.md-markdown h1:first-child,.md-markdown h2:first-child,.md-markdown h3:first-child,.md-markdown h4:first-child,.md-markdown h5:first-child,.md-markdown h6:first-child{margin-top:0}.md-markdown h1:last-child,.md-markdown h2:last-child,.md-markdown h3:last-child,.md-markdown h4:last-child,.md-markdown h5:last-child,.md-markdown h6:last-child{margin-bottom:0}.md-markdown iframe{display:block;margin:35px auto}.md-markdown iframe:first-child{margin-top:0}.md-markdown iframe:last-child{margin-bottom:0}.md-markdown li>p:only-child{display:inline}.md-markdown ul{list-style-type:none}.md-markdown ul>li:before{content:'◯';margin-right:5px}.md-heading{color:inherit}.md-markdown-inline{display:inline}.md-markdown-inline p{display:inline;line-height:initial}.md-code-block,.ocha-highlighted{margin:0 -20px}.ocha-code-block{padding:18px 50px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{max-width:inherit!important;margin:0 -20px;padding-left:20px;padding-right:20px}.md-code-block .md-code{display:block}.md-markdown-summary p{margin:10px 0}@media only screen and (min-width:768px){.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{margin-left:-40px;margin-right:-40px;padding:10px 40px}.md-code-block,.ocha-highlighted{margin:0 -40px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{margin:0 -40px;padding-left:40px;padding-right:40px}}@media only screen and (min-width:1300px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:900px}}@media only screen and (min-width:1400px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:1000px}.md-code-block,.md-markdown:not(.mm-content-html) .md-code-block+blockquote,.ocha-highlighted{margin:0 -400px 0 -40px}}.md-markdown-large blockquote,.md-markdown-large code,.md-markdown-large ol,.md-markdown-large p,.md-markdown-large table,.md-markdown-large ul{max-width:inherit}.md-footnotes{margin-top:80px;padding:20px 0;border-top:1px dashed #cbccbc}.md-footnote{margin:0;padding:8px 0;font-size:14px;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.md-footnote p{line-height:16px}.md-footnote-anchor{padding:2px 6px;margin-right:10px;text-align:center;font-weight:700;color:#e92c6c}.ly-custom-subheading .md-footnote-anchor,.ly-lean .md-footnote-anchor{font-family:Merriweather,Georgia,serif}.md-markdown a.md-footnote-anchor{border:1px solid #e92c6c}.md-markdown a.md-footnote-anchor:hover{background-color:#e92c6c;color:#fcfcfc}.md-footnote-ref{margin-left:1px;margin-right:3px}.md-markdown a.md-footnote-ref{border-bottom:1px dotted}.md-code-block,.md-code-inline{-webkit-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none;background:#fcfcf5;color:#4d4d4c}.md-code-block{line-height:24px}.md-code{padding:8px 10px}.md-code-inline{padding:0 6px}a .md-code{color:inherit}.md-code-comment{color:#8e908c}.md-code-attribute,.md-code-built_in,.md-code-constant,.md-code-literal,.md-code-number,.md-code-params,.md-code-pragma,.md-code-preprocessor,.md-code-regexp,.md-code-tag,.md-code-variable,.md-lang-css .md-code-class,.md-lang-css .md-code-id,.md-lang-css .md-code-pseudo,.md-lang-html .md-code-doctype,.md-lang-ruby .md-code-constant,.md-lang-xml .md-code-doctype,.md-lang-xml .md-code-pi,.md-lang-xml .md-code-tag .md-code-title,color #c82829{color:#f5871f}.md-lang-css .md-code-rule .md-code-attribute,.md-lang-ruby .md-code-class .md-code-title{color:#eab700}.md-code-header,.md-code-inheritance,.md-code-name,.md-code-string,.md-code-value,.md-lang-ruby .md-code-symbol,.md-lang-xml .md-code-cdata{color:#718c00}.md-code-title,.md-lang-css .md-code-hexcolor{color:#3e999f}.md-code-function,.md-lang-coffeescript .md-code-title,.md-lang-javascript .md-code-title,.md-lang-perl .md-code-sub,.md-lang-python .md-code-decorator,.md-lang-python .md-code-title,.md-lang-ruby .md-code-function .md-code-title,.md-lang-ruby .md-code-title .md-code-keyword{color:#4271ae}.md-code-keyword,.md-lang-javascript .md-code-function{color:#8959a8}.md-lang-coffeescript .md-lang-javascript,.md-lang-javascript .md-lang-xml,.md-lang-tex .md-code-formula,.md-lang-xml .md-code-cdata,.md-lang-xml .md-lang-css,.md-lang-xml .md-lang-javascript,.md-lang-xml .vbscript{opacity:.5}.md-code-deletion{background-color:rgba(244,0,30,.05);color:#f4001e}.md-code-addition{background-color:rgba(27,194,17,.05);color:#1bc211}.md-mark{background-color:rgba(255,226,112,.5);color:inherit}.md-mark span{color:inherit}.md-heading-hover{cursor:pointer;background-color:rgba(22,134,162,.1)}.mde-text-left{text-align:left}.mde-text-center{text-align:center}.mde-text-right{text-align:right}.mde-size-small{font-size:12px}.mde-size-small,.mde-size-small p{line-height:12px}.mde-size-large{font-size:36px}.mde-size-large,.mde-size-large p{line-height:36px}.mde-size-giant{font-size:72px}.mde-size-giant,.mde-size-giant p{line-height:72px}.mde-clearfix:after{content:' ';display:block;visibility:hidden;clear:both;font-size:0;height:0}.mde-quote{margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.mde-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.mde-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .mde-heading,.ly-lean .mde-heading{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .mde-subheading,.ly-lean .mde-subheading{font-family:Merriweather,Georgia,serif}.mde-pad-0{padding:0}.mde-pad-5{padding:5px}.mde-pad-10{padding:10px}.mde-pad-15{padding:15px}.mde-pad-20{padding:20px}.mde-pad-25{padding:25px}.mde-pad-30{padding:30px}.mde-pad-50{padding:50px}.mde-mar-0{margin:0}.mde-mar-5{margin:5px}.mde-mar-10{margin:10px}.mde-mar-15{margin:15px}.mde-mar-20{margin:20px}.mde-mar-25{margin:25px}.mde-mar-30{margin:30px}.mde-mar-50{margin:50px}@media only screen and (min-width:900px){.mde-left{float:left}.mde-right{float:right}.mde-inline{display:inline-block;vertical-align:top}.mde-20{max-width:20%}.mde-25{max-width:25%}.mde-33{max-width:33.3333333333%}.mde-50{max-width:50%}.mde-66{max-width:66.6666666666%}.mde-75{max-width:75%}}.twitter-tweet-figure{background:0 0;padding:0}.twitter-tweet-figure:before{content:none}.twitter-tweet-figure .twitter-tweet{margin:0 auto}blockquote.twitter-tweet{overflow:hidden;color:#1c2022;background-color:#fff;border:1px solid #e1e8ed;border-radius:4px;width:500px;max-width:100%;min-width:220px;padding:1.25rem 1.25rem .725rem}blockquote.twitter-tweet:before{content:none}blockquote.twitter-tweet p{white-space:pre-wrap;font:16px/1.4 Helvetica,Roboto,'Segoe UI',Calibri,'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}blockquote.twitter-tweet a,blockquote.twitter-tweet a:visited{color:#2b7bb9}.wy-container{margin:0 auto;padding:20px 0;max-width:800px}.wy-container .md-markdown p{line-height:22px;margin:10px 0}.wy-container .md-markdown p:first-child{margin-top:0}.wy-container .md-markdown p:last-child{margin-bottom:0}.wy-container .md-markdown blockquote:not(.twitter-tweet){padding:10px 0}.wy-container .md-code-block{margin:0;padding:10px;white-space:pre-wrap}.wy-table{width:100%;padding:0}.wy-td{padding:0}.wy-section-link,.wy-section-markdown,.wy-section-poll,.wy-section-summary{padding-top:25px}.wy-section-thanks{margin-top:25px;padding:10px;font-size:15px;background-color:#f2fcf2}.wy-header-text,.wy-issue{display:inline-block;margin:10px 0;line-height:24px}.wy-issue{float:right;font-size:12px}.wy-issue-content{display:block;padding:0 5px;background-color:#fcfcfc}.wy-section-header{padding-top:40px}.wy-section-header h1,.wy-section-header h2,.wy-section-header h3,.wy-section-header h4,.wy-section-header h5,.wy-section-header h6{margin:0}.wy-section-header p{line-height:inherit}.wy-header-td{padding:0}.wy-header-content{margin:0 10px}.wy-header-text{color:#fcfcfc;text-shadow:1px 1px 0 #1a4d7f;font-weight:700;font-size:24px}.wy-content{padding-bottom:25px}.wy-link-addendum,.wy-link-tag,.wy-link-title{display:inline-block;vertical-align:bottom;margin-bottom:10px}.wy-link-title{border-bottom:1px solid;font-size:20px;margin-right:10px}.wy-link-tag{background-color:#1a4d7f;color:#fcfcfc;text-transform:uppercase;font-size:13px;margin-right:5px;padding:2px 4px}.wy-link-tag:last-child{margin-right:0}.wy-link-addendum{color:#999;margin-left:5px}.wy-link-addendum:hover{border-bottom-color:transparent}.wy-link-title-section{position:relative}.wy-link-stats{position:absolute;right:0;background-color:#3aca96;color:#fcfcfc;border-bottom:1px solid #299a71}.wy-link-stats-logo{background-color:rgba(0,0,0,.1);color:#299a71}.wy-link-stat{margin:3px}.wy-link-description{font-size:14px;color:#666}.wy-link-source-section{margin-top:10px}.wy-link-source{margin-right:10px;margin-bottom:10px;display:inline-block;vertical-align:middle;color:#55acee}.wy-link-source-plain{color:#333}.wy-link-source.wy-link-source-plain a{color:#55acee}.wy-link-source.wy-link-source-plain a:visited{background-color:rgba(85,172,238,.04)}.wy-link-source.wy-link-source-plain a:visited .md-code-inline:before{background-color:#55acee}.wy-link-source.wy-link-source-plain a:active{outline-color:#55acee}.wy-link-source.wy-link-source-plain a:hover{border-bottom-color:#55acee}.wy-link-sponsor{background-color:transparent;color:#999;outline:#999 solid 1px}.wy-link-cell-before-image{vertical-align:middle;width:70%}.wy-link-cell-image{padding-left:10px}.wy-link-image-anchor{display:block;overflow:hidden;max-height:300px}.wy-link-image{display:block;margin:0 auto}.wy-footer-table{margin:20px 0}.wy-footer-cell{text-align:center}.wy-read-online{font-size:13px}.wy-section-link-job .wy-link-source,.wy-section-link-job .wy-link-title{font-size:14px}.wy-section-link-job .wy-link-description{font-size:12px}.wy-link-pixel{float:right}@media only screen and (max-width:500px){.wy-issue-publication,.wy-issue-separator{display:none}}.md-code-block{margin:0!important;padding:10px}</style>]]></description><link>https://ponyfoo.com/weekly/191/cypress-react-testing-accessibility-tooling-offline-websites-and-chaos-engineering</link><guid isPermaLink="true">https://ponyfoo.com/weekly/191/cypress-react-testing-accessibility-tooling-offline-websites-and-chaos-engineering</guid><category><![CDATA[tutorial]]></category><category><![CDATA[best-practices]]></category><category><![CDATA[article]]></category><category><![CDATA[javascript]]></category><category><![CDATA[css]]></category><dc:creator><![CDATA[nico@ponyfoo.com (Nicolás Bevacqua)]]></dc:creator><pubDate>Thu, 10 Dec 2020 12:02:17 GMT</pubDate></item><item><title><![CDATA[TypeScript, the Mobile Web, and WebP website optimization! ⚡  — Pony Foo Weekly]]></title><description><![CDATA[<div class="f-core"><div class="md-markdown"><p>We&#x2019;re glad you could make it this week! </p> <p>With your help, we can make Pony Foo Weekly <em>even more</em> awesome: <a href="https://ponyfoo.com/weekly/submissions?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-190" target="_blank" rel="noopener noreferrer">send tips about cool resources</a>.</p> </div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://www.techatbloomberg.com/blog/10-insights-adopting-typescript-at-scale/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-190" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>10 Insights from Adopting TypeScript at Scale</p> </a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Rob Palmer shares some of the insights &amp; lessons learned during Bloomberg Engineering&#x2019;s journey to adopt TypeScript as a first-class supported language.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/TechAtBloomberg?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-190" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Tech at Bloomberg</p> </a></div></td><td class="wy-td wy-link-cell-image"><a href="https://www.techatbloomberg.com/blog/10-insights-adopting-typescript-at-scale/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-190" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://assets.bbhub.io/company/sites/40/2020/11/TechatBloomberg-11.10.jpg" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://engineering.q42.nl/webassembly?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-190" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>From JavaScript to WebAssembly in Three Steps</p> </a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>My journey of improving the performance of our ultra resolution storytelling tool Micrio by upgrading the JavaScript-only client to WebAssembly.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/duinmarcel?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-190" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Marcel Duin</p> </a></div></td><td class="wy-td wy-link-cell-image"><a href="https://engineering.q42.nl/webassembly?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-190" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://engineering.q42.nl/content/images/2020/09/Going-From-JavaScript-to-WebAssembly-in-Three-Steps-1.jpg" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-primary"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://tinyurl.com/yyp96ue3?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-190" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Never open Excel again with the help of Flatfile Concierge</p> </a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Think of the last time you imported a spreadsheet. Did it work the first time? Nearly everyone has dealt with formatting CSV or Excel files so that the data can be imported into an application. It&#x2019;s a pain! Enter Flatfile Concierge. Solve data onboarding with collaborative workspaces, intuitive data validation, and best of all, #nocode.</p> </div></div><div class="wy-link-source-section"><a href="https://ponyfoo.com/weekly/links/tagged/sponsored" class="wy-link-tag wy-link-sponsor">Sponsored</a></div></td><td class="wy-td wy-link-cell-image"><a href="https://tinyurl.com/yyp96ue3?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-190" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://images.ponyfoo.com/uploads/Pony-foo-300x300@2x-b05ccddbc4aa45fa850c71ba5e032584.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://github.com/typesense/typesense?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-190" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Typesense: an open source alternative to Algolia</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/code" style="color:#1a4d7f;background-color:#ffe270" class="wy-link-tag">Code</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>A fast, light-weight, typo tolerant search engine for building instant search experiences.</p> </div></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://medium.com/@dannymoerkerke/were-killing-the-mobile-web-be5c5662c807?source=friends_link&amp;sk=b44b5a38ddde5d1a48cf2a9d78ace4b6&amp;utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-190" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>We&#x2019;re Killing The Mobile Web</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/point-of-view" style="color:#f3720d;background-color:#ffeada" class="wy-link-tag">Point of View</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>The web took over desktop but on mobile native apps are the clear winner and we can only blame ourselves. But we can fix this as well.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/dannymoerkerke?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-190" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Danny Moerkerke</p> </a></div></td><td class="wy-td wy-link-cell-image"><a href="https://medium.com/@dannymoerkerke/were-killing-the-mobile-web-be5c5662c807?source=friends_link&amp;sk=b44b5a38ddde5d1a48cf2a9d78ace4b6&amp;utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-190" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://miro.medium.com/max/1200/0*0BNva5gmLzNU6THM" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://www.terryobrien.co.uk/articles/faster-websites-using-webp-images/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-190" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Faster websites using WebP images</p> </a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>The WebP image format has a smaller file size compared to PNG and JPG helping your websites load faster. Learn why and how to implement it.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/digitaltob?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-190" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Terry O&#x2019;Brien</p> </a></div></td><td class="wy-td wy-link-cell-image"><a href="https://www.terryobrien.co.uk/articles/faster-websites-using-webp-images/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-190" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://www.terryobrien.co.uk/images/social-images/faster-websites-using-webp-images.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div></div><style>html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;position:relative;vertical-align:baseline}sup{top:-.5em}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto;resize:vertical;min-height:280px;max-height:900px}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item;margin:-10px -20px;padding:10px;background-color:#f6f6f6;cursor:pointer;border-bottom:2px solid #ddd}[hidden],template{display:none}body,body:after,body:before,html,html:after,html:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*,:after,:before{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}@-moz-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-webkit-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-o-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-moz-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-webkit-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-o-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}.f-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.f-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .f-heading,.ly-custom-heading h1,.ly-custom-heading h2,.ly-custom-heading h3,.ly-custom-heading h4,.ly-custom-heading h5,.ly-custom-heading h6,.ly-lean .f-heading,.ly-lean h1,.ly-lean h2,.ly-lean h3,.ly-lean h4,.ly-lean h5,.ly-lean h6{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .f-subheading,.ly-lean .f-subheading{font-family:Merriweather,Georgia,serif}body{margin:0;font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif;background:#fcfcfc;color:#333}img{max-width:100%;border:none}.md-markdown figure:not(.twitter-tweet-figure){background-color:#f6f6f6}.md-markdown figure:not(.twitter-tweet-figure)>a{display:block}.md-markdown figure:not(.twitter-tweet-figure)>a>img,.md-markdown figure:not(.twitter-tweet-figure)>img{display:block;margin-left:auto;margin-right:auto}.md-markdown figcaption{padding:10px;font-style:italic;font-size:14px;background:-webkit-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-moz-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-o-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-ms-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:linear-gradient(to right,#fff9e2 33%,#fcf9ee 100%);color:#555}.md-markdown .figure-has-loaded{background:-webkit-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-moz-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-o-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-ms-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fcf9ee 100%)}b,em,font-style italic,font-weight bold,i,ins,strong{text-decoration:none}del{text-decoration:line-through}sub,sup{bottom:0;line-height:18px}button,input{overflow:visible;border-radius:0}button{border:none;padding:6px 8px;font-size:1.2em;background:0 0}button[disabled]{color:#cbccbc!important}input,select,textarea{display:block;width:100%;padding:10px 8px;line-height:18px;border:none;font:inherit}select{height:38px}ol,ul{padding:0;margin:0;list-style-position:inside}li>ol,li>ul{margin-left:20px}hr{border:none;border-top:5px solid rgba(0,0,0,.05);margin:20px 0}kbd{display:inline-block;border:1px solid #ccc;margin:0 .1em;padding:.1em .6em;line-height:1.4;font-size:11px;background-color:#f7f7f7;-webkit-box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;border-radius:3px;color:#333;text-shadow:0 1px 0 #fff;white-space:nowrap}iframe{display:inline-block;border:none;max-width:100%}summary:hover{opacity:.8}details{padding:10px 20px 20px;border-bottom:2px dashed #ddd}details[open] summary{margin-bottom:20px}blockquote{border:none;margin:0!important}ol,p,ul{line-height:35px}p{margin:35px 0}@media only screen and (min-width:768px){ol,p,ul{line-height:30px}}a,button,input[type=submit]{cursor:pointer;text-decoration:none}.lk-link{color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.lk-link .md-code-inline{position:relative}.lk-link .md-code-inline:only-child{display:inline-block;line-height:17px}.lk-link .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.lk-link:visited{background-color:rgba(233,44,108,.04)}.lk-link:visited .md-code-inline:before{background-color:#e92c6c}.lk-link:hover{border-bottom:1px solid #e92c6c}.lk-rainbows{position:relative;color:#333;margin-bottom:5px}.lk-rainbows:hover:before{position:absolute;content:'';left:0;right:0;bottom:-8px;height:3px;opacity:.8;-webkit-transition:.1s ease-in-out;-moz-transition:.1s ease-in-out;-o-transition:.1s ease-in-out;-ms-transition:all .1s ease-in-out;transition:.1s ease-in-out;-webkit-animation:.5s infinite bg-rainbow;-moz-animation:.5s infinite bg-rainbow;-o-animation:.5s infinite bg-rainbow;-ms-animation:bg-rainbow .5s infinite;animation:.5s infinite bg-rainbow}.lk-icon{color:#333}.lk-icon:hover{color:#e92c6c}.lk-visitor{color:#333}.lk-visitor:after{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-left:5px}.lk-visitor.lk-visitor-large:after{font-size:1em}.lk-visitor:hover:after{color:#333;border-bottom-style:solid}.lk-visitor:visited:after{color:#7d5cff}.lk-visitor-inside{color:#333}.lk-visitor-inside .lk-visitor-target:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-inside.lk-visitor-large .lk-visitor-target:before{font-size:1em}.lk-visitor-inside:hover .lk-visitor-target:before{color:#333;border-bottom-style:solid}.lk-visitor-inside:visited .lk-visitor-target:before{color:#7d5cff}.lk-visitor-before{color:#333}.lk-visitor-before:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-before.lk-visitor-large:before{font-size:1em}.lk-visitor-before:hover:before{color:#333;border-bottom-style:solid}.lk-visitor-before:visited:before{color:#7d5cff}.lk-visitor-before-no-underline:before{border-bottom-width:0}.lk-link-to-green{color:#cbccbc}.lk-link-to-green:visited,.lk-link-to-green:visited:before{color:#1bc211;background-color:#1bc211}.lk-link-to-green:active{outline-color:#1bc211}.lk-link-to-green:hover,.lk-link-to-green:hover:before{color:#8be186;border-bottom-color:#1bc211}.lk-green .lk-link,a.lk-green{color:#1bc211}.lk-green .lk-link:visited,a.lk-green:visited{background-color:rgba(27,194,17,.04)}.lk-green .lk-link:visited .md-code-inline:before,a.lk-green:visited .md-code-inline:before{background-color:#1bc211}.lk-green .lk-link:active,a.lk-green:active{outline-color:#1bc211}.lk-green .lk-link:hover,a.lk-green:hover{border-bottom-color:#1bc211}.lk-green.lk-icon:hover{color:#1bc211}.lk-pink-light .lk-link,a.lk-pink-light{color:#ea6c93}.lk-pink-light .lk-link:visited,a.lk-pink-light:visited{background-color:rgba(234,108,147,.04)}.lk-pink-light .lk-link:visited .md-code-inline:before,a.lk-pink-light:visited .md-code-inline:before{background-color:#ea6c93}.lk-pink-light .lk-link:active,a.lk-pink-light:active{outline-color:#ea6c93}.lk-pink-light .lk-link:hover,a.lk-pink-light:hover{border-bottom-color:#ea6c93}.lk-pink-light.lk-icon:hover{color:#ea6c93}.lk-black .lk-link,a.lk-black{color:#333}.lk-black .lk-link:visited,a.lk-black:visited{background-color:rgba(51,51,51,.04)}.lk-black .lk-link:visited .md-code-inline:before,a.lk-black:visited .md-code-inline:before{background-color:#333}.lk-black .lk-link:active,a.lk-black:active{outline-color:#333}.lk-black .lk-link:hover,a.lk-black:hover{border-bottom-color:#333}.lk-black.lk-icon:hover{color:#333}.lk-gray .lk-link,a.lk-gray{color:#999}.lk-gray .lk-link:visited,a.lk-gray:visited{background-color:rgba(153,153,153,.04)}.lk-gray .lk-link:visited .md-code-inline:before,a.lk-gray:visited .md-code-inline:before{background-color:#999}.lk-gray .lk-link:active,a.lk-gray:active{outline-color:#999}.lk-gray .lk-link:hover,a.lk-gray:hover{border-bottom-color:#999}.lk-gray.lk-icon:hover{color:#999}.lk-white .lk-link,a.lk-white{color:#fcfcfc}.lk-white .lk-link:visited,a.lk-white:visited{background-color:rgba(252,252,252,.04)}.lk-white .lk-link:visited .md-code-inline:before,a.lk-white:visited .md-code-inline:before{background-color:#fcfcfc}.lk-white .lk-link:active,a.lk-white:active{outline-color:#fcfcfc}.lk-white .lk-link:hover,a.lk-white:hover{border-bottom-color:#fcfcfc}.lk-white.lk-icon:hover{color:#fcfcfc}.lk-orange .lk-link,a.lk-orange{color:#f3720d}.lk-orange .lk-link:visited,a.lk-orange:visited{background-color:rgba(243,114,13,.04)}.lk-orange .lk-link:visited .md-code-inline:before,a.lk-orange:visited .md-code-inline:before{background-color:#f3720d}.lk-orange .lk-link:active,a.lk-orange:active{outline-color:#f3720d}.lk-orange .lk-link:hover,a.lk-orange:hover{border-bottom-color:#f3720d}.lk-orange.lk-icon:hover{color:#f3720d}.lk-lilly .lk-link,a.lk-lilly{color:#7d5cff}.lk-lilly .lk-link:visited,a.lk-lilly:visited{background-color:rgba(125,92,255,.04)}.lk-lilly .lk-link:visited .md-code-inline:before,a.lk-lilly:visited .md-code-inline:before{background-color:#7d5cff}.lk-lilly .lk-link:active,a.lk-lilly:active{outline-color:#7d5cff}.lk-lilly .lk-link:hover,a.lk-lilly:hover{border-bottom-color:#7d5cff}.lk-lilly.lk-icon:hover{color:#7d5cff}.lk-blue .lk-link,a.lk-blue{color:#1a4d7f}.lk-blue .lk-link:visited,a.lk-blue:visited{background-color:rgba(26,77,127,.04)}.lk-blue .lk-link:visited .md-code-inline:before,a.lk-blue:visited .md-code-inline:before{background-color:#1a4d7f}.lk-blue .lk-link:active,a.lk-blue:active{outline-color:#1a4d7f}.lk-blue .lk-link:hover,a.lk-blue:hover{border-bottom-color:#1a4d7f}.lk-blue.lk-icon:hover{color:#1a4d7f}.lk-inherited .lk-link,a.lk-inherited{color:inherit}.lk-inherited .lk-link:active,a.lk-inherited:active{outline-color:inherit}.lk-inherited .lk-link:hover,a.lk-inherited:hover{border-bottom-color:inherit}.lk-inherited.lk-icon:hover{color:inherit}.lk-twitter .lk-link,a.lk-twitter{color:#55acee}.lk-twitter .lk-link:visited,a.lk-twitter:visited{background-color:rgba(85,172,238,.04)}.lk-twitter .lk-link:visited .md-code-inline:before,a.lk-twitter:visited .md-code-inline:before{background-color:#55acee}.lk-twitter .lk-link:active,a.lk-twitter:active{outline-color:#55acee}.lk-twitter .lk-link:hover,a.lk-twitter:hover{border-bottom-color:#55acee}.lk-twitter.lk-icon:hover{color:#55acee}.lk-facebook .lk-link,a.lk-facebook{color:#3b5998}.lk-facebook .lk-link:visited,a.lk-facebook:visited{background-color:rgba(59,89,152,.04)}.lk-facebook .lk-link:visited .md-code-inline:before,a.lk-facebook:visited .md-code-inline:before{background-color:#3b5998}.lk-facebook .lk-link:active,a.lk-facebook:active{outline-color:#3b5998}.lk-facebook .lk-link:hover,a.lk-facebook:hover{border-bottom-color:#3b5998}.lk-facebook.lk-icon:hover{color:#3b5998}.lk-clean{background-color:transparent}.lk-chrome:hover{color:#4989f4}.lk-teal .lk-link,a.lk-teal{color:#00a19c}.lk-teal .lk-link:visited,a.lk-teal:visited{background-color:rgba(0,161,156,.04)}.lk-teal .lk-link:visited .md-code-inline:before,a.lk-teal:visited .md-code-inline:before{background-color:#00a19c}.lk-teal .lk-link:active,a.lk-teal:active{outline-color:#00a19c}.lk-teal .lk-link:hover,a.lk-teal:hover{border-bottom-color:#00a19c}.lk-teal.lk-icon:hover{color:#00a19c}table{width:100%;border-spacing:0;border-collapse:separate}td,th{padding:8px}@media only screen and (max-width:950px){.table-responsive{display:block}.table-responsive>thead{display:none}.table-responsive>tbody,.table-responsive>tfoot{display:block}.table-responsive>tbody>tr,.table-responsive>tfoot>tr{display:block;background-color:rgba(203,204,188,.1);margin-bottom:30px}.table-responsive>tbody>tr:nth-child(even),.table-responsive>tfoot>tr:nth-child(even){background-color:rgba(203,204,188,.15)}.table-responsive>tbody>tr:last-child,.table-responsive>tfoot>tr:last-child{margin-bottom:0}.table-responsive>tbody>tr>td,.table-responsive>tfoot>tr>td{display:block;text-align:left}.table-responsive>tbody>tr>td:before,.table-responsive>tfoot>tr>td:before{display:block;content:attr(data-label);color:#555;font-size:13px;margin:0 0 5px}.table-responsive .table-responsive-hide{display:none}}.c-oreilly-teal{color:#00a19c}.c-yellow-highlight{color:#ffe270}.c-dark-orange{color:#f3720d}.c-pink{color:#e92c6c}.c-purple{color:#900070}.c-blue{color:#1a4d7f}.c-dark-turquoise{color:#1686a2}.c-dark-green{color:#1bc211}.c-white{color:#fcfcfc}.c-gray{color:#b7b7b7}.c-lilly{color:#7d5cff}.c-teal{color:#3aca96}.c-bg-oreilly-teal{background-color:#00a19c}.c-bg-yellow-highlight{background-color:#ffe270}.c-bg-dark-orange{background-color:#f3720d}.c-bg-pink{background-color:#e92c6c}.c-bg-purple{background-color:#900070}.c-bg-blue{background-color:#1a4d7f}.c-bg-dark-turquoise{background-color:#1686a2}.c-bg-dark-green{background-color:#1bc211}.c-bg-white{background-color:#fcfcfc}.c-bg-gray{background-color:#b7b7b7}.c-bg-lilly{background-color:#7d5cff}.c-bg-teal{background-color:#3aca96}.tj-emoji{width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em}.dc-header{margin-bottom:60px}.dc-heading{text-align:center;font-size:4em;padding:0 10px;margin-top:0;margin-bottom:10px}.dc-role{line-height:26px;padding:0 20px;margin-top:10px;text-align:center;font-style:italic;color:#cbccbc}.dc-colored{background:#f6f6f6;border-top:9px solid rgba(125,92,255,.5)}.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:800px}.md-markdown blockquote:not(.twitter-tweet){margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.md-markdown blockquote:not(.twitter-tweet) h1,.md-markdown blockquote:not(.twitter-tweet) h2,.md-markdown blockquote:not(.twitter-tweet) h3,.md-markdown blockquote:not(.twitter-tweet) h4,.md-markdown blockquote:not(.twitter-tweet) h5,.md-markdown blockquote:not(.twitter-tweet) h6{margin:-20px 0;padding:20px 0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block{margin:0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block:last-child{margin-bottom:-20px}.md-markdown img:first-child{margin-top:0}.md-markdown img:last-child{margin-bottom:0}.md-markdown p:first-child{margin-top:0}.md-markdown p:last-child{margin-bottom:0}.md-markdown .md-code-block+ol,.md-markdown .md-code-block+ul,.md-markdown ol+.md-code-block,.md-markdown ul+.md-code-block{margin-top:35px}.md-markdown a:not(.md-heading){color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.md-markdown a:not(.md-heading) .md-code-inline{position:relative}.md-markdown a:not(.md-heading) .md-code-inline:only-child{display:inline-block;line-height:17px}.md-markdown a:not(.md-heading) .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.md-markdown a:not(.md-heading):visited{background-color:rgba(233,44,108,.04)}.md-markdown a:not(.md-heading):visited .md-code-inline:before{background-color:#e92c6c}.md-markdown a:not(.md-heading):hover{border-bottom:1px solid #e92c6c}.md-markdown thead{background-color:#e0e0e0}.md-markdown tbody{background-color:#f6f6f6}.md-markdown tbody tr:nth-child(even){background-color:#f9f9f9}.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{padding:10px 0}.md-markdown h1:first-child,.md-markdown h2:first-child,.md-markdown h3:first-child,.md-markdown h4:first-child,.md-markdown h5:first-child,.md-markdown h6:first-child{margin-top:0}.md-markdown h1:last-child,.md-markdown h2:last-child,.md-markdown h3:last-child,.md-markdown h4:last-child,.md-markdown h5:last-child,.md-markdown h6:last-child{margin-bottom:0}.md-markdown iframe{display:block;margin:35px auto}.md-markdown iframe:first-child{margin-top:0}.md-markdown iframe:last-child{margin-bottom:0}.md-markdown li>p:only-child{display:inline}.md-markdown ul{list-style-type:none}.md-markdown ul>li:before{content:'◯';margin-right:5px}.md-heading{color:inherit}.md-markdown-inline{display:inline}.md-markdown-inline p{display:inline;line-height:initial}.md-code-block,.ocha-highlighted{margin:0 -20px}.ocha-code-block{padding:18px 50px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{max-width:inherit!important;margin:0 -20px;padding-left:20px;padding-right:20px}.md-code-block .md-code{display:block}.md-markdown-summary p{margin:10px 0}@media only screen and (min-width:768px){.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{margin-left:-40px;margin-right:-40px;padding:10px 40px}.md-code-block,.ocha-highlighted{margin:0 -40px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{margin:0 -40px;padding-left:40px;padding-right:40px}}@media only screen and (min-width:1300px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:900px}}@media only screen and (min-width:1400px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:1000px}.md-code-block,.md-markdown:not(.mm-content-html) .md-code-block+blockquote,.ocha-highlighted{margin:0 -400px 0 -40px}}.md-markdown-large blockquote,.md-markdown-large code,.md-markdown-large ol,.md-markdown-large p,.md-markdown-large table,.md-markdown-large ul{max-width:inherit}.md-footnotes{margin-top:80px;padding:20px 0;border-top:1px dashed #cbccbc}.md-footnote{margin:0;padding:8px 0;font-size:14px;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.md-footnote p{line-height:16px}.md-footnote-anchor{padding:2px 6px;margin-right:10px;text-align:center;font-weight:700;color:#e92c6c}.ly-custom-subheading .md-footnote-anchor,.ly-lean .md-footnote-anchor{font-family:Merriweather,Georgia,serif}.md-markdown a.md-footnote-anchor{border:1px solid #e92c6c}.md-markdown a.md-footnote-anchor:hover{background-color:#e92c6c;color:#fcfcfc}.md-footnote-ref{margin-left:1px;margin-right:3px}.md-markdown a.md-footnote-ref{border-bottom:1px dotted}.md-code-block,.md-code-inline{-webkit-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none;background:#fcfcf5;color:#4d4d4c}.md-code-block{line-height:24px}.md-code{padding:8px 10px}.md-code-inline{padding:0 6px}a .md-code{color:inherit}.md-code-comment{color:#8e908c}.md-code-attribute,.md-code-built_in,.md-code-constant,.md-code-literal,.md-code-number,.md-code-params,.md-code-pragma,.md-code-preprocessor,.md-code-regexp,.md-code-tag,.md-code-variable,.md-lang-css .md-code-class,.md-lang-css .md-code-id,.md-lang-css .md-code-pseudo,.md-lang-html .md-code-doctype,.md-lang-ruby .md-code-constant,.md-lang-xml .md-code-doctype,.md-lang-xml .md-code-pi,.md-lang-xml .md-code-tag .md-code-title,color #c82829{color:#f5871f}.md-lang-css .md-code-rule .md-code-attribute,.md-lang-ruby .md-code-class .md-code-title{color:#eab700}.md-code-header,.md-code-inheritance,.md-code-name,.md-code-string,.md-code-value,.md-lang-ruby .md-code-symbol,.md-lang-xml .md-code-cdata{color:#718c00}.md-code-title,.md-lang-css .md-code-hexcolor{color:#3e999f}.md-code-function,.md-lang-coffeescript .md-code-title,.md-lang-javascript .md-code-title,.md-lang-perl .md-code-sub,.md-lang-python .md-code-decorator,.md-lang-python .md-code-title,.md-lang-ruby .md-code-function .md-code-title,.md-lang-ruby .md-code-title .md-code-keyword{color:#4271ae}.md-code-keyword,.md-lang-javascript .md-code-function{color:#8959a8}.md-lang-coffeescript .md-lang-javascript,.md-lang-javascript .md-lang-xml,.md-lang-tex .md-code-formula,.md-lang-xml .md-code-cdata,.md-lang-xml .md-lang-css,.md-lang-xml .md-lang-javascript,.md-lang-xml .vbscript{opacity:.5}.md-code-deletion{background-color:rgba(244,0,30,.05);color:#f4001e}.md-code-addition{background-color:rgba(27,194,17,.05);color:#1bc211}.md-mark{background-color:rgba(255,226,112,.5);color:inherit}.md-mark span{color:inherit}.md-heading-hover{cursor:pointer;background-color:rgba(22,134,162,.1)}.mde-text-left{text-align:left}.mde-text-center{text-align:center}.mde-text-right{text-align:right}.mde-size-small{font-size:12px}.mde-size-small,.mde-size-small p{line-height:12px}.mde-size-large{font-size:36px}.mde-size-large,.mde-size-large p{line-height:36px}.mde-size-giant{font-size:72px}.mde-size-giant,.mde-size-giant p{line-height:72px}.mde-clearfix:after{content:' ';display:block;visibility:hidden;clear:both;font-size:0;height:0}.mde-quote{margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.mde-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.mde-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .mde-heading,.ly-lean .mde-heading{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .mde-subheading,.ly-lean .mde-subheading{font-family:Merriweather,Georgia,serif}.mde-pad-0{padding:0}.mde-pad-5{padding:5px}.mde-pad-10{padding:10px}.mde-pad-15{padding:15px}.mde-pad-20{padding:20px}.mde-pad-25{padding:25px}.mde-pad-30{padding:30px}.mde-pad-50{padding:50px}.mde-mar-0{margin:0}.mde-mar-5{margin:5px}.mde-mar-10{margin:10px}.mde-mar-15{margin:15px}.mde-mar-20{margin:20px}.mde-mar-25{margin:25px}.mde-mar-30{margin:30px}.mde-mar-50{margin:50px}@media only screen and (min-width:900px){.mde-left{float:left}.mde-right{float:right}.mde-inline{display:inline-block;vertical-align:top}.mde-20{max-width:20%}.mde-25{max-width:25%}.mde-33{max-width:33.3333333333%}.mde-50{max-width:50%}.mde-66{max-width:66.6666666666%}.mde-75{max-width:75%}}.twitter-tweet-figure{background:0 0;padding:0}.twitter-tweet-figure:before{content:none}.twitter-tweet-figure .twitter-tweet{margin:0 auto}blockquote.twitter-tweet{overflow:hidden;color:#1c2022;background-color:#fff;border:1px solid #e1e8ed;border-radius:4px;width:500px;max-width:100%;min-width:220px;padding:1.25rem 1.25rem .725rem}blockquote.twitter-tweet:before{content:none}blockquote.twitter-tweet p{white-space:pre-wrap;font:16px/1.4 Helvetica,Roboto,'Segoe UI',Calibri,'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}blockquote.twitter-tweet a,blockquote.twitter-tweet a:visited{color:#2b7bb9}.wy-container{margin:0 auto;padding:20px 0;max-width:800px}.wy-container .md-markdown p{line-height:22px;margin:10px 0}.wy-container .md-markdown p:first-child{margin-top:0}.wy-container .md-markdown p:last-child{margin-bottom:0}.wy-container .md-markdown blockquote:not(.twitter-tweet){padding:10px 0}.wy-container .md-code-block{margin:0;padding:10px;white-space:pre-wrap}.wy-table{width:100%;padding:0}.wy-td{padding:0}.wy-section-link,.wy-section-markdown,.wy-section-poll,.wy-section-summary{padding-top:25px}.wy-section-thanks{margin-top:25px;padding:10px;font-size:15px;background-color:#f2fcf2}.wy-header-text,.wy-issue{display:inline-block;margin:10px 0;line-height:24px}.wy-issue{float:right;font-size:12px}.wy-issue-content{display:block;padding:0 5px;background-color:#fcfcfc}.wy-section-header{padding-top:40px}.wy-section-header h1,.wy-section-header h2,.wy-section-header h3,.wy-section-header h4,.wy-section-header h5,.wy-section-header h6{margin:0}.wy-section-header p{line-height:inherit}.wy-header-td{padding:0}.wy-header-content{margin:0 10px}.wy-header-text{color:#fcfcfc;text-shadow:1px 1px 0 #1a4d7f;font-weight:700;font-size:24px}.wy-content{padding-bottom:25px}.wy-link-addendum,.wy-link-tag,.wy-link-title{display:inline-block;vertical-align:bottom;margin-bottom:10px}.wy-link-title{border-bottom:1px solid;font-size:20px;margin-right:10px}.wy-link-tag{background-color:#1a4d7f;color:#fcfcfc;text-transform:uppercase;font-size:13px;margin-right:5px;padding:2px 4px}.wy-link-tag:last-child{margin-right:0}.wy-link-addendum{color:#999;margin-left:5px}.wy-link-addendum:hover{border-bottom-color:transparent}.wy-link-title-section{position:relative}.wy-link-stats{position:absolute;right:0;background-color:#3aca96;color:#fcfcfc;border-bottom:1px solid #299a71}.wy-link-stats-logo{background-color:rgba(0,0,0,.1);color:#299a71}.wy-link-stat{margin:3px}.wy-link-description{font-size:14px;color:#666}.wy-link-source-section{margin-top:10px}.wy-link-source{margin-right:10px;margin-bottom:10px;display:inline-block;vertical-align:middle;color:#55acee}.wy-link-source-plain{color:#333}.wy-link-source.wy-link-source-plain a{color:#55acee}.wy-link-source.wy-link-source-plain a:visited{background-color:rgba(85,172,238,.04)}.wy-link-source.wy-link-source-plain a:visited .md-code-inline:before{background-color:#55acee}.wy-link-source.wy-link-source-plain a:active{outline-color:#55acee}.wy-link-source.wy-link-source-plain a:hover{border-bottom-color:#55acee}.wy-link-sponsor{background-color:transparent;color:#999;outline:#999 solid 1px}.wy-link-cell-before-image{vertical-align:middle;width:70%}.wy-link-cell-image{padding-left:10px}.wy-link-image-anchor{display:block;overflow:hidden;max-height:300px}.wy-link-image{display:block;margin:0 auto}.wy-footer-table{margin:20px 0}.wy-footer-cell{text-align:center}.wy-read-online{font-size:13px}.wy-section-link-job .wy-link-source,.wy-section-link-job .wy-link-title{font-size:14px}.wy-section-link-job .wy-link-description{font-size:12px}.wy-link-pixel{float:right}@media only screen and (max-width:500px){.wy-issue-publication,.wy-issue-separator{display:none}}.md-code-block{margin:0!important;padding:10px}</style>]]></description><link>https://ponyfoo.com/weekly/190/typescript-the-mobile-web-and-webp-website-optimization</link><guid isPermaLink="true">https://ponyfoo.com/weekly/190/typescript-the-mobile-web-and-webp-website-optimization</guid><category><![CDATA[code]]></category><category><![CDATA[point-of-view]]></category><category><![CDATA[javascript]]></category><category><![CDATA[css]]></category><dc:creator><![CDATA[nico@ponyfoo.com (Nicolás Bevacqua)]]></dc:creator><pubDate>Thu, 19 Nov 2020 12:26:34 GMT</pubDate></item><item><title><![CDATA[ESM goes GA in Node 13.2.0, React Fiber, React Native, Expert Advice, CSS Architecture, & Lighthouse! 🛰  — Pony Foo Weekly]]></title><description><![CDATA[<div class="f-core"><div class="md-markdown"><p>We&#x2019;re glad you could make it this week! </p> <p>With your help, we can make Pony Foo Weekly <em>even more</em> awesome: <a href="https://ponyfoo.com/weekly/submissions?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" target="_blank" rel="noopener noreferrer">send tips about cool resources</a>.</p> </div><div class="wy-section-header"><h3 class="md-markdown" style="color:#fcfcfc;background-color:#ff895c;padding:10px"><div>ECMAScript Modules! </div> </h3></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://medium.com/@nodejs/announcing-core-node-js-support-for-ecmascript-modules-c5d6dc29b663?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" style="color:#ff895c;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Node.js support for ESM goes GA</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/news" style="color:#1bc211;background-color:#e4f9e3" class="wy-link-tag">News</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Node.js 13.2.0 ships support for <a href="https://hacks.mozilla.org/2018/03/es-modules-a-cartoon-deep-dive/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" target="_blank" rel="noopener noreferrer">ECMAScript modules</a>, known for their <code class="md-code md-code-inline">import</code> and <code class="md-code md-code-inline">export</code> statements. This support was previously behind the<code class="md-code md-code-inline">--experimental-module</code> flag, which is no longer required; however the implementation remains experimental and subject to change.</p> </div></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://github.com/billinghamj/fix-es-imports?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" style="color:#ff895c;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p><code>billinghamj/fix-es-imports</code></p> </a><a href="https://ponyfoo.com/weekly/links/tagged/code" style="color:#1a4d7f;background-color:#ffe270" class="wy-link-tag">Code</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Fixes your ES <code class="md-code md-code-inline">import</code> paths: from Node-style to explicit filenames.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/oolon?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>James Billingham</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-primary"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="http://go.tech/ponyfoo?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" style="color:#ff895c;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>.TECH Domain Black Friday Sale <strong>90% OFF!</strong></p> </a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>.TECH is the most definitive domain extension for the tech industry with the likes of Intel, CES and Viacom using it. Get your .TECH domain at 90% off this Black Friday and secure your online tech identity!</p> <p><a href="http://go.tech/ponyfoo?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" target="_blank" rel="noopener noreferrer">Buy Now</a> </p> </div></div><div class="wy-link-source-section"><a href="http://go.tech/ponyfoo?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>.TECH Domains</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/sponsored" class="wy-link-tag wy-link-sponsor">Sponsored</a></div></td><td class="wy-td wy-link-cell-image"><a href="http://go.tech/ponyfoo?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://images.ponyfoo.com/uploads/Inside_Ad-087fe92d9d1b4ccca2dee1a78810a3ef.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-header"><h3 class="md-markdown" style="color:#fcfcfc;background-color:#7d5cff;padding:10px"><div>Just React Things </div> </h3></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://pomb.us/build-your-own-react/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Build your Own React</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/deep-dive" style="color:#f7f0f5;background-color:#900070" class="wy-link-tag">Deep Dive</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Learn how to rewrite React from scratch. Step by step. Following the architecture from the real React code but without all the whipped cream on top!</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/pomber?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Rodrigo Pombo</p> </a></div></td><td class="wy-td wy-link-cell-image"><a href="https://pomb.us/build-your-own-react/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://pomb.us/static/b4694e6041953e3cb16f6a889f0cbc59/25036/card.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-secondary"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://wallabyjs.com/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Wallaby</p> </a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Smart and fast integrated continuous test runner for JavaScript, TypeScript, CoffeeScript. It enables continuous testing, TDD and BDD with instant feedback and code coverage in your code editor.</p> </div></div><div class="wy-link-source-section"><span class="wy-link-source wy-link-source-plain md-markdown md-markdown-inline"><p>Wallaby.js</p> </span><a href="https://ponyfoo.com/weekly/links/tagged/sponsored" class="wy-link-tag wy-link-sponsor">Sponsored</a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://blog.logrocket.com/deep-dive-into-react-fiber-internals/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Deep dive into React Fiber internals</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/deep-dive" style="color:#f7f0f5;background-color:#900070" class="wy-link-tag">Deep Dive</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Since version 16, React has built the DOM tree with an algorithm called Fiber. To better grasp how it works, we explain exactly what goes on under the hood.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/karthikkalyan90?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Karthik Kalyanaraman</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://www.telerik.com/kendo-react-ui/react-best-practices-and-productivity-tips/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Expert Tips for React Productivity</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/best-practices" style="color:#900070;background-color:#ffe270" class="wy-link-tag">Best Practices</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>25 excellent productivity tips for React developers from 25 React and JavaScript experts &#x2013; dive in and enjoy!</p> </div></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-secondary"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://tinyurl.com/yeeee4st?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Developer Economics</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/survey" class="wy-link-tag">survey</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Developers, speak out! Take the survey and you can win amazing prizes: Surface Pro 6, iPhone 11, Chromebook 3, lots of dev swag and vouchers. Plus, you can earn up to $1,000 in cash through our referral program. Start here and tell us your opinion on tools you work with every day.</p> </div></div><div class="wy-link-source-section"><a href="https://ponyfoo.com/weekly/links/tagged/sponsored" class="wy-link-tag wy-link-sponsor">Sponsored</a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://medium.com/walmartlabs/a-new-beginning-for-react-native-at-walmartlabs-online-grocery-c30b27db57d3?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>React Native at Walmart</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/deep-dive" style="color:#f7f0f5;background-color:#900070" class="wy-link-tag">Deep Dive</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><blockquote> <p><em>&#x201C;Almost two years ago we launched our first React Native page, now we&#x2019;re close to having 90% of our Walmart Grocery App pages powered by RN.&#x201D;</em></p> </blockquote> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/anders462?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Anders Bengtsson</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-header"><h3 class="md-markdown" style="color:#fcfcfc;background-color:#3aca96;padding:10px"><div><code class="md-code md-code-inline">...rest</code> </div> </h3></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://medium.com/javascript-in-plain-english/i-created-the-exact-same-app-in-react-and-svelte-here-are-the-differences-c0bd2cc9b3f8?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" style="color:#3aca96;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Differences Writing an App in React and Svelte</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/deep-dive" style="color:#f7f0f5;background-color:#900070" class="wy-link-tag">Deep Dive</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>A side-by-side code comparison of React vs Svelte.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/sunilsandhu?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Sunil Sandhu</p> </a></div></td><td class="wy-td wy-link-cell-image"><a href="https://medium.com/javascript-in-plain-english/i-created-the-exact-same-app-in-react-and-svelte-here-are-the-differences-c0bd2cc9b3f8?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://miro.medium.com/max/1200/1*9polCAouiiVgAEHpR2JKSA.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://engineering.q42.nl/making-a-lighthouse-plugin-work-with-lighthouse-ci?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" style="color:#3aca96;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Making a Lighthouse Plugin work with Lighthouse CI</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/tutorial" style="color:#5aa9bc;background-color:#333" class="wy-link-tag">Tutorial</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Learn how to do your custom page audits in GitHub Actions with Lighthouse CI.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/roelfjandevries?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Roelf-Jan de Vries</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://www.madebymike.com.au/writing/css-architecture-for-modern-web-applications/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" style="color:#3aca96;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>CSS Architecture for Modern JavaScript Applications</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/deep-dive" style="color:#f7f0f5;background-color:#900070" class="wy-link-tag">Deep Dive</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>An attempt to modernize CSS architecture and how to apply best practices in the context of modern JavaScript applications.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/MikeRiethmuller?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Mike Riethmuller</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://medium.com/javascript-in-plain-english/javascript-doesnt-need-to-be-replaced-bd01e2f12d51?source=friends_link&amp;sk=7b151cc6397ac9e83c14c99739b6c36f&amp;utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" style="color:#3aca96;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>JavaScript doesn&#x2019;t need to be replaced</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/point-of-view" style="color:#f3720d;background-color:#ffeada" class="wy-link-tag">Point of View</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Every now and then developers call for a replacement of JavaScript. But this is no solution, as other languages will face the same issues because of the Web&#x2019;s most important design principle: <a href="https://ponyfoo.com/articles/stop-breaking-the-web?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189">Don&#x2019;t break the web</a>.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/dannymoerkerke?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-189" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Danny Moerkerke</p> </a></div></td></tr></table></td></tr></table></div></div><style>html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;position:relative;vertical-align:baseline}sup{top:-.5em}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto;resize:vertical;min-height:280px;max-height:900px}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item;margin:-10px -20px;padding:10px;background-color:#f6f6f6;cursor:pointer;border-bottom:2px solid #ddd}[hidden],template{display:none}body,body:after,body:before,html,html:after,html:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*,:after,:before{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}@-moz-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-webkit-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-o-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-moz-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-webkit-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-o-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}.f-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.f-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .f-heading,.ly-custom-heading h1,.ly-custom-heading h2,.ly-custom-heading h3,.ly-custom-heading h4,.ly-custom-heading h5,.ly-custom-heading h6,.ly-lean .f-heading,.ly-lean h1,.ly-lean h2,.ly-lean h3,.ly-lean h4,.ly-lean h5,.ly-lean h6{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .f-subheading,.ly-lean .f-subheading{font-family:Merriweather,Georgia,serif}body{margin:0;font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif;background:#fcfcfc;color:#333}img{max-width:100%;border:none}.md-markdown figure:not(.twitter-tweet-figure){background-color:#f6f6f6}.md-markdown figure:not(.twitter-tweet-figure)>a{display:block}.md-markdown figure:not(.twitter-tweet-figure)>a>img,.md-markdown figure:not(.twitter-tweet-figure)>img{display:block;margin-left:auto;margin-right:auto}.md-markdown figcaption{padding:10px;font-style:italic;font-size:14px;background:-webkit-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-moz-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-o-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-ms-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:linear-gradient(to right,#fff9e2 33%,#fcf9ee 100%);color:#555}.md-markdown .figure-has-loaded{background:-webkit-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-moz-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-o-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-ms-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fcf9ee 100%)}b,em,font-style italic,font-weight bold,i,ins,strong{text-decoration:none}del{text-decoration:line-through}sub,sup{bottom:0;line-height:18px}button,input{overflow:visible;border-radius:0}button{border:none;padding:6px 8px;font-size:1.2em;background:0 0}button[disabled]{color:#cbccbc!important}input,select,textarea{display:block;width:100%;padding:10px 8px;line-height:18px;border:none;font:inherit}select{height:38px}ol,ul{padding:0;margin:0;list-style-position:inside}li>ol,li>ul{margin-left:20px}hr{border:none;border-top:5px solid rgba(0,0,0,.05);margin:20px 0}kbd{display:inline-block;border:1px solid #ccc;margin:0 .1em;padding:.1em .6em;line-height:1.4;font-size:11px;background-color:#f7f7f7;-webkit-box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;border-radius:3px;color:#333;text-shadow:0 1px 0 #fff;white-space:nowrap}iframe{display:inline-block;border:none;max-width:100%}summary:hover{opacity:.8}details{padding:10px 20px 20px;border-bottom:2px dashed #ddd}details[open] summary{margin-bottom:20px}blockquote{border:none;margin:0!important}ol,p,ul{line-height:35px}p{margin:35px 0}@media only screen and (min-width:768px){ol,p,ul{line-height:30px}}a,button,input[type=submit]{cursor:pointer;text-decoration:none}.lk-link{color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.lk-link .md-code-inline{position:relative}.lk-link .md-code-inline:only-child{display:inline-block;line-height:17px}.lk-link .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.lk-link:visited{background-color:rgba(233,44,108,.04)}.lk-link:visited .md-code-inline:before{background-color:#e92c6c}.lk-link:hover{border-bottom:1px solid #e92c6c}.lk-rainbows{position:relative;color:#333;margin-bottom:5px}.lk-rainbows:hover:before{position:absolute;content:'';left:0;right:0;bottom:-8px;height:3px;opacity:.8;-webkit-transition:.1s ease-in-out;-moz-transition:.1s ease-in-out;-o-transition:.1s ease-in-out;-ms-transition:all .1s ease-in-out;transition:.1s ease-in-out;-webkit-animation:.5s infinite bg-rainbow;-moz-animation:.5s infinite bg-rainbow;-o-animation:.5s infinite bg-rainbow;-ms-animation:bg-rainbow .5s infinite;animation:.5s infinite bg-rainbow}.lk-icon{color:#333}.lk-icon:hover{color:#e92c6c}.lk-visitor{color:#333}.lk-visitor:after{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-left:5px}.lk-visitor.lk-visitor-large:after{font-size:1em}.lk-visitor:hover:after{color:#333;border-bottom-style:solid}.lk-visitor:visited:after{color:#7d5cff}.lk-visitor-inside{color:#333}.lk-visitor-inside .lk-visitor-target:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-inside.lk-visitor-large .lk-visitor-target:before{font-size:1em}.lk-visitor-inside:hover .lk-visitor-target:before{color:#333;border-bottom-style:solid}.lk-visitor-inside:visited .lk-visitor-target:before{color:#7d5cff}.lk-visitor-before{color:#333}.lk-visitor-before:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-before.lk-visitor-large:before{font-size:1em}.lk-visitor-before:hover:before{color:#333;border-bottom-style:solid}.lk-visitor-before:visited:before{color:#7d5cff}.lk-visitor-before-no-underline:before{border-bottom-width:0}.lk-link-to-green{color:#cbccbc}.lk-link-to-green:visited,.lk-link-to-green:visited:before{color:#1bc211;background-color:#1bc211}.lk-link-to-green:active{outline-color:#1bc211}.lk-link-to-green:hover,.lk-link-to-green:hover:before{color:#8be186;border-bottom-color:#1bc211}.lk-green .lk-link,a.lk-green{color:#1bc211}.lk-green .lk-link:visited,a.lk-green:visited{background-color:rgba(27,194,17,.04)}.lk-green .lk-link:visited .md-code-inline:before,a.lk-green:visited .md-code-inline:before{background-color:#1bc211}.lk-green .lk-link:active,a.lk-green:active{outline-color:#1bc211}.lk-green .lk-link:hover,a.lk-green:hover{border-bottom-color:#1bc211}.lk-green.lk-icon:hover{color:#1bc211}.lk-pink-light .lk-link,a.lk-pink-light{color:#ea6c93}.lk-pink-light .lk-link:visited,a.lk-pink-light:visited{background-color:rgba(234,108,147,.04)}.lk-pink-light .lk-link:visited .md-code-inline:before,a.lk-pink-light:visited .md-code-inline:before{background-color:#ea6c93}.lk-pink-light .lk-link:active,a.lk-pink-light:active{outline-color:#ea6c93}.lk-pink-light .lk-link:hover,a.lk-pink-light:hover{border-bottom-color:#ea6c93}.lk-pink-light.lk-icon:hover{color:#ea6c93}.lk-black .lk-link,a.lk-black{color:#333}.lk-black .lk-link:visited,a.lk-black:visited{background-color:rgba(51,51,51,.04)}.lk-black .lk-link:visited .md-code-inline:before,a.lk-black:visited .md-code-inline:before{background-color:#333}.lk-black .lk-link:active,a.lk-black:active{outline-color:#333}.lk-black .lk-link:hover,a.lk-black:hover{border-bottom-color:#333}.lk-black.lk-icon:hover{color:#333}.lk-gray .lk-link,a.lk-gray{color:#999}.lk-gray .lk-link:visited,a.lk-gray:visited{background-color:rgba(153,153,153,.04)}.lk-gray .lk-link:visited .md-code-inline:before,a.lk-gray:visited .md-code-inline:before{background-color:#999}.lk-gray .lk-link:active,a.lk-gray:active{outline-color:#999}.lk-gray .lk-link:hover,a.lk-gray:hover{border-bottom-color:#999}.lk-gray.lk-icon:hover{color:#999}.lk-white .lk-link,a.lk-white{color:#fcfcfc}.lk-white .lk-link:visited,a.lk-white:visited{background-color:rgba(252,252,252,.04)}.lk-white .lk-link:visited .md-code-inline:before,a.lk-white:visited .md-code-inline:before{background-color:#fcfcfc}.lk-white .lk-link:active,a.lk-white:active{outline-color:#fcfcfc}.lk-white .lk-link:hover,a.lk-white:hover{border-bottom-color:#fcfcfc}.lk-white.lk-icon:hover{color:#fcfcfc}.lk-orange .lk-link,a.lk-orange{color:#f3720d}.lk-orange .lk-link:visited,a.lk-orange:visited{background-color:rgba(243,114,13,.04)}.lk-orange .lk-link:visited .md-code-inline:before,a.lk-orange:visited .md-code-inline:before{background-color:#f3720d}.lk-orange .lk-link:active,a.lk-orange:active{outline-color:#f3720d}.lk-orange .lk-link:hover,a.lk-orange:hover{border-bottom-color:#f3720d}.lk-orange.lk-icon:hover{color:#f3720d}.lk-lilly .lk-link,a.lk-lilly{color:#7d5cff}.lk-lilly .lk-link:visited,a.lk-lilly:visited{background-color:rgba(125,92,255,.04)}.lk-lilly .lk-link:visited .md-code-inline:before,a.lk-lilly:visited .md-code-inline:before{background-color:#7d5cff}.lk-lilly .lk-link:active,a.lk-lilly:active{outline-color:#7d5cff}.lk-lilly .lk-link:hover,a.lk-lilly:hover{border-bottom-color:#7d5cff}.lk-lilly.lk-icon:hover{color:#7d5cff}.lk-blue .lk-link,a.lk-blue{color:#1a4d7f}.lk-blue .lk-link:visited,a.lk-blue:visited{background-color:rgba(26,77,127,.04)}.lk-blue .lk-link:visited .md-code-inline:before,a.lk-blue:visited .md-code-inline:before{background-color:#1a4d7f}.lk-blue .lk-link:active,a.lk-blue:active{outline-color:#1a4d7f}.lk-blue .lk-link:hover,a.lk-blue:hover{border-bottom-color:#1a4d7f}.lk-blue.lk-icon:hover{color:#1a4d7f}.lk-inherited .lk-link,a.lk-inherited{color:inherit}.lk-inherited .lk-link:active,a.lk-inherited:active{outline-color:inherit}.lk-inherited .lk-link:hover,a.lk-inherited:hover{border-bottom-color:inherit}.lk-inherited.lk-icon:hover{color:inherit}.lk-twitter .lk-link,a.lk-twitter{color:#55acee}.lk-twitter .lk-link:visited,a.lk-twitter:visited{background-color:rgba(85,172,238,.04)}.lk-twitter .lk-link:visited .md-code-inline:before,a.lk-twitter:visited .md-code-inline:before{background-color:#55acee}.lk-twitter .lk-link:active,a.lk-twitter:active{outline-color:#55acee}.lk-twitter .lk-link:hover,a.lk-twitter:hover{border-bottom-color:#55acee}.lk-twitter.lk-icon:hover{color:#55acee}.lk-facebook .lk-link,a.lk-facebook{color:#3b5998}.lk-facebook .lk-link:visited,a.lk-facebook:visited{background-color:rgba(59,89,152,.04)}.lk-facebook .lk-link:visited .md-code-inline:before,a.lk-facebook:visited .md-code-inline:before{background-color:#3b5998}.lk-facebook .lk-link:active,a.lk-facebook:active{outline-color:#3b5998}.lk-facebook .lk-link:hover,a.lk-facebook:hover{border-bottom-color:#3b5998}.lk-facebook.lk-icon:hover{color:#3b5998}.lk-clean{background-color:transparent}.lk-chrome:hover{color:#4989f4}.lk-teal .lk-link,a.lk-teal{color:#00a19c}.lk-teal .lk-link:visited,a.lk-teal:visited{background-color:rgba(0,161,156,.04)}.lk-teal .lk-link:visited .md-code-inline:before,a.lk-teal:visited .md-code-inline:before{background-color:#00a19c}.lk-teal .lk-link:active,a.lk-teal:active{outline-color:#00a19c}.lk-teal .lk-link:hover,a.lk-teal:hover{border-bottom-color:#00a19c}.lk-teal.lk-icon:hover{color:#00a19c}table{width:100%;border-spacing:0;border-collapse:separate}td,th{padding:8px}@media only screen and (max-width:950px){.table-responsive{display:block}.table-responsive>thead{display:none}.table-responsive>tbody,.table-responsive>tfoot{display:block}.table-responsive>tbody>tr,.table-responsive>tfoot>tr{display:block;background-color:rgba(203,204,188,.1);margin-bottom:30px}.table-responsive>tbody>tr:nth-child(even),.table-responsive>tfoot>tr:nth-child(even){background-color:rgba(203,204,188,.15)}.table-responsive>tbody>tr:last-child,.table-responsive>tfoot>tr:last-child{margin-bottom:0}.table-responsive>tbody>tr>td,.table-responsive>tfoot>tr>td{display:block;text-align:left}.table-responsive>tbody>tr>td:before,.table-responsive>tfoot>tr>td:before{display:block;content:attr(data-label);color:#555;font-size:13px;margin:0 0 5px}.table-responsive .table-responsive-hide{display:none}}.c-oreilly-teal{color:#00a19c}.c-yellow-highlight{color:#ffe270}.c-dark-orange{color:#f3720d}.c-pink{color:#e92c6c}.c-purple{color:#900070}.c-blue{color:#1a4d7f}.c-dark-turquoise{color:#1686a2}.c-dark-green{color:#1bc211}.c-white{color:#fcfcfc}.c-gray{color:#b7b7b7}.c-lilly{color:#7d5cff}.c-teal{color:#3aca96}.c-bg-oreilly-teal{background-color:#00a19c}.c-bg-yellow-highlight{background-color:#ffe270}.c-bg-dark-orange{background-color:#f3720d}.c-bg-pink{background-color:#e92c6c}.c-bg-purple{background-color:#900070}.c-bg-blue{background-color:#1a4d7f}.c-bg-dark-turquoise{background-color:#1686a2}.c-bg-dark-green{background-color:#1bc211}.c-bg-white{background-color:#fcfcfc}.c-bg-gray{background-color:#b7b7b7}.c-bg-lilly{background-color:#7d5cff}.c-bg-teal{background-color:#3aca96}.tj-emoji{width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em}.dc-header{margin-bottom:60px}.dc-heading{text-align:center;font-size:4em;padding:0 10px;margin-top:0;margin-bottom:10px}.dc-role{line-height:26px;padding:0 20px;margin-top:10px;text-align:center;font-style:italic;color:#cbccbc}.dc-colored{background:#f6f6f6;border-top:9px solid rgba(125,92,255,.5)}.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:800px}.md-markdown blockquote:not(.twitter-tweet){margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.md-markdown blockquote:not(.twitter-tweet) h1,.md-markdown blockquote:not(.twitter-tweet) h2,.md-markdown blockquote:not(.twitter-tweet) h3,.md-markdown blockquote:not(.twitter-tweet) h4,.md-markdown blockquote:not(.twitter-tweet) h5,.md-markdown blockquote:not(.twitter-tweet) h6{margin:-20px 0;padding:20px 0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block{margin:0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block:last-child{margin-bottom:-20px}.md-markdown img:first-child{margin-top:0}.md-markdown img:last-child{margin-bottom:0}.md-markdown p:first-child{margin-top:0}.md-markdown p:last-child{margin-bottom:0}.md-markdown .md-code-block+ol,.md-markdown .md-code-block+ul,.md-markdown ol+.md-code-block,.md-markdown ul+.md-code-block{margin-top:35px}.md-markdown a:not(.md-heading){color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.md-markdown a:not(.md-heading) .md-code-inline{position:relative}.md-markdown a:not(.md-heading) .md-code-inline:only-child{display:inline-block;line-height:17px}.md-markdown a:not(.md-heading) .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.md-markdown a:not(.md-heading):visited{background-color:rgba(233,44,108,.04)}.md-markdown a:not(.md-heading):visited .md-code-inline:before{background-color:#e92c6c}.md-markdown a:not(.md-heading):hover{border-bottom:1px solid #e92c6c}.md-markdown thead{background-color:#e0e0e0}.md-markdown tbody{background-color:#f6f6f6}.md-markdown tbody tr:nth-child(even){background-color:#f9f9f9}.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{padding:10px 0}.md-markdown h1:first-child,.md-markdown h2:first-child,.md-markdown h3:first-child,.md-markdown h4:first-child,.md-markdown h5:first-child,.md-markdown h6:first-child{margin-top:0}.md-markdown h1:last-child,.md-markdown h2:last-child,.md-markdown h3:last-child,.md-markdown h4:last-child,.md-markdown h5:last-child,.md-markdown h6:last-child{margin-bottom:0}.md-markdown iframe{display:block;margin:35px auto}.md-markdown iframe:first-child{margin-top:0}.md-markdown iframe:last-child{margin-bottom:0}.md-markdown li>p:only-child{display:inline}.md-markdown ul{list-style-type:none}.md-markdown ul>li:before{content:'◯';margin-right:5px}.md-heading{color:inherit}.md-markdown-inline{display:inline}.md-markdown-inline p{display:inline;line-height:initial}.md-code-block,.ocha-highlighted{margin:0 -20px}.ocha-code-block{padding:18px 50px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{max-width:inherit!important;margin:0 -20px;padding-left:20px;padding-right:20px}.md-code-block .md-code{display:block}.md-markdown-summary p{margin:10px 0}@media only screen and (min-width:768px){.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{margin-left:-40px;margin-right:-40px;padding:10px 40px}.md-code-block,.ocha-highlighted{margin:0 -40px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{margin:0 -40px;padding-left:40px;padding-right:40px}}@media only screen and (min-width:1300px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:900px}}@media only screen and (min-width:1400px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:1000px}.md-code-block,.md-markdown:not(.mm-content-html) .md-code-block+blockquote,.ocha-highlighted{margin:0 -400px 0 -40px}}.md-markdown-large blockquote,.md-markdown-large code,.md-markdown-large ol,.md-markdown-large p,.md-markdown-large table,.md-markdown-large ul{max-width:inherit}.md-footnotes{margin-top:80px;padding:20px 0;border-top:1px dashed #cbccbc}.md-footnote{margin:0;padding:8px 0;font-size:14px;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.md-footnote p{line-height:16px}.md-footnote-anchor{padding:2px 6px;margin-right:10px;text-align:center;font-weight:700;color:#e92c6c}.ly-custom-subheading .md-footnote-anchor,.ly-lean .md-footnote-anchor{font-family:Merriweather,Georgia,serif}.md-markdown a.md-footnote-anchor{border:1px solid #e92c6c}.md-markdown a.md-footnote-anchor:hover{background-color:#e92c6c;color:#fcfcfc}.md-footnote-ref{margin-left:1px;margin-right:3px}.md-markdown a.md-footnote-ref{border-bottom:1px dotted}.md-code-block,.md-code-inline{-webkit-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none;background:#fcfcf5;color:#4d4d4c}.md-code-block{line-height:24px}.md-code{padding:8px 10px}.md-code-inline{padding:0 6px}a .md-code{color:inherit}.md-code-comment{color:#8e908c}.md-code-attribute,.md-code-built_in,.md-code-constant,.md-code-literal,.md-code-number,.md-code-params,.md-code-pragma,.md-code-preprocessor,.md-code-regexp,.md-code-tag,.md-code-variable,.md-lang-css .md-code-class,.md-lang-css .md-code-id,.md-lang-css .md-code-pseudo,.md-lang-html .md-code-doctype,.md-lang-ruby .md-code-constant,.md-lang-xml .md-code-doctype,.md-lang-xml .md-code-pi,.md-lang-xml .md-code-tag .md-code-title,color #c82829{color:#f5871f}.md-lang-css .md-code-rule .md-code-attribute,.md-lang-ruby .md-code-class .md-code-title{color:#eab700}.md-code-header,.md-code-inheritance,.md-code-name,.md-code-string,.md-code-value,.md-lang-ruby .md-code-symbol,.md-lang-xml .md-code-cdata{color:#718c00}.md-code-title,.md-lang-css .md-code-hexcolor{color:#3e999f}.md-code-function,.md-lang-coffeescript .md-code-title,.md-lang-javascript .md-code-title,.md-lang-perl .md-code-sub,.md-lang-python .md-code-decorator,.md-lang-python .md-code-title,.md-lang-ruby .md-code-function .md-code-title,.md-lang-ruby .md-code-title .md-code-keyword{color:#4271ae}.md-code-keyword,.md-lang-javascript .md-code-function{color:#8959a8}.md-lang-coffeescript .md-lang-javascript,.md-lang-javascript .md-lang-xml,.md-lang-tex .md-code-formula,.md-lang-xml .md-code-cdata,.md-lang-xml .md-lang-css,.md-lang-xml .md-lang-javascript,.md-lang-xml .vbscript{opacity:.5}.md-code-deletion{background-color:rgba(244,0,30,.05);color:#f4001e}.md-code-addition{background-color:rgba(27,194,17,.05);color:#1bc211}.md-mark{background-color:rgba(255,226,112,.5);color:inherit}.md-mark span{color:inherit}.md-heading-hover{cursor:pointer;background-color:rgba(22,134,162,.1)}.mde-text-left{text-align:left}.mde-text-center{text-align:center}.mde-text-right{text-align:right}.mde-size-small{font-size:12px}.mde-size-small,.mde-size-small p{line-height:12px}.mde-size-large{font-size:36px}.mde-size-large,.mde-size-large p{line-height:36px}.mde-size-giant{font-size:72px}.mde-size-giant,.mde-size-giant p{line-height:72px}.mde-clearfix:after{content:' ';display:block;visibility:hidden;clear:both;font-size:0;height:0}.mde-quote{margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.mde-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.mde-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .mde-heading,.ly-lean .mde-heading{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .mde-subheading,.ly-lean .mde-subheading{font-family:Merriweather,Georgia,serif}.mde-pad-0{padding:0}.mde-pad-5{padding:5px}.mde-pad-10{padding:10px}.mde-pad-15{padding:15px}.mde-pad-20{padding:20px}.mde-pad-25{padding:25px}.mde-pad-30{padding:30px}.mde-pad-50{padding:50px}.mde-mar-0{margin:0}.mde-mar-5{margin:5px}.mde-mar-10{margin:10px}.mde-mar-15{margin:15px}.mde-mar-20{margin:20px}.mde-mar-25{margin:25px}.mde-mar-30{margin:30px}.mde-mar-50{margin:50px}@media only screen and (min-width:900px){.mde-left{float:left}.mde-right{float:right}.mde-inline{display:inline-block;vertical-align:top}.mde-20{max-width:20%}.mde-25{max-width:25%}.mde-33{max-width:33.3333333333%}.mde-50{max-width:50%}.mde-66{max-width:66.6666666666%}.mde-75{max-width:75%}}.twitter-tweet-figure{background:0 0;padding:0}.twitter-tweet-figure:before{content:none}.twitter-tweet-figure .twitter-tweet{margin:0 auto}blockquote.twitter-tweet{overflow:hidden;color:#1c2022;background-color:#fff;border:1px solid #e1e8ed;border-radius:4px;width:500px;max-width:100%;min-width:220px;padding:1.25rem 1.25rem .725rem}blockquote.twitter-tweet:before{content:none}blockquote.twitter-tweet p{white-space:pre-wrap;font:16px/1.4 Helvetica,Roboto,'Segoe UI',Calibri,'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}blockquote.twitter-tweet a,blockquote.twitter-tweet a:visited{color:#2b7bb9}.wy-container{margin:0 auto;padding:20px 0;max-width:800px}.wy-container .md-markdown p{line-height:22px;margin:10px 0}.wy-container .md-markdown p:first-child{margin-top:0}.wy-container .md-markdown p:last-child{margin-bottom:0}.wy-container .md-markdown blockquote:not(.twitter-tweet){padding:10px 0}.wy-container .md-code-block{margin:0;padding:10px;white-space:pre-wrap}.wy-table{width:100%;padding:0}.wy-td{padding:0}.wy-section-link,.wy-section-markdown,.wy-section-poll,.wy-section-summary{padding-top:25px}.wy-section-thanks{margin-top:25px;padding:10px;font-size:15px;background-color:#f2fcf2}.wy-header-text,.wy-issue{display:inline-block;margin:10px 0;line-height:24px}.wy-issue{float:right;font-size:12px}.wy-issue-content{display:block;padding:0 5px;background-color:#fcfcfc}.wy-section-header{padding-top:40px}.wy-section-header h1,.wy-section-header h2,.wy-section-header h3,.wy-section-header h4,.wy-section-header h5,.wy-section-header h6{margin:0}.wy-section-header p{line-height:inherit}.wy-header-td{padding:0}.wy-header-content{margin:0 10px}.wy-header-text{color:#fcfcfc;text-shadow:1px 1px 0 #1a4d7f;font-weight:700;font-size:24px}.wy-content{padding-bottom:25px}.wy-link-addendum,.wy-link-tag,.wy-link-title{display:inline-block;vertical-align:bottom;margin-bottom:10px}.wy-link-title{border-bottom:1px solid;font-size:20px;margin-right:10px}.wy-link-tag{background-color:#1a4d7f;color:#fcfcfc;text-transform:uppercase;font-size:13px;margin-right:5px;padding:2px 4px}.wy-link-tag:last-child{margin-right:0}.wy-link-addendum{color:#999;margin-left:5px}.wy-link-addendum:hover{border-bottom-color:transparent}.wy-link-title-section{position:relative}.wy-link-stats{position:absolute;right:0;background-color:#3aca96;color:#fcfcfc;border-bottom:1px solid #299a71}.wy-link-stats-logo{background-color:rgba(0,0,0,.1);color:#299a71}.wy-link-stat{margin:3px}.wy-link-description{font-size:14px;color:#666}.wy-link-source-section{margin-top:10px}.wy-link-source{margin-right:10px;margin-bottom:10px;display:inline-block;vertical-align:middle;color:#55acee}.wy-link-source-plain{color:#333}.wy-link-source.wy-link-source-plain a{color:#55acee}.wy-link-source.wy-link-source-plain a:visited{background-color:rgba(85,172,238,.04)}.wy-link-source.wy-link-source-plain a:visited .md-code-inline:before{background-color:#55acee}.wy-link-source.wy-link-source-plain a:active{outline-color:#55acee}.wy-link-source.wy-link-source-plain a:hover{border-bottom-color:#55acee}.wy-link-sponsor{background-color:transparent;color:#999;outline:#999 solid 1px}.wy-link-cell-before-image{vertical-align:middle;width:70%}.wy-link-cell-image{padding-left:10px}.wy-link-image-anchor{display:block;overflow:hidden;max-height:300px}.wy-link-image{display:block;margin:0 auto}.wy-footer-table{margin:20px 0}.wy-footer-cell{text-align:center}.wy-read-online{font-size:13px}.wy-section-link-job .wy-link-source,.wy-section-link-job .wy-link-title{font-size:14px}.wy-section-link-job .wy-link-description{font-size:12px}.wy-link-pixel{float:right}@media only screen and (max-width:500px){.wy-issue-publication,.wy-issue-separator{display:none}}.md-code-block{margin:0!important;padding:10px}</style>]]></description><link>https://ponyfoo.com/weekly/189/esm-goes-ga-in-node-1320-react-fiber-react-native-expert-advice-css-architecture-and-lighthouse</link><guid isPermaLink="true">https://ponyfoo.com/weekly/189/esm-goes-ga-in-node-1320-react-fiber-react-native-expert-advice-css-architecture-and-lighthouse</guid><category><![CDATA[news]]></category><category><![CDATA[code]]></category><category><![CDATA[deep-dive]]></category><category><![CDATA[best-practices]]></category><category><![CDATA[survey]]></category><category><![CDATA[tutorial]]></category><category><![CDATA[point-of-view]]></category><category><![CDATA[javascript]]></category><category><![CDATA[css]]></category><dc:creator><![CDATA[nico@ponyfoo.com (Nicolás Bevacqua)]]></dc:creator><pubDate>Thu, 28 Nov 2019 14:39:46 GMT</pubDate></item><item><title><![CDATA[Expert Software Designers, V8, Web Page Test, Lovestruck with React, for..in, git, and roughViz! 🧠  — Pony Foo Weekly]]></title><description><![CDATA[<div class="f-core"><div class="md-markdown"><p>We&#x2019;re glad you could make it this week! </p> <p>With your help, we can make Pony Foo Weekly <em>even more</em> awesome: <a href="https://ponyfoo.com/weekly/submissions?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-188" target="_blank" rel="noopener noreferrer">send tips about cool resources</a>.</p> </div><div class="wy-section-header"><h3 class="md-markdown" style="color:#fcfcfc;background-color:#7d5cff;padding:10px"><div>Expert Advice </div> </h3></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://thereader.mitpress.mit.edu/habits-of-expert-software-designers/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-188" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Habits of Expert Software Designers</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/best-practices" style="color:#900070;background-color:#ffe270" class="wy-link-tag">Best Practices</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>The best software designers employ specific habits, learned practices, and observed principles when they work. Here are a few of them.</p> </div></div></td><td class="wy-td wy-link-cell-image"><a href="https://thereader.mitpress.mit.edu/habits-of-expert-software-designers/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-188" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://thereader.mitpress.mit.edu/wp-content/uploads/2019/09/final-desk.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://medium.com/better-programming/why-coding-your-own-makes-you-a-better-developer-5c53439c5e4a?source=friends_link&amp;sk=86f893a87f23d1e87ac699e68e87b896&amp;utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-188" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Why Coding Your Own Makes You a Better Developer</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/point-of-view" style="color:#f3720d;background-color:#ffeada" class="wy-link-tag">Point of View</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>As a developer you should not reinvent the wheel, but sometimes that&#x2019;s exactly what you should do to become a better programmer.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/dannymoerkerke?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-188" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Danny Moerkerke</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://alligator.io/js/v8-engine/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-188" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>V8 Engine and JavaScript Optimization Tips</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/performance" class="wy-link-tag">performance</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>A 5,000 feet overview of how the V8 JavaScript engine works and how to write JavaScript code that&#x2019;s optimized for fast parsing speed.</p> </div></div><div class="wy-link-source-section"><span class="wy-link-source wy-link-source-plain md-markdown md-markdown-inline"><p>Paul Ryan</p> </span></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://nooshu.github.io/blog/2019/10/02/how-to-read-a-wpt-waterfall-chart/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-188" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>How to read a Web Page Test waterfall chart</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/performance" class="wy-link-tag">performance</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>WebPageTest waterfall charts are a very powerful web performance tool, but can sometimes be a little confusing.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/TheRealNooshu?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-188" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Matt Hobbs</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-header"><h3 class="md-markdown" style="color:#fcfcfc;background-color:#f3720d;padding:10px"><div>A Mixed Bag </div> </h3></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://upmostly.com/web-development/how-react-reignited-my-love-for-web-development?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-188" style="color:#f3720d;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>How React Reignited My Love for Web Development</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/article" style="color:#e4f9e3;background-color:#1bc211" class="wy-link-tag">Article</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>James shares the reasons why he came back to web development after five years of iOS development, and why he attributes the comeback to React.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/upmostlyhq?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-188" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>James King</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="http://thecodebarbarian.com/mongoose-schema-design-pattern-store-what-you-query-for.html?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-188" style="color:#f3720d;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Mongoose: Store What You Query For</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/article" style="color:#e4f9e3;background-color:#1bc211" class="wy-link-tag">Article</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"></div></div><div class="wy-link-source-section"><a href="https://twitter.com/code_barbarian?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-188" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Valeri Karpov</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-header"><h3 class="md-markdown" style="color:#fcfcfc;background-color:#3aca96;padding:10px"><div>Code Things </div> </h3></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://github.com/tc39/proposal-for-in-order?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-188" style="color:#3aca96;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p><code>for..in</code> Enumeration Order Proposal at TC39</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/news" style="color:#1bc211;background-color:#e4f9e3" class="wy-link-tag">News</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Partially specifying object enumeration order in JavaScript.</p> </div></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://silvenon.com/blog/better-git-history/introduction?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-188" style="color:#3aca96;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Towards a Better Git History</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/deep-dive" style="color:#f7f0f5;background-color:#900070" class="wy-link-tag">Deep Dive</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"></div></div><div class="wy-link-source-section"><a href="https://twitter.com/silvenon?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-188" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Matija Marohni&#x107;</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://github.com/jwilber/roughViz?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-188" style="color:#3aca96;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p><code>jwilber/roughViz</code></p> </a><a href="https://ponyfoo.com/weekly/links/tagged/code" style="color:#1a4d7f;background-color:#ffe270" class="wy-link-tag">Code</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Reusable JavaScript library for creating hand-drawn styled charts in the browser. Great when you want to hand-wavily make your point.</p> <figure><img src="https://raw.githubusercontent.com/jwilber/random_data/master/roughViz.gif" alt></figure> </div></div></td></tr></table></td></tr></table></div></div><style>html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;position:relative;vertical-align:baseline}sup{top:-.5em}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto;resize:vertical;min-height:280px;max-height:900px}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item;margin:-10px -20px;padding:10px;background-color:#f6f6f6;cursor:pointer;border-bottom:2px solid #ddd}[hidden],template{display:none}body,body:after,body:before,html,html:after,html:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*,:after,:before{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}@-moz-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-webkit-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-o-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-moz-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-webkit-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-o-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}.f-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.f-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .f-heading,.ly-custom-heading h1,.ly-custom-heading h2,.ly-custom-heading h3,.ly-custom-heading h4,.ly-custom-heading h5,.ly-custom-heading h6,.ly-lean .f-heading,.ly-lean h1,.ly-lean h2,.ly-lean h3,.ly-lean h4,.ly-lean h5,.ly-lean h6{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .f-subheading,.ly-lean .f-subheading{font-family:Merriweather,Georgia,serif}body{margin:0;font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif;background:#fcfcfc;color:#333}img{max-width:100%;border:none}.md-markdown figure:not(.twitter-tweet-figure){background-color:#f6f6f6}.md-markdown figure:not(.twitter-tweet-figure)>a{display:block}.md-markdown figure:not(.twitter-tweet-figure)>a>img,.md-markdown figure:not(.twitter-tweet-figure)>img{display:block;margin-left:auto;margin-right:auto}.md-markdown figcaption{padding:10px;font-style:italic;font-size:14px;background:-webkit-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-moz-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-o-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-ms-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:linear-gradient(to right,#fff9e2 33%,#fcf9ee 100%);color:#555}.md-markdown .figure-has-loaded{background:-webkit-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-moz-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-o-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-ms-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fcf9ee 100%)}b,em,font-style italic,font-weight bold,i,ins,strong{text-decoration:none}del{text-decoration:line-through}sub,sup{bottom:0;line-height:18px}button,input{overflow:visible;border-radius:0}button{border:none;padding:6px 8px;font-size:1.2em;background:0 0}button[disabled]{color:#cbccbc!important}input,select,textarea{display:block;width:100%;padding:10px 8px;line-height:18px;border:none;font:inherit}select{height:38px}ol,ul{padding:0;margin:0;list-style-position:inside}li>ol,li>ul{margin-left:20px}hr{border:none;border-top:5px solid rgba(0,0,0,.05);margin:20px 0}kbd{display:inline-block;border:1px solid #ccc;margin:0 .1em;padding:.1em .6em;line-height:1.4;font-size:11px;background-color:#f7f7f7;-webkit-box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;border-radius:3px;color:#333;text-shadow:0 1px 0 #fff;white-space:nowrap}iframe{display:inline-block;border:none;max-width:100%}summary:hover{opacity:.8}details{padding:10px 20px 20px;border-bottom:2px dashed #ddd}details[open] summary{margin-bottom:20px}blockquote{border:none;margin:0!important}ol,p,ul{line-height:35px}p{margin:35px 0}@media only screen and (min-width:768px){ol,p,ul{line-height:30px}}a,button,input[type=submit]{cursor:pointer;text-decoration:none}.lk-link{color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.lk-link .md-code-inline{position:relative}.lk-link .md-code-inline:only-child{display:inline-block;line-height:17px}.lk-link .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.lk-link:visited{background-color:rgba(233,44,108,.04)}.lk-link:visited .md-code-inline:before{background-color:#e92c6c}.lk-link:hover{border-bottom:1px solid #e92c6c}.lk-rainbows{position:relative;color:#333;margin-bottom:5px}.lk-rainbows:hover:before{position:absolute;content:'';left:0;right:0;bottom:-8px;height:3px;opacity:.8;-webkit-transition:.1s ease-in-out;-moz-transition:.1s ease-in-out;-o-transition:.1s ease-in-out;-ms-transition:all .1s ease-in-out;transition:.1s ease-in-out;-webkit-animation:.5s infinite bg-rainbow;-moz-animation:.5s infinite bg-rainbow;-o-animation:.5s infinite bg-rainbow;-ms-animation:bg-rainbow .5s infinite;animation:.5s infinite bg-rainbow}.lk-icon{color:#333}.lk-icon:hover{color:#e92c6c}.lk-visitor{color:#333}.lk-visitor:after{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-left:5px}.lk-visitor.lk-visitor-large:after{font-size:1em}.lk-visitor:hover:after{color:#333;border-bottom-style:solid}.lk-visitor:visited:after{color:#7d5cff}.lk-visitor-inside{color:#333}.lk-visitor-inside .lk-visitor-target:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-inside.lk-visitor-large .lk-visitor-target:before{font-size:1em}.lk-visitor-inside:hover .lk-visitor-target:before{color:#333;border-bottom-style:solid}.lk-visitor-inside:visited .lk-visitor-target:before{color:#7d5cff}.lk-visitor-before{color:#333}.lk-visitor-before:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-before.lk-visitor-large:before{font-size:1em}.lk-visitor-before:hover:before{color:#333;border-bottom-style:solid}.lk-visitor-before:visited:before{color:#7d5cff}.lk-visitor-before-no-underline:before{border-bottom-width:0}.lk-link-to-green{color:#cbccbc}.lk-link-to-green:visited,.lk-link-to-green:visited:before{color:#1bc211;background-color:#1bc211}.lk-link-to-green:active{outline-color:#1bc211}.lk-link-to-green:hover,.lk-link-to-green:hover:before{color:#8be186;border-bottom-color:#1bc211}.lk-green .lk-link,a.lk-green{color:#1bc211}.lk-green .lk-link:visited,a.lk-green:visited{background-color:rgba(27,194,17,.04)}.lk-green .lk-link:visited .md-code-inline:before,a.lk-green:visited .md-code-inline:before{background-color:#1bc211}.lk-green .lk-link:active,a.lk-green:active{outline-color:#1bc211}.lk-green .lk-link:hover,a.lk-green:hover{border-bottom-color:#1bc211}.lk-green.lk-icon:hover{color:#1bc211}.lk-pink-light .lk-link,a.lk-pink-light{color:#ea6c93}.lk-pink-light .lk-link:visited,a.lk-pink-light:visited{background-color:rgba(234,108,147,.04)}.lk-pink-light .lk-link:visited .md-code-inline:before,a.lk-pink-light:visited .md-code-inline:before{background-color:#ea6c93}.lk-pink-light .lk-link:active,a.lk-pink-light:active{outline-color:#ea6c93}.lk-pink-light .lk-link:hover,a.lk-pink-light:hover{border-bottom-color:#ea6c93}.lk-pink-light.lk-icon:hover{color:#ea6c93}.lk-black .lk-link,a.lk-black{color:#333}.lk-black .lk-link:visited,a.lk-black:visited{background-color:rgba(51,51,51,.04)}.lk-black .lk-link:visited .md-code-inline:before,a.lk-black:visited .md-code-inline:before{background-color:#333}.lk-black .lk-link:active,a.lk-black:active{outline-color:#333}.lk-black .lk-link:hover,a.lk-black:hover{border-bottom-color:#333}.lk-black.lk-icon:hover{color:#333}.lk-gray .lk-link,a.lk-gray{color:#999}.lk-gray .lk-link:visited,a.lk-gray:visited{background-color:rgba(153,153,153,.04)}.lk-gray .lk-link:visited .md-code-inline:before,a.lk-gray:visited .md-code-inline:before{background-color:#999}.lk-gray .lk-link:active,a.lk-gray:active{outline-color:#999}.lk-gray .lk-link:hover,a.lk-gray:hover{border-bottom-color:#999}.lk-gray.lk-icon:hover{color:#999}.lk-white .lk-link,a.lk-white{color:#fcfcfc}.lk-white .lk-link:visited,a.lk-white:visited{background-color:rgba(252,252,252,.04)}.lk-white .lk-link:visited .md-code-inline:before,a.lk-white:visited .md-code-inline:before{background-color:#fcfcfc}.lk-white .lk-link:active,a.lk-white:active{outline-color:#fcfcfc}.lk-white .lk-link:hover,a.lk-white:hover{border-bottom-color:#fcfcfc}.lk-white.lk-icon:hover{color:#fcfcfc}.lk-orange .lk-link,a.lk-orange{color:#f3720d}.lk-orange .lk-link:visited,a.lk-orange:visited{background-color:rgba(243,114,13,.04)}.lk-orange .lk-link:visited .md-code-inline:before,a.lk-orange:visited .md-code-inline:before{background-color:#f3720d}.lk-orange .lk-link:active,a.lk-orange:active{outline-color:#f3720d}.lk-orange .lk-link:hover,a.lk-orange:hover{border-bottom-color:#f3720d}.lk-orange.lk-icon:hover{color:#f3720d}.lk-lilly .lk-link,a.lk-lilly{color:#7d5cff}.lk-lilly .lk-link:visited,a.lk-lilly:visited{background-color:rgba(125,92,255,.04)}.lk-lilly .lk-link:visited .md-code-inline:before,a.lk-lilly:visited .md-code-inline:before{background-color:#7d5cff}.lk-lilly .lk-link:active,a.lk-lilly:active{outline-color:#7d5cff}.lk-lilly .lk-link:hover,a.lk-lilly:hover{border-bottom-color:#7d5cff}.lk-lilly.lk-icon:hover{color:#7d5cff}.lk-blue .lk-link,a.lk-blue{color:#1a4d7f}.lk-blue .lk-link:visited,a.lk-blue:visited{background-color:rgba(26,77,127,.04)}.lk-blue .lk-link:visited .md-code-inline:before,a.lk-blue:visited .md-code-inline:before{background-color:#1a4d7f}.lk-blue .lk-link:active,a.lk-blue:active{outline-color:#1a4d7f}.lk-blue .lk-link:hover,a.lk-blue:hover{border-bottom-color:#1a4d7f}.lk-blue.lk-icon:hover{color:#1a4d7f}.lk-inherited .lk-link,a.lk-inherited{color:inherit}.lk-inherited .lk-link:active,a.lk-inherited:active{outline-color:inherit}.lk-inherited .lk-link:hover,a.lk-inherited:hover{border-bottom-color:inherit}.lk-inherited.lk-icon:hover{color:inherit}.lk-twitter .lk-link,a.lk-twitter{color:#55acee}.lk-twitter .lk-link:visited,a.lk-twitter:visited{background-color:rgba(85,172,238,.04)}.lk-twitter .lk-link:visited .md-code-inline:before,a.lk-twitter:visited .md-code-inline:before{background-color:#55acee}.lk-twitter .lk-link:active,a.lk-twitter:active{outline-color:#55acee}.lk-twitter .lk-link:hover,a.lk-twitter:hover{border-bottom-color:#55acee}.lk-twitter.lk-icon:hover{color:#55acee}.lk-facebook .lk-link,a.lk-facebook{color:#3b5998}.lk-facebook .lk-link:visited,a.lk-facebook:visited{background-color:rgba(59,89,152,.04)}.lk-facebook .lk-link:visited .md-code-inline:before,a.lk-facebook:visited .md-code-inline:before{background-color:#3b5998}.lk-facebook .lk-link:active,a.lk-facebook:active{outline-color:#3b5998}.lk-facebook .lk-link:hover,a.lk-facebook:hover{border-bottom-color:#3b5998}.lk-facebook.lk-icon:hover{color:#3b5998}.lk-clean{background-color:transparent}.lk-chrome:hover{color:#4989f4}.lk-teal .lk-link,a.lk-teal{color:#00a19c}.lk-teal .lk-link:visited,a.lk-teal:visited{background-color:rgba(0,161,156,.04)}.lk-teal .lk-link:visited .md-code-inline:before,a.lk-teal:visited .md-code-inline:before{background-color:#00a19c}.lk-teal .lk-link:active,a.lk-teal:active{outline-color:#00a19c}.lk-teal .lk-link:hover,a.lk-teal:hover{border-bottom-color:#00a19c}.lk-teal.lk-icon:hover{color:#00a19c}table{width:100%;border-spacing:0;border-collapse:separate}td,th{padding:8px}@media only screen and (max-width:950px){.table-responsive{display:block}.table-responsive>thead{display:none}.table-responsive>tbody,.table-responsive>tfoot{display:block}.table-responsive>tbody>tr,.table-responsive>tfoot>tr{display:block;background-color:rgba(203,204,188,.1);margin-bottom:30px}.table-responsive>tbody>tr:nth-child(even),.table-responsive>tfoot>tr:nth-child(even){background-color:rgba(203,204,188,.15)}.table-responsive>tbody>tr:last-child,.table-responsive>tfoot>tr:last-child{margin-bottom:0}.table-responsive>tbody>tr>td,.table-responsive>tfoot>tr>td{display:block;text-align:left}.table-responsive>tbody>tr>td:before,.table-responsive>tfoot>tr>td:before{display:block;content:attr(data-label);color:#555;font-size:13px;margin:0 0 5px}.table-responsive .table-responsive-hide{display:none}}.c-oreilly-teal{color:#00a19c}.c-yellow-highlight{color:#ffe270}.c-dark-orange{color:#f3720d}.c-pink{color:#e92c6c}.c-purple{color:#900070}.c-blue{color:#1a4d7f}.c-dark-turquoise{color:#1686a2}.c-dark-green{color:#1bc211}.c-white{color:#fcfcfc}.c-gray{color:#b7b7b7}.c-lilly{color:#7d5cff}.c-teal{color:#3aca96}.c-bg-oreilly-teal{background-color:#00a19c}.c-bg-yellow-highlight{background-color:#ffe270}.c-bg-dark-orange{background-color:#f3720d}.c-bg-pink{background-color:#e92c6c}.c-bg-purple{background-color:#900070}.c-bg-blue{background-color:#1a4d7f}.c-bg-dark-turquoise{background-color:#1686a2}.c-bg-dark-green{background-color:#1bc211}.c-bg-white{background-color:#fcfcfc}.c-bg-gray{background-color:#b7b7b7}.c-bg-lilly{background-color:#7d5cff}.c-bg-teal{background-color:#3aca96}.tj-emoji{width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em}.dc-header{margin-bottom:60px}.dc-heading{text-align:center;font-size:4em;padding:0 10px;margin-top:0;margin-bottom:10px}.dc-role{line-height:26px;padding:0 20px;margin-top:10px;text-align:center;font-style:italic;color:#cbccbc}.dc-colored{background:#f6f6f6;border-top:9px solid rgba(125,92,255,.5)}.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:800px}.md-markdown blockquote:not(.twitter-tweet){margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.md-markdown blockquote:not(.twitter-tweet) h1,.md-markdown blockquote:not(.twitter-tweet) h2,.md-markdown blockquote:not(.twitter-tweet) h3,.md-markdown blockquote:not(.twitter-tweet) h4,.md-markdown blockquote:not(.twitter-tweet) h5,.md-markdown blockquote:not(.twitter-tweet) h6{margin:-20px 0;padding:20px 0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block{margin:0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block:last-child{margin-bottom:-20px}.md-markdown img:first-child{margin-top:0}.md-markdown img:last-child{margin-bottom:0}.md-markdown p:first-child{margin-top:0}.md-markdown p:last-child{margin-bottom:0}.md-markdown .md-code-block+ol,.md-markdown .md-code-block+ul,.md-markdown ol+.md-code-block,.md-markdown ul+.md-code-block{margin-top:35px}.md-markdown a:not(.md-heading){color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.md-markdown a:not(.md-heading) .md-code-inline{position:relative}.md-markdown a:not(.md-heading) .md-code-inline:only-child{display:inline-block;line-height:17px}.md-markdown a:not(.md-heading) .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.md-markdown a:not(.md-heading):visited{background-color:rgba(233,44,108,.04)}.md-markdown a:not(.md-heading):visited .md-code-inline:before{background-color:#e92c6c}.md-markdown a:not(.md-heading):hover{border-bottom:1px solid #e92c6c}.md-markdown thead{background-color:#e0e0e0}.md-markdown tbody{background-color:#f6f6f6}.md-markdown tbody tr:nth-child(even){background-color:#f9f9f9}.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{padding:10px 0}.md-markdown h1:first-child,.md-markdown h2:first-child,.md-markdown h3:first-child,.md-markdown h4:first-child,.md-markdown h5:first-child,.md-markdown h6:first-child{margin-top:0}.md-markdown h1:last-child,.md-markdown h2:last-child,.md-markdown h3:last-child,.md-markdown h4:last-child,.md-markdown h5:last-child,.md-markdown h6:last-child{margin-bottom:0}.md-markdown iframe{display:block;margin:35px auto}.md-markdown iframe:first-child{margin-top:0}.md-markdown iframe:last-child{margin-bottom:0}.md-markdown li>p:only-child{display:inline}.md-markdown ul{list-style-type:none}.md-markdown ul>li:before{content:'◯';margin-right:5px}.md-heading{color:inherit}.md-markdown-inline{display:inline}.md-markdown-inline p{display:inline;line-height:initial}.md-code-block,.ocha-highlighted{margin:0 -20px}.ocha-code-block{padding:18px 50px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{max-width:inherit!important;margin:0 -20px;padding-left:20px;padding-right:20px}.md-code-block .md-code{display:block}.md-markdown-summary p{margin:10px 0}@media only screen and (min-width:768px){.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{margin-left:-40px;margin-right:-40px;padding:10px 40px}.md-code-block,.ocha-highlighted{margin:0 -40px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{margin:0 -40px;padding-left:40px;padding-right:40px}}@media only screen and (min-width:1300px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:900px}}@media only screen and (min-width:1400px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:1000px}.md-code-block,.md-markdown:not(.mm-content-html) .md-code-block+blockquote,.ocha-highlighted{margin:0 -400px 0 -40px}}.md-markdown-large blockquote,.md-markdown-large code,.md-markdown-large ol,.md-markdown-large p,.md-markdown-large table,.md-markdown-large ul{max-width:inherit}.md-footnotes{margin-top:80px;padding:20px 0;border-top:1px dashed #cbccbc}.md-footnote{margin:0;padding:8px 0;font-size:14px;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.md-footnote p{line-height:16px}.md-footnote-anchor{padding:2px 6px;margin-right:10px;text-align:center;font-weight:700;color:#e92c6c}.ly-custom-subheading .md-footnote-anchor,.ly-lean .md-footnote-anchor{font-family:Merriweather,Georgia,serif}.md-markdown a.md-footnote-anchor{border:1px solid #e92c6c}.md-markdown a.md-footnote-anchor:hover{background-color:#e92c6c;color:#fcfcfc}.md-footnote-ref{margin-left:1px;margin-right:3px}.md-markdown a.md-footnote-ref{border-bottom:1px dotted}.md-code-block,.md-code-inline{-webkit-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none;background:#fcfcf5;color:#4d4d4c}.md-code-block{line-height:24px}.md-code{padding:8px 10px}.md-code-inline{padding:0 6px}a .md-code{color:inherit}.md-code-comment{color:#8e908c}.md-code-attribute,.md-code-built_in,.md-code-constant,.md-code-literal,.md-code-number,.md-code-params,.md-code-pragma,.md-code-preprocessor,.md-code-regexp,.md-code-tag,.md-code-variable,.md-lang-css .md-code-class,.md-lang-css .md-code-id,.md-lang-css .md-code-pseudo,.md-lang-html .md-code-doctype,.md-lang-ruby .md-code-constant,.md-lang-xml .md-code-doctype,.md-lang-xml .md-code-pi,.md-lang-xml .md-code-tag .md-code-title,color #c82829{color:#f5871f}.md-lang-css .md-code-rule .md-code-attribute,.md-lang-ruby .md-code-class .md-code-title{color:#eab700}.md-code-header,.md-code-inheritance,.md-code-name,.md-code-string,.md-code-value,.md-lang-ruby .md-code-symbol,.md-lang-xml .md-code-cdata{color:#718c00}.md-code-title,.md-lang-css .md-code-hexcolor{color:#3e999f}.md-code-function,.md-lang-coffeescript .md-code-title,.md-lang-javascript .md-code-title,.md-lang-perl .md-code-sub,.md-lang-python .md-code-decorator,.md-lang-python .md-code-title,.md-lang-ruby .md-code-function .md-code-title,.md-lang-ruby .md-code-title .md-code-keyword{color:#4271ae}.md-code-keyword,.md-lang-javascript .md-code-function{color:#8959a8}.md-lang-coffeescript .md-lang-javascript,.md-lang-javascript .md-lang-xml,.md-lang-tex .md-code-formula,.md-lang-xml .md-code-cdata,.md-lang-xml .md-lang-css,.md-lang-xml .md-lang-javascript,.md-lang-xml .vbscript{opacity:.5}.md-code-deletion{background-color:rgba(244,0,30,.05);color:#f4001e}.md-code-addition{background-color:rgba(27,194,17,.05);color:#1bc211}.md-mark{background-color:rgba(255,226,112,.5);color:inherit}.md-mark span{color:inherit}.md-heading-hover{cursor:pointer;background-color:rgba(22,134,162,.1)}.mde-text-left{text-align:left}.mde-text-center{text-align:center}.mde-text-right{text-align:right}.mde-size-small{font-size:12px}.mde-size-small,.mde-size-small p{line-height:12px}.mde-size-large{font-size:36px}.mde-size-large,.mde-size-large p{line-height:36px}.mde-size-giant{font-size:72px}.mde-size-giant,.mde-size-giant p{line-height:72px}.mde-clearfix:after{content:' ';display:block;visibility:hidden;clear:both;font-size:0;height:0}.mde-quote{margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.mde-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.mde-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .mde-heading,.ly-lean .mde-heading{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .mde-subheading,.ly-lean .mde-subheading{font-family:Merriweather,Georgia,serif}.mde-pad-0{padding:0}.mde-pad-5{padding:5px}.mde-pad-10{padding:10px}.mde-pad-15{padding:15px}.mde-pad-20{padding:20px}.mde-pad-25{padding:25px}.mde-pad-30{padding:30px}.mde-pad-50{padding:50px}.mde-mar-0{margin:0}.mde-mar-5{margin:5px}.mde-mar-10{margin:10px}.mde-mar-15{margin:15px}.mde-mar-20{margin:20px}.mde-mar-25{margin:25px}.mde-mar-30{margin:30px}.mde-mar-50{margin:50px}@media only screen and (min-width:900px){.mde-left{float:left}.mde-right{float:right}.mde-inline{display:inline-block;vertical-align:top}.mde-20{max-width:20%}.mde-25{max-width:25%}.mde-33{max-width:33.3333333333%}.mde-50{max-width:50%}.mde-66{max-width:66.6666666666%}.mde-75{max-width:75%}}.twitter-tweet-figure{background:0 0;padding:0}.twitter-tweet-figure:before{content:none}.twitter-tweet-figure .twitter-tweet{margin:0 auto}blockquote.twitter-tweet{overflow:hidden;color:#1c2022;background-color:#fff;border:1px solid #e1e8ed;border-radius:4px;width:500px;max-width:100%;min-width:220px;padding:1.25rem 1.25rem .725rem}blockquote.twitter-tweet:before{content:none}blockquote.twitter-tweet p{white-space:pre-wrap;font:16px/1.4 Helvetica,Roboto,'Segoe UI',Calibri,'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}blockquote.twitter-tweet a,blockquote.twitter-tweet a:visited{color:#2b7bb9}.wy-container{margin:0 auto;padding:20px 0;max-width:800px}.wy-container .md-markdown p{line-height:22px;margin:10px 0}.wy-container .md-markdown p:first-child{margin-top:0}.wy-container .md-markdown p:last-child{margin-bottom:0}.wy-container .md-markdown blockquote:not(.twitter-tweet){padding:10px 0}.wy-container .md-code-block{margin:0;padding:10px;white-space:pre-wrap}.wy-table{width:100%;padding:0}.wy-td{padding:0}.wy-section-link,.wy-section-markdown,.wy-section-poll,.wy-section-summary{padding-top:25px}.wy-section-thanks{margin-top:25px;padding:10px;font-size:15px;background-color:#f2fcf2}.wy-header-text,.wy-issue{display:inline-block;margin:10px 0;line-height:24px}.wy-issue{float:right;font-size:12px}.wy-issue-content{display:block;padding:0 5px;background-color:#fcfcfc}.wy-section-header{padding-top:40px}.wy-section-header h1,.wy-section-header h2,.wy-section-header h3,.wy-section-header h4,.wy-section-header h5,.wy-section-header h6{margin:0}.wy-section-header p{line-height:inherit}.wy-header-td{padding:0}.wy-header-content{margin:0 10px}.wy-header-text{color:#fcfcfc;text-shadow:1px 1px 0 #1a4d7f;font-weight:700;font-size:24px}.wy-content{padding-bottom:25px}.wy-link-addendum,.wy-link-tag,.wy-link-title{display:inline-block;vertical-align:bottom;margin-bottom:10px}.wy-link-title{border-bottom:1px solid;font-size:20px;margin-right:10px}.wy-link-tag{background-color:#1a4d7f;color:#fcfcfc;text-transform:uppercase;font-size:13px;margin-right:5px;padding:2px 4px}.wy-link-tag:last-child{margin-right:0}.wy-link-addendum{color:#999;margin-left:5px}.wy-link-addendum:hover{border-bottom-color:transparent}.wy-link-title-section{position:relative}.wy-link-stats{position:absolute;right:0;background-color:#3aca96;color:#fcfcfc;border-bottom:1px solid #299a71}.wy-link-stats-logo{background-color:rgba(0,0,0,.1);color:#299a71}.wy-link-stat{margin:3px}.wy-link-description{font-size:14px;color:#666}.wy-link-source-section{margin-top:10px}.wy-link-source{margin-right:10px;margin-bottom:10px;display:inline-block;vertical-align:middle;color:#55acee}.wy-link-source-plain{color:#333}.wy-link-source.wy-link-source-plain a{color:#55acee}.wy-link-source.wy-link-source-plain a:visited{background-color:rgba(85,172,238,.04)}.wy-link-source.wy-link-source-plain a:visited .md-code-inline:before{background-color:#55acee}.wy-link-source.wy-link-source-plain a:active{outline-color:#55acee}.wy-link-source.wy-link-source-plain a:hover{border-bottom-color:#55acee}.wy-link-sponsor{background-color:transparent;color:#999;outline:#999 solid 1px}.wy-link-cell-before-image{vertical-align:middle;width:70%}.wy-link-cell-image{padding-left:10px}.wy-link-image-anchor{display:block;overflow:hidden;max-height:300px}.wy-link-image{display:block;margin:0 auto}.wy-footer-table{margin:20px 0}.wy-footer-cell{text-align:center}.wy-read-online{font-size:13px}.wy-section-link-job .wy-link-source,.wy-section-link-job .wy-link-title{font-size:14px}.wy-section-link-job .wy-link-description{font-size:12px}.wy-link-pixel{float:right}@media only screen and (max-width:500px){.wy-issue-publication,.wy-issue-separator{display:none}}.md-code-block{margin:0!important;padding:10px}</style>]]></description><link>https://ponyfoo.com/weekly/188/expert-software-designers-v8-web-page-test-lovestruck-with-react-forin-git-and-roughviz</link><guid isPermaLink="true">https://ponyfoo.com/weekly/188/expert-software-designers-v8-web-page-test-lovestruck-with-react-forin-git-and-roughviz</guid><category><![CDATA[best-practices]]></category><category><![CDATA[point-of-view]]></category><category><![CDATA[performance]]></category><category><![CDATA[article]]></category><category><![CDATA[news]]></category><category><![CDATA[deep-dive]]></category><category><![CDATA[code]]></category><category><![CDATA[javascript]]></category><category><![CDATA[css]]></category><dc:creator><![CDATA[nico@ponyfoo.com (Nicolás Bevacqua)]]></dc:creator><pubDate>Thu, 17 Oct 2019 13:05:56 GMT</pubDate></item><item><title><![CDATA[VR, Intercepting HTTP, QUIC & HTTP/3, Performance, Intersection Observer, Async Functions, Recursion in React! 🍨  — Pony Foo Weekly]]></title><description><![CDATA[<div class="f-core"><div class="md-markdown"><p>We&#x2019;re glad you could make it this week! </p> <p>With your help, we can make Pony Foo Weekly <em>even more</em> awesome: <a href="https://ponyfoo.com/weekly/submissions?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" target="_blank" rel="noopener noreferrer">send tips about cool resources</a>.</p> </div><div class="wy-section-header"><h3 class="md-markdown" style="color:#fcfcfc;background-color:#3aca96;padding:10px"><div>Bleeding Edge </div> </h3></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://www.youtube.com/watch?v=RCB_mfGmh9w&amp;t=1h47m12s&amp;utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" style="color:#3aca96;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Facebook Horizon and the future of VR</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/inspiration" class="wy-link-tag">inspiration</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Facebook Horizon might not seem like such a great idea, but the vision Facebook leaders have for VR and AR in mixed reality is nothing short of inspiring. Watch the end of the keynote and skip right ahead to see what I mean.</p> </div></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-primary"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://www.educative.io/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" style="color:#3aca96;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Educative: Learn anything from CSS to System Design</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/code" style="color:#1a4d7f;background-color:#ffe270" class="wy-link-tag">Code</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Rich, text-based courses with embedded coding environments make learning a breeze. Pick up Vue, learn React, conquer Redux, or just prep for an interview. Try a free preview today!</p> </div></div><div class="wy-link-source-section"><a href="https://ponyfoo.com/weekly/links/tagged/sponsored" class="wy-link-tag wy-link-sponsor">Sponsored</a></div></td><td class="wy-td wy-link-cell-image"><a href="https://www.educative.io/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://images.ponyfoo.com/uploads/carbon_small_logo-d991652d0fc54c579a0a3223b9ec95b4.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://httptoolkit.tech/mock/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" style="color:#3aca96;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Intercept, debug and build HTTP</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/tools" class="wy-link-tag">tools</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Intercept &amp; view all your HTTP traffic. Mock endpoints or entire servers. Rewrite, redirect, or inject errors.</p> </div></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://blog.cloudflare.com/http3-the-past-present-and-future/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" style="color:#3aca96;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>HTTP/3: the past, the present, and the future</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/news" style="color:#1bc211;background-color:#e4f9e3" class="wy-link-tag">News</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Cloudflare dives into HTTP/3, QUIC, and how we got here.</p> </div></div></td><td class="wy-td wy-link-cell-image"><a href="https://blog.cloudflare.com/http3-the-past-present-and-future/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://blog-cloudflare-com-assets.storage.googleapis.com/2019/09/http3-option-tunnel@2x-1-1.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://www.swyx.io/writing/js-tooling?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" style="color:#3aca96;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Why JavaScript Tooling Sucks</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/point-of-view" style="color:#f3720d;background-color:#ffeada" class="wy-link-tag">Point of View</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>A reasonably balanced explainer on why JavaScript tooling sucks.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/swyx?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Shawn Wang</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-header"><h3 class="md-markdown" style="color:#fcfcfc;background-color:#900070;padding:10px"><div>Web of Bits </div> </h3></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://engineering.shopify.com/blogs/engineering/improve-ui-performance-understanding-your-user?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" style="color:#900070;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Improve Performance by Understanding Your User</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/performance" class="wy-link-tag">performance</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Darren&#x2019;s team did a deep dive into the performance of a section in the Shopify admin app. This included a mix of improvements that affected load time, perceived load time, as well as any interactions that happen after the merchant has landed in the page.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/darrenhebner?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Darren Hebner</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://css-tricks.com/an-explanation-of-how-the-intersection-observer-watches/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" style="color:#900070;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>How the Intersection Observer Watches</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/deep-dive" style="color:#f7f0f5;background-color:#900070" class="wy-link-tag">Deep Dive</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"></div></div><div class="wy-link-source-section"><span class="wy-link-source wy-link-source-plain md-markdown md-markdown-inline"><p>Travis Almand</p> </span></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://medium.com/@zhirzh/an-async-function-will-never-throw-5f75c19d78e8?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" style="color:#900070;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>An async function will never throw</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/introductory" style="color:#900070;background-color:#f7f0f5" class="wy-link-tag">Introductory</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>As it&#x2019;s promise based, it might reject, but it would never throw.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/zhirzh?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Shirsh Zibbu</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://phoboslab.org/log/2019/09/voidcall-making-of?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" style="color:#900070;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Making of a 13kB JavaScript Game</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/deep-dive" style="color:#f7f0f5;background-color:#900070" class="wy-link-tag">Deep Dive</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Dominic explains how he built a tightly packed RTS game using only 13kb of JavaScript and WebGL.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/phoboslab?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Dominic Szablewski</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-header"><h3 class="md-markdown" style="color:#fcfcfc;background-color:#7d5cff;padding:10px"><div>Just React Things </div> </h3></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://blog.sapegin.me/all/react-testing-3-jest-and-react-testing-library/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Modern React testing</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/deep-dive" style="color:#f7f0f5;background-color:#900070" class="wy-link-tag">Deep Dive</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><blockquote> <p><em>&#x201C;In-depth snapshot of the current state of testing React components and frontend in general, explaining many whys, not just hows. We&#x2019;ll discuss why to write automated tests, what tests to write and how to write them. In practical articles we&#x2019;ll learn how to use Jest, Enzyme and React Testing Library to test React components.&#x201D;</em></p> </blockquote> <p>In this part: how to test React components with Jest and React Testing Library, as well as best practices!</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/iamsapegin?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Artem Sapegin</p> </a></div></td><td class="wy-td wy-link-cell-image"><a href="https://blog.sapegin.me/all/react-testing-3-jest-and-react-testing-library/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://d33wubrfki0l68.cloudfront.net/d7ab3695abb54f0ccf221a75cddce4296e64c5a1/41e9e/images/jest-react-testing-library.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://kentcdodds.com/blog/state-colocation-will-make-your-react-app-faster?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>State Colocation will make your React app faster</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/performance" class="wy-link-tag">performance</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>How state colocation makes your app not only more maintainable but also faster.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/kentcdodds?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Kent C. Dodds</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://coderrocketfuel.com/article/recursion-in-react-render-comments-with-nested-children?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Recursion in React: An Example</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/article" style="color:#e4f9e3;background-color:#1bc211" class="wy-link-tag">Article</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>What is recursion and why should you use when building software? And how could it be used to render recursive and nested comments component in React?</p> </div></div><div class="wy-link-source-section"><span class="wy-link-source wy-link-source-plain md-markdown md-markdown-inline"><p>Nick Major</p> </span></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://kentcdodds.com/blog/dont-sync-state-derive-it?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" style="color:#7d5cff;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Derive State instead of Syncing it</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/best-practices" style="color:#900070;background-color:#ffe270" class="wy-link-tag">Best Practices</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>How to avoid state synchronization bugs and complexity by using derived state instead.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/kentcdodds?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-187" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Kent C. Dodds</p> </a></div></td></tr></table></td></tr></table></div></div><style>html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;position:relative;vertical-align:baseline}sup{top:-.5em}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto;resize:vertical;min-height:280px;max-height:900px}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item;margin:-10px -20px;padding:10px;background-color:#f6f6f6;cursor:pointer;border-bottom:2px solid #ddd}[hidden],template{display:none}body,body:after,body:before,html,html:after,html:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*,:after,:before{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}@-moz-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-webkit-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-o-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-moz-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-webkit-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-o-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}.f-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.f-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .f-heading,.ly-custom-heading h1,.ly-custom-heading h2,.ly-custom-heading h3,.ly-custom-heading h4,.ly-custom-heading h5,.ly-custom-heading h6,.ly-lean .f-heading,.ly-lean h1,.ly-lean h2,.ly-lean h3,.ly-lean h4,.ly-lean h5,.ly-lean h6{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .f-subheading,.ly-lean .f-subheading{font-family:Merriweather,Georgia,serif}body{margin:0;font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif;background:#fcfcfc;color:#333}img{max-width:100%;border:none}.md-markdown figure:not(.twitter-tweet-figure){background-color:#f6f6f6}.md-markdown figure:not(.twitter-tweet-figure)>a{display:block}.md-markdown figure:not(.twitter-tweet-figure)>a>img,.md-markdown figure:not(.twitter-tweet-figure)>img{display:block;margin-left:auto;margin-right:auto}.md-markdown figcaption{padding:10px;font-style:italic;font-size:14px;background:-webkit-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-moz-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-o-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-ms-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:linear-gradient(to right,#fff9e2 33%,#fcf9ee 100%);color:#555}.md-markdown .figure-has-loaded{background:-webkit-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-moz-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-o-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-ms-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fcf9ee 100%)}b,em,font-style italic,font-weight bold,i,ins,strong{text-decoration:none}del{text-decoration:line-through}sub,sup{bottom:0;line-height:18px}button,input{overflow:visible;border-radius:0}button{border:none;padding:6px 8px;font-size:1.2em;background:0 0}button[disabled]{color:#cbccbc!important}input,select,textarea{display:block;width:100%;padding:10px 8px;line-height:18px;border:none;font:inherit}select{height:38px}ol,ul{padding:0;margin:0;list-style-position:inside}li>ol,li>ul{margin-left:20px}hr{border:none;border-top:5px solid rgba(0,0,0,.05);margin:20px 0}kbd{display:inline-block;border:1px solid #ccc;margin:0 .1em;padding:.1em .6em;line-height:1.4;font-size:11px;background-color:#f7f7f7;-webkit-box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;border-radius:3px;color:#333;text-shadow:0 1px 0 #fff;white-space:nowrap}iframe{display:inline-block;border:none;max-width:100%}summary:hover{opacity:.8}details{padding:10px 20px 20px;border-bottom:2px dashed #ddd}details[open] summary{margin-bottom:20px}blockquote{border:none;margin:0!important}ol,p,ul{line-height:35px}p{margin:35px 0}@media only screen and (min-width:768px){ol,p,ul{line-height:30px}}a,button,input[type=submit]{cursor:pointer;text-decoration:none}.lk-link{color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.lk-link .md-code-inline{position:relative}.lk-link .md-code-inline:only-child{display:inline-block;line-height:17px}.lk-link .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.lk-link:visited{background-color:rgba(233,44,108,.04)}.lk-link:visited .md-code-inline:before{background-color:#e92c6c}.lk-link:hover{border-bottom:1px solid #e92c6c}.lk-rainbows{position:relative;color:#333;margin-bottom:5px}.lk-rainbows:hover:before{position:absolute;content:'';left:0;right:0;bottom:-8px;height:3px;opacity:.8;-webkit-transition:.1s ease-in-out;-moz-transition:.1s ease-in-out;-o-transition:.1s ease-in-out;-ms-transition:all .1s ease-in-out;transition:.1s ease-in-out;-webkit-animation:.5s infinite bg-rainbow;-moz-animation:.5s infinite bg-rainbow;-o-animation:.5s infinite bg-rainbow;-ms-animation:bg-rainbow .5s infinite;animation:.5s infinite bg-rainbow}.lk-icon{color:#333}.lk-icon:hover{color:#e92c6c}.lk-visitor{color:#333}.lk-visitor:after{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-left:5px}.lk-visitor.lk-visitor-large:after{font-size:1em}.lk-visitor:hover:after{color:#333;border-bottom-style:solid}.lk-visitor:visited:after{color:#7d5cff}.lk-visitor-inside{color:#333}.lk-visitor-inside .lk-visitor-target:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-inside.lk-visitor-large .lk-visitor-target:before{font-size:1em}.lk-visitor-inside:hover .lk-visitor-target:before{color:#333;border-bottom-style:solid}.lk-visitor-inside:visited .lk-visitor-target:before{color:#7d5cff}.lk-visitor-before{color:#333}.lk-visitor-before:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-before.lk-visitor-large:before{font-size:1em}.lk-visitor-before:hover:before{color:#333;border-bottom-style:solid}.lk-visitor-before:visited:before{color:#7d5cff}.lk-visitor-before-no-underline:before{border-bottom-width:0}.lk-link-to-green{color:#cbccbc}.lk-link-to-green:visited,.lk-link-to-green:visited:before{color:#1bc211;background-color:#1bc211}.lk-link-to-green:active{outline-color:#1bc211}.lk-link-to-green:hover,.lk-link-to-green:hover:before{color:#8be186;border-bottom-color:#1bc211}.lk-green .lk-link,a.lk-green{color:#1bc211}.lk-green .lk-link:visited,a.lk-green:visited{background-color:rgba(27,194,17,.04)}.lk-green .lk-link:visited .md-code-inline:before,a.lk-green:visited .md-code-inline:before{background-color:#1bc211}.lk-green .lk-link:active,a.lk-green:active{outline-color:#1bc211}.lk-green .lk-link:hover,a.lk-green:hover{border-bottom-color:#1bc211}.lk-green.lk-icon:hover{color:#1bc211}.lk-pink-light .lk-link,a.lk-pink-light{color:#ea6c93}.lk-pink-light .lk-link:visited,a.lk-pink-light:visited{background-color:rgba(234,108,147,.04)}.lk-pink-light .lk-link:visited .md-code-inline:before,a.lk-pink-light:visited .md-code-inline:before{background-color:#ea6c93}.lk-pink-light .lk-link:active,a.lk-pink-light:active{outline-color:#ea6c93}.lk-pink-light .lk-link:hover,a.lk-pink-light:hover{border-bottom-color:#ea6c93}.lk-pink-light.lk-icon:hover{color:#ea6c93}.lk-black .lk-link,a.lk-black{color:#333}.lk-black .lk-link:visited,a.lk-black:visited{background-color:rgba(51,51,51,.04)}.lk-black .lk-link:visited .md-code-inline:before,a.lk-black:visited .md-code-inline:before{background-color:#333}.lk-black .lk-link:active,a.lk-black:active{outline-color:#333}.lk-black .lk-link:hover,a.lk-black:hover{border-bottom-color:#333}.lk-black.lk-icon:hover{color:#333}.lk-gray .lk-link,a.lk-gray{color:#999}.lk-gray .lk-link:visited,a.lk-gray:visited{background-color:rgba(153,153,153,.04)}.lk-gray .lk-link:visited .md-code-inline:before,a.lk-gray:visited .md-code-inline:before{background-color:#999}.lk-gray .lk-link:active,a.lk-gray:active{outline-color:#999}.lk-gray .lk-link:hover,a.lk-gray:hover{border-bottom-color:#999}.lk-gray.lk-icon:hover{color:#999}.lk-white .lk-link,a.lk-white{color:#fcfcfc}.lk-white .lk-link:visited,a.lk-white:visited{background-color:rgba(252,252,252,.04)}.lk-white .lk-link:visited .md-code-inline:before,a.lk-white:visited .md-code-inline:before{background-color:#fcfcfc}.lk-white .lk-link:active,a.lk-white:active{outline-color:#fcfcfc}.lk-white .lk-link:hover,a.lk-white:hover{border-bottom-color:#fcfcfc}.lk-white.lk-icon:hover{color:#fcfcfc}.lk-orange .lk-link,a.lk-orange{color:#f3720d}.lk-orange .lk-link:visited,a.lk-orange:visited{background-color:rgba(243,114,13,.04)}.lk-orange .lk-link:visited .md-code-inline:before,a.lk-orange:visited .md-code-inline:before{background-color:#f3720d}.lk-orange .lk-link:active,a.lk-orange:active{outline-color:#f3720d}.lk-orange .lk-link:hover,a.lk-orange:hover{border-bottom-color:#f3720d}.lk-orange.lk-icon:hover{color:#f3720d}.lk-lilly .lk-link,a.lk-lilly{color:#7d5cff}.lk-lilly .lk-link:visited,a.lk-lilly:visited{background-color:rgba(125,92,255,.04)}.lk-lilly .lk-link:visited .md-code-inline:before,a.lk-lilly:visited .md-code-inline:before{background-color:#7d5cff}.lk-lilly .lk-link:active,a.lk-lilly:active{outline-color:#7d5cff}.lk-lilly .lk-link:hover,a.lk-lilly:hover{border-bottom-color:#7d5cff}.lk-lilly.lk-icon:hover{color:#7d5cff}.lk-blue .lk-link,a.lk-blue{color:#1a4d7f}.lk-blue .lk-link:visited,a.lk-blue:visited{background-color:rgba(26,77,127,.04)}.lk-blue .lk-link:visited .md-code-inline:before,a.lk-blue:visited .md-code-inline:before{background-color:#1a4d7f}.lk-blue .lk-link:active,a.lk-blue:active{outline-color:#1a4d7f}.lk-blue .lk-link:hover,a.lk-blue:hover{border-bottom-color:#1a4d7f}.lk-blue.lk-icon:hover{color:#1a4d7f}.lk-inherited .lk-link,a.lk-inherited{color:inherit}.lk-inherited .lk-link:active,a.lk-inherited:active{outline-color:inherit}.lk-inherited .lk-link:hover,a.lk-inherited:hover{border-bottom-color:inherit}.lk-inherited.lk-icon:hover{color:inherit}.lk-twitter .lk-link,a.lk-twitter{color:#55acee}.lk-twitter .lk-link:visited,a.lk-twitter:visited{background-color:rgba(85,172,238,.04)}.lk-twitter .lk-link:visited .md-code-inline:before,a.lk-twitter:visited .md-code-inline:before{background-color:#55acee}.lk-twitter .lk-link:active,a.lk-twitter:active{outline-color:#55acee}.lk-twitter .lk-link:hover,a.lk-twitter:hover{border-bottom-color:#55acee}.lk-twitter.lk-icon:hover{color:#55acee}.lk-facebook .lk-link,a.lk-facebook{color:#3b5998}.lk-facebook .lk-link:visited,a.lk-facebook:visited{background-color:rgba(59,89,152,.04)}.lk-facebook .lk-link:visited .md-code-inline:before,a.lk-facebook:visited .md-code-inline:before{background-color:#3b5998}.lk-facebook .lk-link:active,a.lk-facebook:active{outline-color:#3b5998}.lk-facebook .lk-link:hover,a.lk-facebook:hover{border-bottom-color:#3b5998}.lk-facebook.lk-icon:hover{color:#3b5998}.lk-clean{background-color:transparent}.lk-chrome:hover{color:#4989f4}.lk-teal .lk-link,a.lk-teal{color:#00a19c}.lk-teal .lk-link:visited,a.lk-teal:visited{background-color:rgba(0,161,156,.04)}.lk-teal .lk-link:visited .md-code-inline:before,a.lk-teal:visited .md-code-inline:before{background-color:#00a19c}.lk-teal .lk-link:active,a.lk-teal:active{outline-color:#00a19c}.lk-teal .lk-link:hover,a.lk-teal:hover{border-bottom-color:#00a19c}.lk-teal.lk-icon:hover{color:#00a19c}table{width:100%;border-spacing:0;border-collapse:separate}td,th{padding:8px}@media only screen and (max-width:950px){.table-responsive{display:block}.table-responsive>thead{display:none}.table-responsive>tbody,.table-responsive>tfoot{display:block}.table-responsive>tbody>tr,.table-responsive>tfoot>tr{display:block;background-color:rgba(203,204,188,.1);margin-bottom:30px}.table-responsive>tbody>tr:nth-child(even),.table-responsive>tfoot>tr:nth-child(even){background-color:rgba(203,204,188,.15)}.table-responsive>tbody>tr:last-child,.table-responsive>tfoot>tr:last-child{margin-bottom:0}.table-responsive>tbody>tr>td,.table-responsive>tfoot>tr>td{display:block;text-align:left}.table-responsive>tbody>tr>td:before,.table-responsive>tfoot>tr>td:before{display:block;content:attr(data-label);color:#555;font-size:13px;margin:0 0 5px}.table-responsive .table-responsive-hide{display:none}}.c-oreilly-teal{color:#00a19c}.c-yellow-highlight{color:#ffe270}.c-dark-orange{color:#f3720d}.c-pink{color:#e92c6c}.c-purple{color:#900070}.c-blue{color:#1a4d7f}.c-dark-turquoise{color:#1686a2}.c-dark-green{color:#1bc211}.c-white{color:#fcfcfc}.c-gray{color:#b7b7b7}.c-lilly{color:#7d5cff}.c-teal{color:#3aca96}.c-bg-oreilly-teal{background-color:#00a19c}.c-bg-yellow-highlight{background-color:#ffe270}.c-bg-dark-orange{background-color:#f3720d}.c-bg-pink{background-color:#e92c6c}.c-bg-purple{background-color:#900070}.c-bg-blue{background-color:#1a4d7f}.c-bg-dark-turquoise{background-color:#1686a2}.c-bg-dark-green{background-color:#1bc211}.c-bg-white{background-color:#fcfcfc}.c-bg-gray{background-color:#b7b7b7}.c-bg-lilly{background-color:#7d5cff}.c-bg-teal{background-color:#3aca96}.tj-emoji{width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em}.dc-header{margin-bottom:60px}.dc-heading{text-align:center;font-size:4em;padding:0 10px;margin-top:0;margin-bottom:10px}.dc-role{line-height:26px;padding:0 20px;margin-top:10px;text-align:center;font-style:italic;color:#cbccbc}.dc-colored{background:#f6f6f6;border-top:9px solid rgba(125,92,255,.5)}.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:800px}.md-markdown blockquote:not(.twitter-tweet){margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.md-markdown blockquote:not(.twitter-tweet) h1,.md-markdown blockquote:not(.twitter-tweet) h2,.md-markdown blockquote:not(.twitter-tweet) h3,.md-markdown blockquote:not(.twitter-tweet) h4,.md-markdown blockquote:not(.twitter-tweet) h5,.md-markdown blockquote:not(.twitter-tweet) h6{margin:-20px 0;padding:20px 0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block{margin:0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block:last-child{margin-bottom:-20px}.md-markdown img:first-child{margin-top:0}.md-markdown img:last-child{margin-bottom:0}.md-markdown p:first-child{margin-top:0}.md-markdown p:last-child{margin-bottom:0}.md-markdown .md-code-block+ol,.md-markdown .md-code-block+ul,.md-markdown ol+.md-code-block,.md-markdown ul+.md-code-block{margin-top:35px}.md-markdown a:not(.md-heading){color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.md-markdown a:not(.md-heading) .md-code-inline{position:relative}.md-markdown a:not(.md-heading) .md-code-inline:only-child{display:inline-block;line-height:17px}.md-markdown a:not(.md-heading) .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.md-markdown a:not(.md-heading):visited{background-color:rgba(233,44,108,.04)}.md-markdown a:not(.md-heading):visited .md-code-inline:before{background-color:#e92c6c}.md-markdown a:not(.md-heading):hover{border-bottom:1px solid #e92c6c}.md-markdown thead{background-color:#e0e0e0}.md-markdown tbody{background-color:#f6f6f6}.md-markdown tbody tr:nth-child(even){background-color:#f9f9f9}.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{padding:10px 0}.md-markdown h1:first-child,.md-markdown h2:first-child,.md-markdown h3:first-child,.md-markdown h4:first-child,.md-markdown h5:first-child,.md-markdown h6:first-child{margin-top:0}.md-markdown h1:last-child,.md-markdown h2:last-child,.md-markdown h3:last-child,.md-markdown h4:last-child,.md-markdown h5:last-child,.md-markdown h6:last-child{margin-bottom:0}.md-markdown iframe{display:block;margin:35px auto}.md-markdown iframe:first-child{margin-top:0}.md-markdown iframe:last-child{margin-bottom:0}.md-markdown li>p:only-child{display:inline}.md-markdown ul{list-style-type:none}.md-markdown ul>li:before{content:'◯';margin-right:5px}.md-heading{color:inherit}.md-markdown-inline{display:inline}.md-markdown-inline p{display:inline;line-height:initial}.md-code-block,.ocha-highlighted{margin:0 -20px}.ocha-code-block{padding:18px 50px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{max-width:inherit!important;margin:0 -20px;padding-left:20px;padding-right:20px}.md-code-block .md-code{display:block}.md-markdown-summary p{margin:10px 0}@media only screen and (min-width:768px){.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{margin-left:-40px;margin-right:-40px;padding:10px 40px}.md-code-block,.ocha-highlighted{margin:0 -40px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{margin:0 -40px;padding-left:40px;padding-right:40px}}@media only screen and (min-width:1300px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:900px}}@media only screen and (min-width:1400px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:1000px}.md-code-block,.md-markdown:not(.mm-content-html) .md-code-block+blockquote,.ocha-highlighted{margin:0 -400px 0 -40px}}.md-markdown-large blockquote,.md-markdown-large code,.md-markdown-large ol,.md-markdown-large p,.md-markdown-large table,.md-markdown-large ul{max-width:inherit}.md-footnotes{margin-top:80px;padding:20px 0;border-top:1px dashed #cbccbc}.md-footnote{margin:0;padding:8px 0;font-size:14px;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.md-footnote p{line-height:16px}.md-footnote-anchor{padding:2px 6px;margin-right:10px;text-align:center;font-weight:700;color:#e92c6c}.ly-custom-subheading .md-footnote-anchor,.ly-lean .md-footnote-anchor{font-family:Merriweather,Georgia,serif}.md-markdown a.md-footnote-anchor{border:1px solid #e92c6c}.md-markdown a.md-footnote-anchor:hover{background-color:#e92c6c;color:#fcfcfc}.md-footnote-ref{margin-left:1px;margin-right:3px}.md-markdown a.md-footnote-ref{border-bottom:1px dotted}.md-code-block,.md-code-inline{-webkit-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none;background:#fcfcf5;color:#4d4d4c}.md-code-block{line-height:24px}.md-code{padding:8px 10px}.md-code-inline{padding:0 6px}a .md-code{color:inherit}.md-code-comment{color:#8e908c}.md-code-attribute,.md-code-built_in,.md-code-constant,.md-code-literal,.md-code-number,.md-code-params,.md-code-pragma,.md-code-preprocessor,.md-code-regexp,.md-code-tag,.md-code-variable,.md-lang-css .md-code-class,.md-lang-css .md-code-id,.md-lang-css .md-code-pseudo,.md-lang-html .md-code-doctype,.md-lang-ruby .md-code-constant,.md-lang-xml .md-code-doctype,.md-lang-xml .md-code-pi,.md-lang-xml .md-code-tag .md-code-title,color #c82829{color:#f5871f}.md-lang-css .md-code-rule .md-code-attribute,.md-lang-ruby .md-code-class .md-code-title{color:#eab700}.md-code-header,.md-code-inheritance,.md-code-name,.md-code-string,.md-code-value,.md-lang-ruby .md-code-symbol,.md-lang-xml .md-code-cdata{color:#718c00}.md-code-title,.md-lang-css .md-code-hexcolor{color:#3e999f}.md-code-function,.md-lang-coffeescript .md-code-title,.md-lang-javascript .md-code-title,.md-lang-perl .md-code-sub,.md-lang-python .md-code-decorator,.md-lang-python .md-code-title,.md-lang-ruby .md-code-function .md-code-title,.md-lang-ruby .md-code-title .md-code-keyword{color:#4271ae}.md-code-keyword,.md-lang-javascript .md-code-function{color:#8959a8}.md-lang-coffeescript .md-lang-javascript,.md-lang-javascript .md-lang-xml,.md-lang-tex .md-code-formula,.md-lang-xml .md-code-cdata,.md-lang-xml .md-lang-css,.md-lang-xml .md-lang-javascript,.md-lang-xml .vbscript{opacity:.5}.md-code-deletion{background-color:rgba(244,0,30,.05);color:#f4001e}.md-code-addition{background-color:rgba(27,194,17,.05);color:#1bc211}.md-mark{background-color:rgba(255,226,112,.5);color:inherit}.md-mark span{color:inherit}.md-heading-hover{cursor:pointer;background-color:rgba(22,134,162,.1)}.mde-text-left{text-align:left}.mde-text-center{text-align:center}.mde-text-right{text-align:right}.mde-size-small{font-size:12px}.mde-size-small,.mde-size-small p{line-height:12px}.mde-size-large{font-size:36px}.mde-size-large,.mde-size-large p{line-height:36px}.mde-size-giant{font-size:72px}.mde-size-giant,.mde-size-giant p{line-height:72px}.mde-clearfix:after{content:' ';display:block;visibility:hidden;clear:both;font-size:0;height:0}.mde-quote{margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.mde-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.mde-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .mde-heading,.ly-lean .mde-heading{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .mde-subheading,.ly-lean .mde-subheading{font-family:Merriweather,Georgia,serif}.mde-pad-0{padding:0}.mde-pad-5{padding:5px}.mde-pad-10{padding:10px}.mde-pad-15{padding:15px}.mde-pad-20{padding:20px}.mde-pad-25{padding:25px}.mde-pad-30{padding:30px}.mde-pad-50{padding:50px}.mde-mar-0{margin:0}.mde-mar-5{margin:5px}.mde-mar-10{margin:10px}.mde-mar-15{margin:15px}.mde-mar-20{margin:20px}.mde-mar-25{margin:25px}.mde-mar-30{margin:30px}.mde-mar-50{margin:50px}@media only screen and (min-width:900px){.mde-left{float:left}.mde-right{float:right}.mde-inline{display:inline-block;vertical-align:top}.mde-20{max-width:20%}.mde-25{max-width:25%}.mde-33{max-width:33.3333333333%}.mde-50{max-width:50%}.mde-66{max-width:66.6666666666%}.mde-75{max-width:75%}}.twitter-tweet-figure{background:0 0;padding:0}.twitter-tweet-figure:before{content:none}.twitter-tweet-figure .twitter-tweet{margin:0 auto}blockquote.twitter-tweet{overflow:hidden;color:#1c2022;background-color:#fff;border:1px solid #e1e8ed;border-radius:4px;width:500px;max-width:100%;min-width:220px;padding:1.25rem 1.25rem .725rem}blockquote.twitter-tweet:before{content:none}blockquote.twitter-tweet p{white-space:pre-wrap;font:16px/1.4 Helvetica,Roboto,'Segoe UI',Calibri,'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}blockquote.twitter-tweet a,blockquote.twitter-tweet a:visited{color:#2b7bb9}.wy-container{margin:0 auto;padding:20px 0;max-width:800px}.wy-container .md-markdown p{line-height:22px;margin:10px 0}.wy-container .md-markdown p:first-child{margin-top:0}.wy-container .md-markdown p:last-child{margin-bottom:0}.wy-container .md-markdown blockquote:not(.twitter-tweet){padding:10px 0}.wy-container .md-code-block{margin:0;padding:10px;white-space:pre-wrap}.wy-table{width:100%;padding:0}.wy-td{padding:0}.wy-section-link,.wy-section-markdown,.wy-section-poll,.wy-section-summary{padding-top:25px}.wy-section-thanks{margin-top:25px;padding:10px;font-size:15px;background-color:#f2fcf2}.wy-header-text,.wy-issue{display:inline-block;margin:10px 0;line-height:24px}.wy-issue{float:right;font-size:12px}.wy-issue-content{display:block;padding:0 5px;background-color:#fcfcfc}.wy-section-header{padding-top:40px}.wy-section-header h1,.wy-section-header h2,.wy-section-header h3,.wy-section-header h4,.wy-section-header h5,.wy-section-header h6{margin:0}.wy-section-header p{line-height:inherit}.wy-header-td{padding:0}.wy-header-content{margin:0 10px}.wy-header-text{color:#fcfcfc;text-shadow:1px 1px 0 #1a4d7f;font-weight:700;font-size:24px}.wy-content{padding-bottom:25px}.wy-link-addendum,.wy-link-tag,.wy-link-title{display:inline-block;vertical-align:bottom;margin-bottom:10px}.wy-link-title{border-bottom:1px solid;font-size:20px;margin-right:10px}.wy-link-tag{background-color:#1a4d7f;color:#fcfcfc;text-transform:uppercase;font-size:13px;margin-right:5px;padding:2px 4px}.wy-link-tag:last-child{margin-right:0}.wy-link-addendum{color:#999;margin-left:5px}.wy-link-addendum:hover{border-bottom-color:transparent}.wy-link-title-section{position:relative}.wy-link-stats{position:absolute;right:0;background-color:#3aca96;color:#fcfcfc;border-bottom:1px solid #299a71}.wy-link-stats-logo{background-color:rgba(0,0,0,.1);color:#299a71}.wy-link-stat{margin:3px}.wy-link-description{font-size:14px;color:#666}.wy-link-source-section{margin-top:10px}.wy-link-source{margin-right:10px;margin-bottom:10px;display:inline-block;vertical-align:middle;color:#55acee}.wy-link-source-plain{color:#333}.wy-link-source.wy-link-source-plain a{color:#55acee}.wy-link-source.wy-link-source-plain a:visited{background-color:rgba(85,172,238,.04)}.wy-link-source.wy-link-source-plain a:visited .md-code-inline:before{background-color:#55acee}.wy-link-source.wy-link-source-plain a:active{outline-color:#55acee}.wy-link-source.wy-link-source-plain a:hover{border-bottom-color:#55acee}.wy-link-sponsor{background-color:transparent;color:#999;outline:#999 solid 1px}.wy-link-cell-before-image{vertical-align:middle;width:70%}.wy-link-cell-image{padding-left:10px}.wy-link-image-anchor{display:block;overflow:hidden;max-height:300px}.wy-link-image{display:block;margin:0 auto}.wy-footer-table{margin:20px 0}.wy-footer-cell{text-align:center}.wy-read-online{font-size:13px}.wy-section-link-job .wy-link-source,.wy-section-link-job .wy-link-title{font-size:14px}.wy-section-link-job .wy-link-description{font-size:12px}.wy-link-pixel{float:right}@media only screen and (max-width:500px){.wy-issue-publication,.wy-issue-separator{display:none}}.md-code-block{margin:0!important;padding:10px}</style>]]></description><link>https://ponyfoo.com/weekly/187/vr-intercepting-http-quic-and-http-3-performance-intersection-observer-async-functions-recursion-in-react</link><guid isPermaLink="true">https://ponyfoo.com/weekly/187/vr-intercepting-http-quic-and-http-3-performance-intersection-observer-async-functions-recursion-in-react</guid><category><![CDATA[inspiration]]></category><category><![CDATA[code]]></category><category><![CDATA[tools]]></category><category><![CDATA[news]]></category><category><![CDATA[point-of-view]]></category><category><![CDATA[performance]]></category><category><![CDATA[deep-dive]]></category><category><![CDATA[introductory]]></category><category><![CDATA[article]]></category><category><![CDATA[best-practices]]></category><category><![CDATA[javascript]]></category><category><![CDATA[css]]></category><dc:creator><![CDATA[nico@ponyfoo.com (Nicolás Bevacqua)]]></dc:creator><pubDate>Thu, 10 Oct 2019 13:07:31 GMT</pubDate></item><item><title><![CDATA[Performance budgets, Preloading, Profiling Performance and Animations, Visual Regression Testing & Tensorflow! 🎪  — Pony Foo Weekly]]></title><description><![CDATA[<div class="f-core"><div class="md-markdown"><p>We&#x2019;re glad you could make it this week! </p> <p>With your help, we can make Pony Foo Weekly <em>even more</em> awesome: <a href="https://ponyfoo.com/weekly/submissions?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" target="_blank" rel="noopener noreferrer">send tips about cool resources</a>.</p> </div><div class="wy-section-header"><h3 class="md-markdown" style="color:#fcfcfc;background-color:#ff895c;padding:10px"><div>Raw Performance </div> </h3></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://phabricator.wikimedia.org/phame/live/7/post/175/wikipedia_s_javascript_initialisation_on_a_budget/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" style="color:#ff895c;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Wikipedia&#x2019;s JavaScript initialization on a budget</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/performance" class="wy-link-tag">performance</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Wikipedia shrunk its budget to 28 KB for the initial JavaScript pipeline, to fit in two network packets.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/timotijhof?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Timo Tijhof</p> </a></div></td><td class="wy-td wy-link-cell-image"><a href="https://phabricator.wikimedia.org/phame/live/7/post/175/wikipedia_s_javascript_initialisation_on_a_budget/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://phab.wmfusercontent.org/file/data/t64rdovzxdi7lzxxxkh3/PHID-FILE-lwaqoruegcizfxzsza5m/wmchart.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-primary"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://www.educative.io/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" style="color:#ff895c;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Educative: Learn anything from CSS to System Design</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/code" style="color:#1a4d7f;background-color:#ffe270" class="wy-link-tag">Code</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Rich, text-based courses with embedded coding environments make learning a breeze. Pick up Vue, learn React, conquer Redux, or just prep for an interview. Try a free preview today!</p> </div></div><div class="wy-link-source-section"><a href="https://ponyfoo.com/weekly/links/tagged/sponsored" class="wy-link-tag wy-link-sponsor">Sponsored</a></div></td><td class="wy-td wy-link-cell-image"><a href="https://www.educative.io/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://images.ponyfoo.com/uploads/carbon_small_logo-d991652d0fc54c579a0a3223b9ec95b4.png" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://www.alexrp.co.uk/blog/preloading-fonts.html?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" style="color:#ff895c;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>&#x201C;Preloading a font even when I shouldn&#x2019;t have to&#x201D;</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/performance" class="wy-link-tag">performance</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Preloading fonts is a great way to get text to display faster on a web page. Alex talks about the benefits of preloading fonts even when they&#x2019;re referenced in inline CSS.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/alexrp?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Alex Painter</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-header"><h3 class="md-markdown" style="color:#fcfcfc;background-color:#1686a2;padding:10px"><div>Perf Profiling </div> </h3></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://blog.superhuman.com/performance-metrics-for-blazingly-fast-web-apps-ec12efa26bcb?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" style="color:#1686a2;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Performance metrics for blazingly fast web apps</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/performance" class="wy-link-tag">performance</a></div><table><tr><td class="wy-td wy-link-cell-before-image"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>On the one hand, it is hard to design metrics that accurately represent the user experience. On the other hand, it is difficult to make metrics that are usefully precise. As a result, many teams cannot trust their performance data.</p> <p>Conrad shares an approach to create metrics that are accurate and precise, make graphs that quickly show regressions, design visualizations that quickly show the impact of optimizations, and build fast software faster!</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/conradirwin?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Conrad Irwin</p> </a></div></td><td class="wy-td wy-link-cell-image"><a href="https://blog.superhuman.com/performance-metrics-for-blazingly-fast-web-apps-ec12efa26bcb?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" target="_blank" rel="noopener noreferrer" class="wy-link-image-anchor"><img src="https://miro.medium.com/max/1200/1*1RziAA40uBncN3UBwn9i7w.jpeg" alt class="wy-link-image"></a></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://kentcdodds.com/blog/profile-a-react-app-for-performance?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" style="color:#1686a2;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Profile a React App for Performance</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/performance" class="wy-link-tag">performance</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>How to use the React DevTools and React&#x2019;s profiling build to properly profile a production app.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/kentcdodds?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Kent C. Dodds</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-secondary"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="http://go.thoughtleaders.io/1353920190926?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" style="color:#1686a2;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Use Clubhouse: It&#x2019;s Free and Awesome</p> </a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>&#x201C;Clubhouse is like a fast and delightful version of Jira, a more purposeful version of Trello,&#x201D; says a current user. See if you agree.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/clubhouse?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Clubhouse</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/sponsored" class="wy-link-tag wy-link-sponsor">Sponsored</a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://calibreapp.com/blog/investigate-animation-performance-with-devtools/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" style="color:#1686a2;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Investigate animation performance with DevTools</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/performance" class="wy-link-tag">performance</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Users want snappy and delightful experiences, which means 60 FPS. To achieve this, you&#x2019;ll have to know how browsers transform code to pixels on the screen and how styles can affect that process.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/bibydigital?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Milica Mihajlija</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://seesparkbox.com/foundry/design_system_visual_regression_testing?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" style="color:#1686a2;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Visual Regression Testing in Design Systems</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/best-practices" style="color:#900070;background-color:#ffe270" class="wy-link-tag">Best Practices</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Visual regression testing in a design system helps detect unintended changes, and it can be done with various tools such as Percy, Chromatic, and Appitools.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/patrickfulton?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Patrick Fulton</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-header"><h3 class="md-markdown" style="color:#fcfcfc;background-color:#555;padding:10px"><div>Even more stuff </div> </h3></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://www.smashingmagazine.com/2019/09/machine-learning-front-end-developers-tensorflowjs/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" style="color:#555;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Machine Learning with Tensorflow</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/introductory" style="color:#900070;background-color:#f7f0f5" class="wy-link-tag">Introductory</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Using JavaScript and frameworks like Tensorflow.js is a great way to get started and learn more about machine learning. Charlie covers the three main features currently available using Tensorflow.js and sheds light onto the limits of using machine learning in the frontend.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/devdevcharlie?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Charlie Gerard</p> </a></div></td></tr></table></td></tr></table></div><div class="wy-section-link wy-section-link-suggestion"><table class="wy-table"><tr><td class="wy-td"><div class="wy-link-title-section"><a href="https://alligator.io/css/understanding-specificity-in-css/?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" style="color:#555;background-color:transparent" target="_blank" rel="noopener noreferrer" class="wy-link-title md-markdown md-markdown-inline"><p>Specificity in CSS</p> </a><a href="https://ponyfoo.com/weekly/links/tagged/best-practices" style="color:#900070;background-color:#ffe270" class="wy-link-tag">Best Practices</a></div><table><tr><td class="wy-td"><div class="wy-link-description-section"><div class="wy-link-description md-markdown"><p>Learn the basics of specificity in CSS and why you never need <code class="md-code md-code-inline">!important</code>.</p> </div></div><div class="wy-link-source-section"><a href="https://twitter.com/gemontracks?utm_source=ponyfoo+weekly&amp;utm_medium=email&amp;utm_campaign=issue-186" target="_blank" rel="noopener noreferrer" class="wy-link-source md-markdown md-markdown-inline"><p>Jess Mitchell</p> </a></div></td></tr></table></td></tr></table></div></div><style>html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;position:relative;vertical-align:baseline}sup{top:-.5em}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto;resize:vertical;min-height:280px;max-height:900px}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item;margin:-10px -20px;padding:10px;background-color:#f6f6f6;cursor:pointer;border-bottom:2px solid #ddd}[hidden],template{display:none}body,body:after,body:before,html,html:after,html:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*,:after,:before{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}@-moz-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-webkit-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-o-keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@keyframes bg-rainbow{0%{background-color:#e92c6c}50%{background-color:#f1e05a}90%{opacity:.6;background-color:#37ed2c}}@-moz-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-webkit-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@-o-keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}@keyframes sb-pulse{0%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,.5);box-shadow:0 0 0 0 rgba(233,44,108,.5)}70%{-webkit-box-shadow:0 0 0 15px rgba(233,44,108,0);box-shadow:0 0 0 15px rgba(233,44,108,0)}100%{-webkit-box-shadow:0 0 0 0 rgba(233,44,108,0);box-shadow:0 0 0 0 rgba(233,44,108,0)}}.f-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.f-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .f-heading,.ly-custom-heading h1,.ly-custom-heading h2,.ly-custom-heading h3,.ly-custom-heading h4,.ly-custom-heading h5,.ly-custom-heading h6,.ly-lean .f-heading,.ly-lean h1,.ly-lean h2,.ly-lean h3,.ly-lean h4,.ly-lean h5,.ly-lean h6{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .f-subheading,.ly-lean .f-subheading{font-family:Merriweather,Georgia,serif}body{margin:0;font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif;background:#fcfcfc;color:#333}img{max-width:100%;border:none}.md-markdown figure:not(.twitter-tweet-figure){background-color:#f6f6f6}.md-markdown figure:not(.twitter-tweet-figure)>a{display:block}.md-markdown figure:not(.twitter-tweet-figure)>a>img,.md-markdown figure:not(.twitter-tweet-figure)>img{display:block;margin-left:auto;margin-right:auto}.md-markdown figcaption{padding:10px;font-style:italic;font-size:14px;background:-webkit-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-moz-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-o-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:-ms-linear-gradient(left,#fff9e2 33%,#fcf9ee 100%);background:linear-gradient(to right,#fff9e2 33%,#fcf9ee 100%);color:#555}.md-markdown .figure-has-loaded{background:-webkit-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-moz-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-o-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:-ms-linear-gradient(top,rgba(255,255,255,0) 0,#fcf9ee 100%);background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fcf9ee 100%)}b,em,font-style italic,font-weight bold,i,ins,strong{text-decoration:none}del{text-decoration:line-through}sub,sup{bottom:0;line-height:18px}button,input{overflow:visible;border-radius:0}button{border:none;padding:6px 8px;font-size:1.2em;background:0 0}button[disabled]{color:#cbccbc!important}input,select,textarea{display:block;width:100%;padding:10px 8px;line-height:18px;border:none;font:inherit}select{height:38px}ol,ul{padding:0;margin:0;list-style-position:inside}li>ol,li>ul{margin-left:20px}hr{border:none;border-top:5px solid rgba(0,0,0,.05);margin:20px 0}kbd{display:inline-block;border:1px solid #ccc;margin:0 .1em;padding:.1em .6em;line-height:1.4;font-size:11px;background-color:#f7f7f7;-webkit-box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;box-shadow:0 1px 0 #bbb,0 0 0 2px #fff inset;border-radius:3px;color:#333;text-shadow:0 1px 0 #fff;white-space:nowrap}iframe{display:inline-block;border:none;max-width:100%}summary:hover{opacity:.8}details{padding:10px 20px 20px;border-bottom:2px dashed #ddd}details[open] summary{margin-bottom:20px}blockquote{border:none;margin:0!important}ol,p,ul{line-height:35px}p{margin:35px 0}@media only screen and (min-width:768px){ol,p,ul{line-height:30px}}a,button,input[type=submit]{cursor:pointer;text-decoration:none}.lk-link{color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.lk-link .md-code-inline{position:relative}.lk-link .md-code-inline:only-child{display:inline-block;line-height:17px}.lk-link .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.lk-link:visited{background-color:rgba(233,44,108,.04)}.lk-link:visited .md-code-inline:before{background-color:#e92c6c}.lk-link:hover{border-bottom:1px solid #e92c6c}.lk-rainbows{position:relative;color:#333;margin-bottom:5px}.lk-rainbows:hover:before{position:absolute;content:'';left:0;right:0;bottom:-8px;height:3px;opacity:.8;-webkit-transition:.1s ease-in-out;-moz-transition:.1s ease-in-out;-o-transition:.1s ease-in-out;-ms-transition:all .1s ease-in-out;transition:.1s ease-in-out;-webkit-animation:.5s infinite bg-rainbow;-moz-animation:.5s infinite bg-rainbow;-o-animation:.5s infinite bg-rainbow;-ms-animation:bg-rainbow .5s infinite;animation:.5s infinite bg-rainbow}.lk-icon{color:#333}.lk-icon:hover{color:#e92c6c}.lk-visitor{color:#333}.lk-visitor:after{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-left:5px}.lk-visitor.lk-visitor-large:after{font-size:1em}.lk-visitor:hover:after{color:#333;border-bottom-style:solid}.lk-visitor:visited:after{color:#7d5cff}.lk-visitor-inside{color:#333}.lk-visitor-inside .lk-visitor-target:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-inside.lk-visitor-large .lk-visitor-target:before{font-size:1em}.lk-visitor-inside:hover .lk-visitor-target:before{color:#333;border-bottom-style:solid}.lk-visitor-inside:visited .lk-visitor-target:before{color:#7d5cff}.lk-visitor-before{color:#333}.lk-visitor-before:before{display:inline-block;font:.7em/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:'\f00c';border-bottom:1px dotted #cbccbc;color:#cbccbc;margin-right:5px}.lk-visitor-before.lk-visitor-large:before{font-size:1em}.lk-visitor-before:hover:before{color:#333;border-bottom-style:solid}.lk-visitor-before:visited:before{color:#7d5cff}.lk-visitor-before-no-underline:before{border-bottom-width:0}.lk-link-to-green{color:#cbccbc}.lk-link-to-green:visited,.lk-link-to-green:visited:before{color:#1bc211;background-color:#1bc211}.lk-link-to-green:active{outline-color:#1bc211}.lk-link-to-green:hover,.lk-link-to-green:hover:before{color:#8be186;border-bottom-color:#1bc211}.lk-green .lk-link,a.lk-green{color:#1bc211}.lk-green .lk-link:visited,a.lk-green:visited{background-color:rgba(27,194,17,.04)}.lk-green .lk-link:visited .md-code-inline:before,a.lk-green:visited .md-code-inline:before{background-color:#1bc211}.lk-green .lk-link:active,a.lk-green:active{outline-color:#1bc211}.lk-green .lk-link:hover,a.lk-green:hover{border-bottom-color:#1bc211}.lk-green.lk-icon:hover{color:#1bc211}.lk-pink-light .lk-link,a.lk-pink-light{color:#ea6c93}.lk-pink-light .lk-link:visited,a.lk-pink-light:visited{background-color:rgba(234,108,147,.04)}.lk-pink-light .lk-link:visited .md-code-inline:before,a.lk-pink-light:visited .md-code-inline:before{background-color:#ea6c93}.lk-pink-light .lk-link:active,a.lk-pink-light:active{outline-color:#ea6c93}.lk-pink-light .lk-link:hover,a.lk-pink-light:hover{border-bottom-color:#ea6c93}.lk-pink-light.lk-icon:hover{color:#ea6c93}.lk-black .lk-link,a.lk-black{color:#333}.lk-black .lk-link:visited,a.lk-black:visited{background-color:rgba(51,51,51,.04)}.lk-black .lk-link:visited .md-code-inline:before,a.lk-black:visited .md-code-inline:before{background-color:#333}.lk-black .lk-link:active,a.lk-black:active{outline-color:#333}.lk-black .lk-link:hover,a.lk-black:hover{border-bottom-color:#333}.lk-black.lk-icon:hover{color:#333}.lk-gray .lk-link,a.lk-gray{color:#999}.lk-gray .lk-link:visited,a.lk-gray:visited{background-color:rgba(153,153,153,.04)}.lk-gray .lk-link:visited .md-code-inline:before,a.lk-gray:visited .md-code-inline:before{background-color:#999}.lk-gray .lk-link:active,a.lk-gray:active{outline-color:#999}.lk-gray .lk-link:hover,a.lk-gray:hover{border-bottom-color:#999}.lk-gray.lk-icon:hover{color:#999}.lk-white .lk-link,a.lk-white{color:#fcfcfc}.lk-white .lk-link:visited,a.lk-white:visited{background-color:rgba(252,252,252,.04)}.lk-white .lk-link:visited .md-code-inline:before,a.lk-white:visited .md-code-inline:before{background-color:#fcfcfc}.lk-white .lk-link:active,a.lk-white:active{outline-color:#fcfcfc}.lk-white .lk-link:hover,a.lk-white:hover{border-bottom-color:#fcfcfc}.lk-white.lk-icon:hover{color:#fcfcfc}.lk-orange .lk-link,a.lk-orange{color:#f3720d}.lk-orange .lk-link:visited,a.lk-orange:visited{background-color:rgba(243,114,13,.04)}.lk-orange .lk-link:visited .md-code-inline:before,a.lk-orange:visited .md-code-inline:before{background-color:#f3720d}.lk-orange .lk-link:active,a.lk-orange:active{outline-color:#f3720d}.lk-orange .lk-link:hover,a.lk-orange:hover{border-bottom-color:#f3720d}.lk-orange.lk-icon:hover{color:#f3720d}.lk-lilly .lk-link,a.lk-lilly{color:#7d5cff}.lk-lilly .lk-link:visited,a.lk-lilly:visited{background-color:rgba(125,92,255,.04)}.lk-lilly .lk-link:visited .md-code-inline:before,a.lk-lilly:visited .md-code-inline:before{background-color:#7d5cff}.lk-lilly .lk-link:active,a.lk-lilly:active{outline-color:#7d5cff}.lk-lilly .lk-link:hover,a.lk-lilly:hover{border-bottom-color:#7d5cff}.lk-lilly.lk-icon:hover{color:#7d5cff}.lk-blue .lk-link,a.lk-blue{color:#1a4d7f}.lk-blue .lk-link:visited,a.lk-blue:visited{background-color:rgba(26,77,127,.04)}.lk-blue .lk-link:visited .md-code-inline:before,a.lk-blue:visited .md-code-inline:before{background-color:#1a4d7f}.lk-blue .lk-link:active,a.lk-blue:active{outline-color:#1a4d7f}.lk-blue .lk-link:hover,a.lk-blue:hover{border-bottom-color:#1a4d7f}.lk-blue.lk-icon:hover{color:#1a4d7f}.lk-inherited .lk-link,a.lk-inherited{color:inherit}.lk-inherited .lk-link:active,a.lk-inherited:active{outline-color:inherit}.lk-inherited .lk-link:hover,a.lk-inherited:hover{border-bottom-color:inherit}.lk-inherited.lk-icon:hover{color:inherit}.lk-twitter .lk-link,a.lk-twitter{color:#55acee}.lk-twitter .lk-link:visited,a.lk-twitter:visited{background-color:rgba(85,172,238,.04)}.lk-twitter .lk-link:visited .md-code-inline:before,a.lk-twitter:visited .md-code-inline:before{background-color:#55acee}.lk-twitter .lk-link:active,a.lk-twitter:active{outline-color:#55acee}.lk-twitter .lk-link:hover,a.lk-twitter:hover{border-bottom-color:#55acee}.lk-twitter.lk-icon:hover{color:#55acee}.lk-facebook .lk-link,a.lk-facebook{color:#3b5998}.lk-facebook .lk-link:visited,a.lk-facebook:visited{background-color:rgba(59,89,152,.04)}.lk-facebook .lk-link:visited .md-code-inline:before,a.lk-facebook:visited .md-code-inline:before{background-color:#3b5998}.lk-facebook .lk-link:active,a.lk-facebook:active{outline-color:#3b5998}.lk-facebook .lk-link:hover,a.lk-facebook:hover{border-bottom-color:#3b5998}.lk-facebook.lk-icon:hover{color:#3b5998}.lk-clean{background-color:transparent}.lk-chrome:hover{color:#4989f4}.lk-teal .lk-link,a.lk-teal{color:#00a19c}.lk-teal .lk-link:visited,a.lk-teal:visited{background-color:rgba(0,161,156,.04)}.lk-teal .lk-link:visited .md-code-inline:before,a.lk-teal:visited .md-code-inline:before{background-color:#00a19c}.lk-teal .lk-link:active,a.lk-teal:active{outline-color:#00a19c}.lk-teal .lk-link:hover,a.lk-teal:hover{border-bottom-color:#00a19c}.lk-teal.lk-icon:hover{color:#00a19c}table{width:100%;border-spacing:0;border-collapse:separate}td,th{padding:8px}@media only screen and (max-width:950px){.table-responsive{display:block}.table-responsive>thead{display:none}.table-responsive>tbody,.table-responsive>tfoot{display:block}.table-responsive>tbody>tr,.table-responsive>tfoot>tr{display:block;background-color:rgba(203,204,188,.1);margin-bottom:30px}.table-responsive>tbody>tr:nth-child(even),.table-responsive>tfoot>tr:nth-child(even){background-color:rgba(203,204,188,.15)}.table-responsive>tbody>tr:last-child,.table-responsive>tfoot>tr:last-child{margin-bottom:0}.table-responsive>tbody>tr>td,.table-responsive>tfoot>tr>td{display:block;text-align:left}.table-responsive>tbody>tr>td:before,.table-responsive>tfoot>tr>td:before{display:block;content:attr(data-label);color:#555;font-size:13px;margin:0 0 5px}.table-responsive .table-responsive-hide{display:none}}.c-oreilly-teal{color:#00a19c}.c-yellow-highlight{color:#ffe270}.c-dark-orange{color:#f3720d}.c-pink{color:#e92c6c}.c-purple{color:#900070}.c-blue{color:#1a4d7f}.c-dark-turquoise{color:#1686a2}.c-dark-green{color:#1bc211}.c-white{color:#fcfcfc}.c-gray{color:#b7b7b7}.c-lilly{color:#7d5cff}.c-teal{color:#3aca96}.c-bg-oreilly-teal{background-color:#00a19c}.c-bg-yellow-highlight{background-color:#ffe270}.c-bg-dark-orange{background-color:#f3720d}.c-bg-pink{background-color:#e92c6c}.c-bg-purple{background-color:#900070}.c-bg-blue{background-color:#1a4d7f}.c-bg-dark-turquoise{background-color:#1686a2}.c-bg-dark-green{background-color:#1bc211}.c-bg-white{background-color:#fcfcfc}.c-bg-gray{background-color:#b7b7b7}.c-bg-lilly{background-color:#7d5cff}.c-bg-teal{background-color:#3aca96}.tj-emoji{width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em}.dc-header{margin-bottom:60px}.dc-heading{text-align:center;font-size:4em;padding:0 10px;margin-top:0;margin-bottom:10px}.dc-role{line-height:26px;padding:0 20px;margin-top:10px;text-align:center;font-style:italic;color:#cbccbc}.dc-colored{background:#f6f6f6;border-top:9px solid rgba(125,92,255,.5)}.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:800px}.md-markdown blockquote:not(.twitter-tweet){margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.md-markdown blockquote:not(.twitter-tweet) h1,.md-markdown blockquote:not(.twitter-tweet) h2,.md-markdown blockquote:not(.twitter-tweet) h3,.md-markdown blockquote:not(.twitter-tweet) h4,.md-markdown blockquote:not(.twitter-tweet) h5,.md-markdown blockquote:not(.twitter-tweet) h6{margin:-20px 0;padding:20px 0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block{margin:0}.md-markdown blockquote:not(.twitter-tweet) .md-code-block:last-child{margin-bottom:-20px}.md-markdown img:first-child{margin-top:0}.md-markdown img:last-child{margin-bottom:0}.md-markdown p:first-child{margin-top:0}.md-markdown p:last-child{margin-bottom:0}.md-markdown .md-code-block+ol,.md-markdown .md-code-block+ul,.md-markdown ol+.md-code-block,.md-markdown ul+.md-code-block{margin-top:35px}.md-markdown a:not(.md-heading){color:#e92c6c;border-bottom:1px solid transparent;background-color:rgba(255,255,255,.04)}.md-markdown a:not(.md-heading) .md-code-inline{position:relative}.md-markdown a:not(.md-heading) .md-code-inline:only-child{display:inline-block;line-height:17px}.md-markdown a:not(.md-heading) .md-code-inline:before{content:'';position:absolute;background-color:#f1e05a;top:0;left:0;right:0;bottom:0;opacity:.04}.md-markdown a:not(.md-heading):visited{background-color:rgba(233,44,108,.04)}.md-markdown a:not(.md-heading):visited .md-code-inline:before{background-color:#e92c6c}.md-markdown a:not(.md-heading):hover{border-bottom:1px solid #e92c6c}.md-markdown thead{background-color:#e0e0e0}.md-markdown tbody{background-color:#f6f6f6}.md-markdown tbody tr:nth-child(even){background-color:#f9f9f9}.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{padding:10px 0}.md-markdown h1:first-child,.md-markdown h2:first-child,.md-markdown h3:first-child,.md-markdown h4:first-child,.md-markdown h5:first-child,.md-markdown h6:first-child{margin-top:0}.md-markdown h1:last-child,.md-markdown h2:last-child,.md-markdown h3:last-child,.md-markdown h4:last-child,.md-markdown h5:last-child,.md-markdown h6:last-child{margin-bottom:0}.md-markdown iframe{display:block;margin:35px auto}.md-markdown iframe:first-child{margin-top:0}.md-markdown iframe:last-child{margin-bottom:0}.md-markdown li>p:only-child{display:inline}.md-markdown ul{list-style-type:none}.md-markdown ul>li:before{content:'◯';margin-right:5px}.md-heading{color:inherit}.md-markdown-inline{display:inline}.md-markdown-inline p{display:inline;line-height:initial}.md-code-block,.ocha-highlighted{margin:0 -20px}.ocha-code-block{padding:18px 50px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{max-width:inherit!important;margin:0 -20px;padding-left:20px;padding-right:20px}.md-code-block .md-code{display:block}.md-markdown-summary p{margin:10px 0}@media only screen and (min-width:768px){.md-markdown h1,.md-markdown h2,.md-markdown h3,.md-markdown h4,.md-markdown h5,.md-markdown h6{margin-left:-40px;margin-right:-40px;padding:10px 40px}.md-code-block,.ocha-highlighted{margin:0 -40px}.md-markdown:not(.mm-content-html) .md-code-block+blockquote{margin:0 -40px;padding-left:40px;padding-right:40px}}@media only screen and (min-width:1300px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:900px}}@media only screen and (min-width:1400px){.md-markdown blockquote,.md-markdown code,.md-markdown ol,.md-markdown p,.md-markdown table,.md-markdown ul{max-width:1000px}.md-code-block,.md-markdown:not(.mm-content-html) .md-code-block+blockquote,.ocha-highlighted{margin:0 -400px 0 -40px}}.md-markdown-large blockquote,.md-markdown-large code,.md-markdown-large ol,.md-markdown-large p,.md-markdown-large table,.md-markdown-large ul{max-width:inherit}.md-footnotes{margin-top:80px;padding:20px 0;border-top:1px dashed #cbccbc}.md-footnote{margin:0;padding:8px 0;font-size:14px;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.md-footnote p{line-height:16px}.md-footnote-anchor{padding:2px 6px;margin-right:10px;text-align:center;font-weight:700;color:#e92c6c}.ly-custom-subheading .md-footnote-anchor,.ly-lean .md-footnote-anchor{font-family:Merriweather,Georgia,serif}.md-markdown a.md-footnote-anchor{border:1px solid #e92c6c}.md-markdown a.md-footnote-anchor:hover{background-color:#e92c6c;color:#fcfcfc}.md-footnote-ref{margin-left:1px;margin-right:3px}.md-markdown a.md-footnote-ref{border-bottom:1px dotted}.md-code-block,.md-code-inline{-webkit-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none;background:#fcfcf5;color:#4d4d4c}.md-code-block{line-height:24px}.md-code{padding:8px 10px}.md-code-inline{padding:0 6px}a .md-code{color:inherit}.md-code-comment{color:#8e908c}.md-code-attribute,.md-code-built_in,.md-code-constant,.md-code-literal,.md-code-number,.md-code-params,.md-code-pragma,.md-code-preprocessor,.md-code-regexp,.md-code-tag,.md-code-variable,.md-lang-css .md-code-class,.md-lang-css .md-code-id,.md-lang-css .md-code-pseudo,.md-lang-html .md-code-doctype,.md-lang-ruby .md-code-constant,.md-lang-xml .md-code-doctype,.md-lang-xml .md-code-pi,.md-lang-xml .md-code-tag .md-code-title,color #c82829{color:#f5871f}.md-lang-css .md-code-rule .md-code-attribute,.md-lang-ruby .md-code-class .md-code-title{color:#eab700}.md-code-header,.md-code-inheritance,.md-code-name,.md-code-string,.md-code-value,.md-lang-ruby .md-code-symbol,.md-lang-xml .md-code-cdata{color:#718c00}.md-code-title,.md-lang-css .md-code-hexcolor{color:#3e999f}.md-code-function,.md-lang-coffeescript .md-code-title,.md-lang-javascript .md-code-title,.md-lang-perl .md-code-sub,.md-lang-python .md-code-decorator,.md-lang-python .md-code-title,.md-lang-ruby .md-code-function .md-code-title,.md-lang-ruby .md-code-title .md-code-keyword{color:#4271ae}.md-code-keyword,.md-lang-javascript .md-code-function{color:#8959a8}.md-lang-coffeescript .md-lang-javascript,.md-lang-javascript .md-lang-xml,.md-lang-tex .md-code-formula,.md-lang-xml .md-code-cdata,.md-lang-xml .md-lang-css,.md-lang-xml .md-lang-javascript,.md-lang-xml .vbscript{opacity:.5}.md-code-deletion{background-color:rgba(244,0,30,.05);color:#f4001e}.md-code-addition{background-color:rgba(27,194,17,.05);color:#1bc211}.md-mark{background-color:rgba(255,226,112,.5);color:inherit}.md-mark span{color:inherit}.md-heading-hover{cursor:pointer;background-color:rgba(22,134,162,.1)}.mde-text-left{text-align:left}.mde-text-center{text-align:center}.mde-text-right{text-align:right}.mde-size-small{font-size:12px}.mde-size-small,.mde-size-small p{line-height:12px}.mde-size-large{font-size:36px}.mde-size-large,.mde-size-large p{line-height:36px}.mde-size-giant{font-size:72px}.mde-size-giant,.mde-size-giant p{line-height:72px}.mde-clearfix:after{content:' ';display:block;visibility:hidden;clear:both;font-size:0;height:0}.mde-quote{margin:0;padding:20px 0;border:none;border-top:5px solid rgba(0,0,0,.05);border-bottom:5px solid rgba(0,0,0,.05)}.mde-core{font-family:'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}.mde-mono{font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif}.ly-custom-heading .mde-heading,.ly-lean .mde-heading{font-family:Neuton,'Hoefler Text',Palatino,Baskerville,Georgia,'Times New Roman',serif}.ly-custom-subheading .mde-subheading,.ly-lean .mde-subheading{font-family:Merriweather,Georgia,serif}.mde-pad-0{padding:0}.mde-pad-5{padding:5px}.mde-pad-10{padding:10px}.mde-pad-15{padding:15px}.mde-pad-20{padding:20px}.mde-pad-25{padding:25px}.mde-pad-30{padding:30px}.mde-pad-50{padding:50px}.mde-mar-0{margin:0}.mde-mar-5{margin:5px}.mde-mar-10{margin:10px}.mde-mar-15{margin:15px}.mde-mar-20{margin:20px}.mde-mar-25{margin:25px}.mde-mar-30{margin:30px}.mde-mar-50{margin:50px}@media only screen and (min-width:900px){.mde-left{float:left}.mde-right{float:right}.mde-inline{display:inline-block;vertical-align:top}.mde-20{max-width:20%}.mde-25{max-width:25%}.mde-33{max-width:33.3333333333%}.mde-50{max-width:50%}.mde-66{max-width:66.6666666666%}.mde-75{max-width:75%}}.twitter-tweet-figure{background:0 0;padding:0}.twitter-tweet-figure:before{content:none}.twitter-tweet-figure .twitter-tweet{margin:0 auto}blockquote.twitter-tweet{overflow:hidden;color:#1c2022;background-color:#fff;border:1px solid #e1e8ed;border-radius:4px;width:500px;max-width:100%;min-width:220px;padding:1.25rem 1.25rem .725rem}blockquote.twitter-tweet:before{content:none}blockquote.twitter-tweet p{white-space:pre-wrap;font:16px/1.4 Helvetica,Roboto,'Segoe UI',Calibri,'Helvetica Neue',HelveticaNeue,TeXGyreHeros,FreeSans,'Nimbus Sans L','Liberation Sans',Helvetica,Arial,sans-serif}blockquote.twitter-tweet a,blockquote.twitter-tweet a:visited{color:#2b7bb9}.wy-container{margin:0 auto;padding:20px 0;max-width:800px}.wy-container .md-markdown p{line-height:22px;margin:10px 0}.wy-container .md-markdown p:first-child{margin-top:0}.wy-container .md-markdown p:last-child{margin-bottom:0}.wy-container .md-markdown blockquote:not(.twitter-tweet){padding:10px 0}.wy-container .md-code-block{margin:0;padding:10px;white-space:pre-wrap}.wy-table{width:100%;padding:0}.wy-td{padding:0}.wy-section-link,.wy-section-markdown,.wy-section-poll,.wy-section-summary{padding-top:25px}.wy-section-thanks{margin-top:25px;padding:10px;font-size:15px;background-color:#f2fcf2}.wy-header-text,.wy-issue{display:inline-block;margin:10px 0;line-height:24px}.wy-issue{float:right;font-size:12px}.wy-issue-content{display:block;padding:0 5px;background-color:#fcfcfc}.wy-section-header{padding-top:40px}.wy-section-header h1,.wy-section-header h2,.wy-section-header h3,.wy-section-header h4,.wy-section-header h5,.wy-section-header h6{margin:0}.wy-section-header p{line-height:inherit}.wy-header-td{padding:0}.wy-header-content{margin:0 10px}.wy-header-text{color:#fcfcfc;text-shadow:1px 1px 0 #1a4d7f;font-weight:700;font-size:24px}.wy-content{padding-bottom:25px}.wy-link-addendum,.wy-link-tag,.wy-link-title{display:inline-block;vertical-align:bottom;margin-bottom:10px}.wy-link-title{border-bottom:1px solid;font-size:20px;margin-right:10px}.wy-link-tag{background-color:#1a4d7f;color:#fcfcfc;text-transform:uppercase;font-size:13px;margin-right:5px;padding:2px 4px}.wy-link-tag:last-child{margin-right:0}.wy-link-addendum{color:#999;margin-left:5px}.wy-link-addendum:hover{border-bottom-color:transparent}.wy-link-title-section{position:relative}.wy-link-stats{position:absolute;right:0;background-color:#3aca96;color:#fcfcfc;border-bottom:1px solid #299a71}.wy-link-stats-logo{background-color:rgba(0,0,0,.1);color:#299a71}.wy-link-stat{margin:3px}.wy-link-description{font-size:14px;color:#666}.wy-link-source-section{margin-top:10px}.wy-link-source{margin-right:10px;margin-bottom:10px;display:inline-block;vertical-align:middle;color:#55acee}.wy-link-source-plain{color:#333}.wy-link-source.wy-link-source-plain a{color:#55acee}.wy-link-source.wy-link-source-plain a:visited{background-color:rgba(85,172,238,.04)}.wy-link-source.wy-link-source-plain a:visited .md-code-inline:before{background-color:#55acee}.wy-link-source.wy-link-source-plain a:active{outline-color:#55acee}.wy-link-source.wy-link-source-plain a:hover{border-bottom-color:#55acee}.wy-link-sponsor{background-color:transparent;color:#999;outline:#999 solid 1px}.wy-link-cell-before-image{vertical-align:middle;width:70%}.wy-link-cell-image{padding-left:10px}.wy-link-image-anchor{display:block;overflow:hidden;max-height:300px}.wy-link-image{display:block;margin:0 auto}.wy-footer-table{margin:20px 0}.wy-footer-cell{text-align:center}.wy-read-online{font-size:13px}.wy-section-link-job .wy-link-source,.wy-section-link-job .wy-link-title{font-size:14px}.wy-section-link-job .wy-link-description{font-size:12px}.wy-link-pixel{float:right}@media only screen and (max-width:500px){.wy-issue-publication,.wy-issue-separator{display:none}}.md-code-block{margin:0!important;padding:10px}</style>]]></description><link>https://ponyfoo.com/weekly/186/performance-budgets-preloading-profiling-performance-and-animations-visual-regression-testing-and-tensorflow</link><guid isPermaLink="true">https://ponyfoo.com/weekly/186/performance-budgets-preloading-profiling-performance-and-animations-visual-regression-testing-and-tensorflow</guid><category><![CDATA[performance]]></category><category><![CDATA[code]]></category><category><![CDATA[best-practices]]></category><category><![CDATA[introductory]]></category><category><![CDATA[javascript]]></category><category><![CDATA[css]]></category><dc:creator><![CDATA[nico@ponyfoo.com (Nicolás Bevacqua)]]></dc:creator><pubDate>Thu, 26 Sep 2019 13:05:18 GMT</pubDate></item></channel></rss>