[HN Gopher] How we improved our website's performance ___________________________________________________________________ How we improved our website's performance Author : kkm Score : 67 points Date : 2021-01-22 18:37 UTC (2 days ago) (HTM) web link (www.smashingmagazine.com) (TXT) w3m dump (www.smashingmagazine.com) | joegahona wrote: | Page Speed Insights shows this site scoring a poor 39/100. | olliepop wrote: | key takeaways: | | - fonts can be unnecessarily huge | | - monolithic js = slow. Chunk at build time. | | - content-visibility: auto for lazy rendering | wackget wrote: | Chunking JS just leads to massive latency issues as the client | is forced to download dozens (or hundreds) of "efficiently" | chunked JS files. | | The e-commerce platform Magento 2 is packed with this kind of | bullshit and is part of the reason my colleagues and I | abandoned it for our clients' large e-commerce websites: | | https://magento.stackexchange.com/questions/104583/magento-2... | | https://old.reddit.com/r/Magento/comments/bli7vz/seriously_w... | | https://magento.stackexchange.com/questions/277544/page-load... | | https://magento.stackexchange.com/questions/270553/is-it-pos... | nicbou wrote: | It's still way too slow. It's a big page of text. It should load | in an instant. | | In my browser, I see 1.75 MB sent over the wire and a 2.5 second | load time. My big pages of text [1] need 105 kB and load in 0.4 | seconds. Their compressed critical CSS is the same size as my | entire uncompressed CSS file. They send more CSS bytes than I | send bytes in total. | | If you want to make a content website fast, it's quite simple: | send just the content. | | [1] https://allaboutberlin.com/guides/german-health-insurance | llacb47 wrote: | Your website was way faster on mobile data, kudos. | nicbou wrote: | I was thinking of the person reading about something on the | U-Bahn on their way home. | CharlesW wrote: | > _It should load in an instant._ | | FWIW, it does load in an instant for me. (Lighthouse | Performance = 99, Speed Index = 0.4s.) | lwansbrough wrote: | Me too, but I'm loading it on a $3000 computer with | 150Mbps/<10ms internet. Generally it's a good idea to only | focus on the mobile score. :) | [deleted] | lwansbrough wrote: | Nice to see another company covering all these steps and | validating the work we've done at my company. Unfortunately we | weren't as successful, or at least, our results were not as | fruitful. A good score for our site (tracker.gg) is 70 on mobile. | Turns out it's pretty hard to optimize the bootstraping of an | application that can render 20 different websites! Mobile devices | spend 1200ms on the main thread. It will be interesting to see | how these changes impact our page rank when Google starts | incorporating Core Web Vitals into its algorithm this year. | dmitriid wrote: | Sorry for being snarky, but the title should really be: Team at a | Static Website Discovers that Dozens of Megabytes of Unnecessary | Javascript Is a Bad Idea, Learns Nothing. | dairylee wrote: | So brave. | stanislavb wrote: | So HN. | timbit42 wrote: | Well, if they "discover" it, then they did "learn" something. | worldofmatthew wrote: | Not fantastic: | https://www.websitecarbon.com/website/smashingmagazine-com-2... | tolstoyswager wrote: | How could this be improved? | worldofmatthew wrote: | 250KB: https://cloud.netlifyusercontent.com/assets/344dbf88-f | df9-42... | | 249KB: https://res.cloudinary.com/indysigner/image/fetch/f_au | to,q_a... | | 180KB: https://res.cloudinary.com/indysigner/image/fetch/f_au | to,q_a... | seanwilson wrote: | > Around the same time we switched from an (outdated) manually | created critical CSS file to an automated system that was | generating critical CSS for every template -- homepage, article, | product page, event, job board, and so on -- and inline critical | CSS during the build time. Yet we didn't really realize how much | heavier the automatically generated critical CSS was. | | Is reducing the total amount of CSS per page so you don't have to | calculate the critical CSS at all an option? | | To throw my own page into the ring, here's a non-trivial product | website of mine where the homepage is 0.3MB total over the wire | and renders in 0.4 seconds for me (includes custom fonts, | payments, analytics, large screenshot and real-time chat widget): | | https://www.checkbot.io/ | | The major tricks I'm using is keeping the website CSS small (CSS | for homepage + rest of site gzips to less than 8KB), inlining all | CSS, rendering default fonts before the custom font has loaded, | SVG for all images (this saves a ton), and not using JavaScript | for content (which blocks rendering). | | The screenshot in the header is in SVG format and inlined | directly into the page along with the CSS, so the moment the HTML | arrives the browser can display all above the fold content. Logos | are another good one for the SVG + inline treatment. | ramraj07 wrote: | That's one of the fastest loading modern pages I've ever been | to. Kudos! | markdown wrote: | The problem with inlining all CSS is serving all the global | styles all over again with every page load. You're gaining a | great first impression at the cost of a poorer experience for | every subsequent page load. | | Have you considered inlining CSS in the head (as you've done), | but then serving it _again_ with a linked css file just before | </body>. | | Then, with subsequent page loads (of the current or other | pages), you don't have to inline any CSS anymore. | | Of course this requires that you serve two versions of all your | pages, one for if that page is a first hit, and another to be | served to users who already have your CSS cached. | charrondev wrote: | Unfortunately this means it's difficult to handle HTTP | caching without having something in the URL, and at the same | time you want to make sure search engines index the version | without the indicator in the URL. | sdoering wrote: | But with 8kb zipped (I assume that following pages aren't | that much worse) why should one optimize with a solution that | adds that much complexity? | | I believe that shaving a few additional kb from this already | low number isn't worth the proposed complexity. | | But this is a tradeoff that everybody has to decide for | themselves. | markdown wrote: | > But with 8kb zipped (I assume that following pages aren't | that much worse) why should one optimize with a solution | that adds that much complexity? | | If that's the argument, why not just let them take the | (tiny) initial 8kb hit as an external css file, and make | the rest of the experience even "zippier"? | seanwilson wrote: | > why not just let them take the (tiny) initial 8kb hit | as an external css file, | | One reason is Google will likely ding your Core Web | Vitals score for it, which is becoming a ranking signal | in May this year (https://developers.google.com/search/bl | og/2020/11/timing-for...) so you have less of a choice | here for what you prioritise. | nicbou wrote: | Inlining is a measured risk. If your CSS is sufficiently | small, and the number of pages per visit is low, it's still | faster than cached CSS. | seanwilson wrote: | > The problem with inlining all CSS is serving all the global | styles all over again with every page load. | | > You're gaining a great first impression at the cost of a | poorer experience for every subsequent page load. | | Yep, it's unfortunate we still have to make tradeoffs like | this. At least in this case, it's less than 8KB added per | page vs something more complicated that might break. | | HTTP push was getting closer to offering some alternative | like what you're suggesting (the server pushes the CSS file | to the client in parallel to the initial HTML page, and the | client can say if it already has the CSS file) but it's being | deprecated now. | franklyt wrote: | 12 people for a static site seems like a huge team to me. | tyingq wrote: | I'm pretty sure most of them would double as writers, or | illustrators, etc. It's not a normal magazine per-se, since the | articles are all technical ones. It also mentions many of the | 12 are part-time and/or wear other hats. | brazzy wrote: | "Modern" web development is apparently a game of Jenga. | wackget wrote: | Only because developers absolutely insist on building things | that way, for some reason I will never comprehend. | | What's the first thing most people do when starting a new | project? They ask "what framework should I build this on?" and | start their tiny portfolio site built upon a massively | overpowered suite of enterprise-level software with a million | features they'll never, ever need. | | Then they might drop in ten or fifteen separate external | libraries because using vanilla HTML, CSS, and JavaScript is | just "so 1995". | | Then they start thinking about AJAX and microservices because | rendering an entire page on the server side is utterly | unthinkable in 2021. | | Then they cram the site full of third-party services (because | your tiny home-brew website will definitely benefit from | Newrelic monitoring). | | Then they might start on unit testing. | | Finally they package everything up using at least seven | different dependency managers, because a Github project without | 100 useless ancillary files ( _grunt.js_ , app.yaml, | travis.yml, composer.json, .gitignore, etc. etc.) is obviously | not acceptable. | | And this is why I hate modern web development. | xmprt wrote: | I remember reading a blog post about a fake conversation | between two developers about web development and one way | telling the other about how "easy" it is and goes through a 5 | step process of how to build their 1 page website. That was | written at least 5 years ago and things have only gotten | worse since then. | CharlesW wrote: | I don't understand the point you're making. Mind elaborating? | brazzy wrote: | There is a ridiculous number of moving parts, stacked on top | of each other, interacting in unforeseeable ways to allow you | to shoot yourself in the foot, and absolutely nothing is | straightforward. | | OK, that basically describes any kind of software | development, but web seems so much worse than anything else. | And I say that as someone doing mainly Java backend | development who's learned to live with the | AbstractProxyFactoryManagerFactory jokes. | lwansbrough wrote: | It certainly feels that way sometimes. But web is rather | unique. There aren't any other platforms that demand you | deliver an application for "a device" (specifications unknown!) | in under 1 second. | Frost1x wrote: | There's such a thing as an unreasonable, unrealistic, or | downright stupid demand as well. What you often see is a | house of cards hacked together to try and support such | demands on the web. | | Sending reasonably well visually formated text is definitely | a reasonable demand though. | giantrobot wrote: | That's why there's all kinds of helpful features in HTML/CSS | like media queries. You can serve up raw content and let the | device make decisions on what resources to use to display the | content. You can tell the device the most optimal resources | for its particular constraints. | | As a for instance you your script tag can just include a | bunch of @import statements. Thankfully @import statements | support media queries [0]. So you get the utility of external | style sheets but can load one optimized for the client | device. Unlike media queries on link tags the browser doesn't | load style sheets (well they're not supposed to) that don't | match the media queries. | | It's also trivial to include a tiny bit of base styling with | every page in a script tag. It doesn't blow any size budgets | and makes sure a page is readable even with no external | assets. | | [0] https://developer.mozilla.org/en-US/docs/Web/CSS/@import | majewsky wrote: | Web is indeed unique. No one else would consider a magazine | article "an application". ___________________________________________________________________ (page generated 2021-01-24 23:00 UTC)