Published at
Updated at
Reading time
8min
The Web Weekly newsletter keeps you up to date, teaches you web development tricks and covers all things working in tech.

Guten Tag! Guten Tag! 👋

Do you know why Node.js didn't add complete TypeScript support? Do you use the new baseline feature scrollbar-gutter? And what's the difference between HTML attributes and DOM properties?

Turn on the Web Weekly tune and find all the answers below. Enjoy!

Antoine listens to "Furniture - Slow Motion Kisses":

I discovered this beautiful song in the closing set of a French music festival! And the clip is super cool, too!

Do you want to share your favorite song with the Web Weekly community? Hit reply; there is one more song left in the queue.

This Web Weekly is jam-packed, so I'll keep it short... 🫣

Still, I want to thank everyone who reached out last week! All the resulting conversations make this entire "newsletter project" more than worthwhile for me. 💙

But a special thanks goes to the new Web Weekly supporters Sam, Brian, Jeff, Robert, Mathias, knoefel and Ingo! Sending the over 5k emails costs me $80, and these costs are now covered by twenty people with subscriptions on Patreon or GitHub Sponsors. Thank you! 🫵

If you want to support Web Weekly on social media, reshare this edition on Linkedin, Mastodon or Bluesky.

Something that made me smile this week

Kirby slurping in a website.

There's nothing to see here but a Kirby doing its thing, inhaling some juicy paragraphs.

Watch it disappear

Open tabs

Don't use aria-label on static elements

Don’t use the aria-label or aria-labelledby attributes on elements representing static/noninteractive text-level semantics, such as p, strong, em, and so forth, unless those elements’ roles have been overridden with roles that expect accNames.

This post is one for your bookmarks: Ben shared how to use aria-label and aria-labelledby and explains why slapping ARIA onto generic elements like div and span just the solution.

Use ARIA correctly

Why can't Node.js "just bake in" TypeScript?

Everything You Need to Know About Node.js Type Stripping — All the technical details and reasoning behind this long anticipated feature.

Last week, Node.js v23.6.0 added support for running TypeScript files. However, the TypeScript code is neither type-checked nor compiled. The included types are simply stripped out, and the resulting JS code will be executed. But why's that, and why couldn't we just add tsc to Node?

Of course, it's not that simple because Node.js is a massive and heavily-used project. Let me try to give you a quick tl;dr, though.

  • Node prioritizes stability. Adding type checking via tsc could lead to unpredictable breaking changes in the Node.js version. It would make everything way more complicated.
  • tsc relies on a tsconfig.json file for type checking. Enforcing this file or shipping a default config in Node.js seems messy because it's such an individual configuration.
  • tsc is simply 22MB of additional code. 🤷

If you want to read more, this post describes the decisions fantastically.

Understand technical decisions

View Transition Misconceptions

Text representation of view-transition render pseudo elements

While it looked like a Chromium-only thing, view transitions are really happening now. Safari recently shipped them, so most modern browsers can render easy-to-use eye candy. If you're still confused about view transitions, here are common misconceptions.

Make the web fancy

And if you want to see some demos, open up Chrome or Firefox; Bramus collects demos at view-transitions.chrome.dev.

TIL — JS static initialization blocks

class MyElement extends HTMLElement {   static {     console.log('class was initialized...')   } }   // automatically logs "class was initialized..."

I barely use JavaScript classes these days, so I missed this ECMAScript feature from 2022. Have you seen this "unnamed" static block in classes before? I haven't! 😅

Initialize

You're halfway through!

Wowza! Would you enjoy getting Web Weekly straight to your inbox?

The wonderful weird web – Red or blue?

Just a blue canvas.

Guess what you'll find at sometimesredsometimesblue.com?

I really wonder how this site came to be...

Get a color

Focus by demotion

@media (hover) {   & > * {     transition: opacity .3s var(--ease-3);   }    &:hover > *:not(:hover) {     opacity: .25;   } }

Adam shared a pattern he thinks isn't used enough in the wild. And I agree because these hover effects make the web more enjoyable.

Hover, not hover

An evergreen from the blog

If your sites request the global jQuery, modules from unpkg.com, font files from Google fonts or GA's (Google Analytics) analytics.js, users will redownload the resources no matter if they downloaded and cached them for other sites already.

There are only a few evergreen blog posts on my blog, and "Say goodbye to resource-caching across sites and domains" is one of them. It reappears on social media at least once a month.

What's it about?

In a previous web developer life, reusing the browser cache across sites and domains was possible. jQuery, Google Fonts, or any Frontend asset could be loaded once and then served for every site.

However, this hasn't worked since 2020 anymore.

Understand browser caching

Addy also covered the topic of double-keyed caching if you want to read more about it.

Frontend in 2025

Relatively New Things You Should Know about HTML Heading Into 2025

As a regular Web Weekly reader, you're probably aware of most of the things Chris shares in this post about frontend features to use in 2025. Here are some of my favorites:

  • the popover attribute
  • the search element
  • JS Import Maps
  • inert

If any of these are news to you, this post is for you!

Use the modern web

HTML attributes and DOM properties

HTML attributes vs DOM properties

Oldie but goldie; there's been some chatter about HTML attributes, DOM properties, and their differences. But what are the differences? Let me name a few:

HTML attributes serialize to HTML. Not all properties do.

HTML attribute values are always strings. Properties can be anything.

HTML attribute names are case-insensitive. Property names are case-sensitive.

Jake covered this topic not too long ago, and it's still the best read out there if you want to learn more!

Understand the difference

Random MDN – animate()

document.getElementById("tunnel").animate(   [     // keyframes     { transform: "translateY(0px)" },     { transform: "translateY(-300px)" },   ],   {     // timing options     duration: 1000,     iterations: Infinity,   }, );

From the unlimited MDN knowledge archive...

Do you know there's a very well-supported JavaScript animate function? Yep, and maybe you don't need to reach for an animation library next time...

Animate!

TIL recap – EventTarget

export class MyEventEmitter extends EventTarget

Building somewhat complex applications might require a pub/sub pattern to react to data changes. And while you could always reach for a library, what if I told you that there's a web-native solution out there?

Listen to events

Find more short web development learnings in my "Today I learned" section.

New on the baseline — scrollbar-gutter

/* Initial value */ scrollbar-gutter: auto;  /* "stable" keyword, with optional modifier */ scrollbar-gutter: stable; scrollbar-gutter: stable both-edges;

With the release of Safari 18.2, new scroll bar styling options made it into the baseline. scrollbar-gutter lets you "block" space for scroll bars that could be shown when content grows to avoid layout shifts. Handy!

Reserve some space

Three valuable projects to have a look at

A new Tiny Helper

Screenshot of Easing Wizard.

If you're looking for a tool to create nice and custom easing functions, the Easing Wizard might be it. It's a stunningly looking site that receives bonus points for providing linear() easing functions.

Ease!

Find more single-purpose online tools on tiny-helpers.dev.

Thought of the week

Roma shared some thoughts about publishing things online and I kept nodding along!

Don’t be afraid to publish something just because you’re afraid that someone in the past already did so.

But there is no such thing as a “too small to share”.

Maybe this post motivates you to start a blog. If it does, let me know! I'm always looking for new RSS feeds.

Did you learn something from this issue?

💙 If so, join 20 other Web Weekly readers and give back with a small monthly donation on Patreon or GitHub Sponsors.

This is all, friends!

Loved this email? Hated this email? I want to hear about it!

If you think something needs improvement or something sparked some joy, reply to this email because I want to know more!

And with that, take care of yourself - mentally, physically, and emotionally.

I'll see you next week! 👋

If you enjoyed this article...

Join 5.5k readers and learn something new every week with Web Weekly.

Web Weekly — Your friendly Web Dev newsletter
Reply to this post and share your thoughts via good old email.
Stefan standing in the park in front of a green background

About Stefan Judis

Frontend nerd with over ten years of experience, freelance dev, "Today I Learned" blogger, conference speaker, and Open Source maintainer.

Related Topics

Related Articles