• Blog: https://2ality.com
My main account is on Mastodon (you can follow via RSS): https://fosstodon.org/@rauschma
– Exploring JavaScript (ES2025 edition)
– Deep JavaScript
– Exploring TypeScript (TS 5.8 edition)
– Shell scripting with Node.js
🦋 Reposts appreciated!
exploringjs.com
big thanks to @superchupu.dev and @benmccann.com for putting so much work into this and the migrations/adoption. we're lucky to have both in the @e18e.dev community 💙
Comes up regularly in my JS code. I loved having this feature when I wrote Go code—e.g. (stmt+expr!):
if match, _ := re.FindStringMatch(str); match != nil {…}
Comes up regularly in my JS code. I loved having this feature when I wrote Go code—e.g. (stmt+expr!):
if match, _ := re.FindStringMatch(str); match != nil {…}
pnpm.io/cli/env
pnpm.io/cli/env
A. Many static site generators:
• Old style: /blog-post-title.html
• New style: /blog-post-title/index.html
B. Cloudflare:
• Requested URL: /blog-post-title.html
• Forwarded to: /blog-post-title
A. Many static site generators:
• Old style: /blog-post-title.html
• New style: /blog-post-title/index.html
B. Cloudflare:
• Requested URL: /blog-post-title.html
• Forwarded to: /blog-post-title
This sounds like good news(?)
“The internet just got better: our European search index goes live”
blog.ecosia.org/launching-ou...
This sounds like good news(?)
“The internet just got better: our European search index goes live”
blog.ecosia.org/launching-ou...
• Quote posts are now supported
• Everyone always sees all replies. Each server has a local view of the social network, so replies are fetched on demand and cached per server.
blog.joinmastodon.org/2025/11/mast...
• Quote posts are now supported
• Everyone always sees all replies. Each server has a local view of the social network, so replies are fetched on demand and cached per server.
blog.joinmastodon.org/2025/11/mast...
• Mode toggles (dark mode, light mode, print mode, …)
• Self-links for headings
• Cookie dialogs (with a default choice that can be triggered automatically)
• Mode toggles (dark mode, light mode, print mode, …)
• Self-links for headings
• Cookie dialogs (with a default choice that can be triggered automatically)
inputElement.addEventListener('onenterkey', (event) => {
// ...
});
Equivalent:
inputElement.addEventListener('keyup', (event) => {
if (event.key === 'Enter') {
// ...
}
});
inputElement.addEventListener('onenterkey', (event) => {
// ...
});
Equivalent:
inputElement.addEventListener('keyup', (event) => {
if (event.key === 'Enter') {
// ...
}
});
www.youtube.com/playlist?lis...
www.youtube.com/playlist?lis...
Our laptops are often more powerful than CI servers. Why wait for remote runners?
🐳 Docker Compose + YAML = Local CI magic
⚡ Instant feedback
📦 Same isolation & reproducibility
k33g.hashnode.dev/drastically-...
Our laptops are often more powerful than CI servers. Why wait for remote runners?
🐳 Docker Compose + YAML = Local CI magic
⚡ Instant feedback
📦 Same isolation & reproducibility
k33g.hashnode.dev/drastically-...
Additionally, most of the advice online sounds dogmatic and doesn’t explain the reasons for adopting certain practices.
Additionally, most of the advice online sounds dogmatic and doesn’t explain the reasons for adopting certain practices.
hono.dev
hono.dev
olliewilliams.xyz/blog/sanitiz...
olliewilliams.xyz/blog/sanitiz...
Alas, that only works with Safari and not with Chrome and Firefox.
Alas, that only works with Safari and not with Chrome and Firefox.
> Uint8Array.of(0, 1, 2).toBase64()
'AAEC'
> Uint8Array.fromBase64('AAEC')
Uint8Array.of(0, 1, 2)
Decent JS engine support: developer.mozilla.org/en-US/docs/W...
> Uint8Array.of(0, 1, 2).toBase64()
'AAEC'
> Uint8Array.fromBase64('AAEC')
Uint8Array.of(0, 1, 2)
Decent JS engine support: developer.mozilla.org/en-US/docs/W...
const tmpl = (addrs) => `
| ${escapeHtml(addr.first)} | ${escapeHtml(addr.last)} |
`.trim();
exploringjs.com/js/book/ch_t...
const tmpl = (addrs) => `
| ${escapeHtml(addr.first)} | ${escapeHtml(addr.last)} |
`.trim();
exploringjs.com/js/book/ch_t...
github.com/WebAssembly/...
Also immortalized in song: suno.com/song/19e0679...
github.com/WebAssembly/...
Also immortalized in song: suno.com/song/19e0679...
Here's a preview of my work on adding HTTP/2 request and response body inspection for @nodejs.org in Chrome DevTools!
Here's a preview of my work on adding HTTP/2 request and response body inspection for @nodejs.org in Chrome DevTools!
My chapter on iteration explains how they work: exploringjs.com/js/book/ch_s...
My chapter on iteration explains how they work: exploringjs.com/js/book/ch_s...
My CSS blog post: 2ality.com/2025/10/css-...
(*) javascriptweekly.com/issues/758
My CSS blog post: 2ality.com/2025/10/css-...
(*) javascriptweekly.com/issues/758
unjs/ofetch ($fetch) v2 (alpha)
- 🌐 ESM-only + Native Web APIs
- 📦 Zero deps (3 → 0)
- 📉 Install: 900 KB → 28 KB
- ⚡️Bundle: 17.4 KB (6.5 KB gz) → 6.3 KB (2.4 KB gz)
More optimizations to come 🤞
unjs/ofetch ($fetch) v2 (alpha)
- 🌐 ESM-only + Native Web APIs
- 📦 Zero deps (3 → 0)
- 📉 Install: 900 KB → 28 KB
- ⚡️Bundle: 17.4 KB (6.5 KB gz) → 6.3 KB (2.4 KB gz)
More optimizations to come 🤞
• Cloudflare Pages is easy to use but forwards requests from /home.html to /home (which I don’t want because it changes existing URLs)
• Solution: Switch to Workers where forwarding can be switched off.
• Cloudflare Pages is easy to use but forwards requests from /home.html to /home (which I don’t want because it changes existing URLs)
• Solution: Switch to Workers where forwarding can be switched off.