Static Svelte: JavaScript Blogging with 93% less JavaScript

Why Svelte is a Perfect Fit For Blogging

This blog now uses Svelte & Sapper as a static site generator, where it previously used React & Gatsby. This is achieved through Sapper’s sapper export feature.

Through the magic of Netlify’s Immutable Deploys, we can directly compare them on representative live URL’s for a recent blogpost of mine:

⚠️To be very clear - this post is not even close to being an apples to apples benchmark, and I spend some effort below explaining why it isn’t. If you aren’t prepared to read this post with a critical mind and understanding that this is a random work in progress report, please stop here.

Screenshots

Gatsby version (138kb)

screenshot of Gatsby site with 138kb of JS

Sapper version (9kb)

screenshot of Sapper site with 9kb of JS

Differences and Similarities

Similarities

First, the similarities must be noted, for any reasonable discussion to be had. For example, the reductio ad finem conclusion of the premise of this post is to use any old static site generator like Jekyll or Hugo since it will result in no JS payload.

Costs and Benefits of JS Blogging

However, both Gatsby and Sapper offer clientside rehydration, which makes the subsequent page navigation very fast. It is also easy to:

  • progressively add dynamic features without a major refactor
  • code in reusable components
  • and leverage the vast JS ecosystem to add functionality.

Yes, these are all available through other means. I’m aware.

This is by no means a free tradeoff: as Addy Osmani recently noted, an “uncanny valley” of rehydration exists, and Alex Russell consistently warns that better developer experience is not without its costs. Nicole Sullivan recently noted we don’t even have the language and terminology yet to intelligently discuss tradeoffs between first and subsequent loads. These matter in different contexts.

Syntax Highlighting

As for Sapper JS size, I originally used PrismJS, which adds ~19kb of JS, beacuse as a developer you can pry syntax highlighting from my cold dead hands. So it wouldn’t be fair to compare a site without syntax highlighting to my old site with one.

However, there are no-JS solutions for syntax highlighting, since I don’t intend readers to edit the code in runtime. Andrew Branch recently twote about how to preprocess ALL your syntax-highlighting using some VSCode API’s. I put this off as too complicated, but Khrome tipped me off that the open source shiki library from the Vue ecosystem does the same thing and so I managed to get that in.

High End Lighthouse Score

The default, no throttling Lighthouse scores are totally fine. I’m not going to be read by the next billion users when I don’t even have 200 subscribers on my mailing list. These are all going to vary based on the specific implementation details of the site (in particular, how much time/effort I spend on it) so don’t pay this too much mind, but not that they’re all… alright. Definitely not a failing grade:

  • Gatsby version:
    • Performance: 100
    • Accessibility: 96
    • Best Practices: 93
    • SEO: 89
    • PWA: yes
  • Sapper version:
    • Performance: 100
    • Accessibility: 100
    • Best Practices: 93
    • SEO: 89
    • PWA: some things missing (i didn’t spend time on a manifest)

Differences

There are material differences in implementation that make the two sites not comparable.

Low End Lighthouse Score

The (mobile, 4x applied throttling) Lighthouse scores tell a somewhat different story. This is the same as we had in the screenshots. So I won’t repeat.

Developer Experience

Time spent getting things to work is an important cost to factor in. Sapper is by far less mature, and not designed to have an upfront content ingestion pipeline with pluggable lifecycles. I spent a significant amount of time coding up the markdown ingestion for my site, which in Gatsby is as trivial as adding a couple of source and transform plugins. It’s another involved process to pipe this data in to templates, made harder by the fact that I had to make my own site generator in the process, but Gatsby is also quite involved where one has to create the right templates and queries and gatsby-node files. Kind of a wash here until Gatsby Themes mature, and even then the lack of a standard format may hurt mass adoption or intra ecosystem compatibility (imagine 2-3 warring factions of Gatsby Themes! Good or bad? Unclear)

There are other missing pieces I have to code up myself as well, for example a PWA or RSS feed plugin.

Image Optimization

As Una Kravets has noted, images are a critically important part of web performance. Gatsby-Image not only preprocesses images to resize them down via standard techniques, but also helps you rapidly load superfast images for a nice progressive upgrade effect. My colleague Phil Hawksworth recently wrote on CSS Tricks about how to achieve your own lazy loading - so you definitely don’t need Gatsby for this - but it is nice to have a blessed, maintained, tested, well documented, adaptable approach.

This Sapper site does not (yet!) do any of that. There are open source Svelte Image components I have yet to investigate.

Styling

Finally, the Sapper site does not use CSS-in-JS. This is a very controversial topic with pros and cons so I put it last. In particular, if you have not spent time appreciating some basic facts of CSS in JS from proponents, as well as some nuances in implementation, then your debate will not be very well informed.

The old site has a Dark Theme Toggle. Also a responsive mobile navigation. This Sapper implementation does not.

However, I expect animations to be a lot easier with Svelte as it is a first class citizen. This frees me up to play a lot more with animations in future.

Tagged in: #tech #svelte #jamstack #meta

Leave a reaction if you liked this post! 🧡
Loading comments...
Webmentions
Loading...

Subscribe to the newsletter

Join >10,000 subscribers getting occasional updates on new posts and projects!

I also write an AI newsletter and a DevRel/DevTools newsletter.

Latest Posts

Search and see all content