<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: rich_harris</title><link>https://news.ycombinator.com/user?id=rich_harris</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 23 Apr 2026 17:10:59 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=rich_harris" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by rich_harris in "Show HN: Jsbenchmarks.com – Real-world JavaScript framework benchmarks"]]></title><description><![CDATA[
<p>The Svelte implementation is very inefficient. With a small change I was able to get it to the number two spot on both duration and memory, at least running on this machine. Thyn is in the top spot on both counts — not _hugely_ surprising for a brand new project, but impressive nonetheless.<p>React, needless to say, languishes at the bottom.<p>Will send a PR to fix the Svelte implementation.</p>
]]></description><pubDate>Fri, 23 Jan 2026 17:09:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=46734928</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=46734928</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46734928</guid></item><item><title><![CDATA[New comment by rich_harris in "CVEs affecting the Svelte ecosystem"]]></title><description><![CDATA[
<p>No, if you're using `adapter-static` (or, if not using SvelteKit at all, just not doing any dynamic server-rendering) then you are not affected. But upgrade anyway!</p>
]]></description><pubDate>Thu, 15 Jan 2026 20:39:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=46638950</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=46638950</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46638950</guid></item><item><title><![CDATA[New comment by rich_harris in "[dead]"]]></title><description><![CDATA[
<p>If you think 'helping developers meet their legal obligations to build sites that can be used by everyone' is 'woke', then you should go and use a different framework.</p>
]]></description><pubDate>Wed, 16 Jul 2025 14:01:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=44582504</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=44582504</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44582504</guid></item><item><title><![CDATA[New comment by rich_harris in "Things I learned from 5 years at Vercel"]]></title><description><![CDATA[
<p>Three of us are employed by Vercel, and we're probably responsible for over 50% of commits. The core team is much larger than just us though</p>
]]></description><pubDate>Mon, 14 Jul 2025 13:26:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=44559953</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=44559953</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44559953</guid></item><item><title><![CDATA[New comment by rich_harris in "NuxtLabs is joining Vercel"]]></title><description><![CDATA[
<p>ISR _can't_ be implemented at a framework level without tying the framework to the platform. The fact that we instead chose to implement it via a platform-agnostic adapter API surely demonstrates the opposite of what you're implying</p>
]]></description><pubDate>Thu, 10 Jul 2025 11:45:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=44519900</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=44519900</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44519900</guid></item><item><title><![CDATA[New comment by rich_harris in "NuxtLabs is joining Vercel"]]></title><description><![CDATA[
<p>> I have no doubts they'll do the same with Nuxt, demanding they implement features that solely exist to pad out hosting costs while providing next to no actual benefits to end users and devs<p>has that happened with Svelte?<p>> they now have a monopoly over the most popular frontend meta frameworks (Next, Svelte/Kit, Nuxt, Astro)<p>this would be a surprise to the Astro team!</p>
]]></description><pubDate>Wed, 09 Jul 2025 23:09:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=44515637</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=44515637</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44515637</guid></item><item><title><![CDATA[New comment by rich_harris in "Next.js 15.1 is unusable outside of Vercel"]]></title><description><![CDATA[
<p>> $:{} for example is not explicit, I'd much rather use a slightly longer token (like useEffect) to help document what's going on<p>FWIW you're describing a legacy syntax — modern Svelte has explicit effects, and addresses your other concerns. I think you'll find it's much more to your liking <a href="https://svelte.dev/docs/svelte/$effect" rel="nofollow">https://svelte.dev/docs/svelte/$effect</a></p>
]]></description><pubDate>Fri, 13 Jun 2025 15:23:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=44269370</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=44269370</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44269370</guid></item><item><title><![CDATA[New comment by rich_harris in "React 19 Breaks Async Composability"]]></title><description><![CDATA[
<p>For sure — just wanted to be totally explicit that SvelteKit will always be platform agnostic</p>
]]></description><pubDate>Fri, 14 Jun 2024 17:18:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=40682702</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=40682702</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40682702</guid></item><item><title><![CDATA[New comment by rich_harris in "React 19 Breaks Async Composability"]]></title><description><![CDATA[
<p>This simply isn't going to happen.</p>
]]></description><pubDate>Fri, 14 Jun 2024 16:49:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=40682407</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=40682407</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40682407</guid></item><item><title><![CDATA[New comment by rich_harris in "Tenets"]]></title><description><![CDATA[
<p>Ha, did not expect this to be on the front page of HN today! Some quick context: in January I was in London for a few days, and while I was there we had a Svelte Society London event.<p>This document is a text version of a talk I gave there, which expands on some of these ideas: <a href="https://www.youtube.com/watch?v=eswNQiq4T2w&t=5211s" rel="nofollow">https://www.youtube.com/watch?v=eswNQiq4T2w&t=5211s</a><p>It's deliberately brief and vague in parts, because it's designed to spur conversation. It's not set in stone, nor is it an Official Statement on behalf of the Svelte team — it's an attempt to articulate the way that the maintainers tend to find ourselves thinking about some of these topics, as viewed through my personal lens. If it helps explain why you like Svelte, great! If it helps explain why you hate it, that's great too — that's the whole point. Have fun with it, and if there are parts you disagree with then your homework is to think through what kind of tenets would describe your ideal framework.<p>Also, it's Saturday — get off Hacker News :)</p>
]]></description><pubDate>Sat, 10 Feb 2024 17:47:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=39328385</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=39328385</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39328385</guid></item><item><title><![CDATA[New comment by rich_harris in "Svelte 5: Runes"]]></title><description><![CDATA[
<p>Notice that you just said "You can have a list of components _where each component_ references a bit of global state". In other words, in order to avoid re-rendering everything, you need to have a component for each item in the list.<p>In React, the component is the unit of re-rerendering. MobX can't change that fact. The only thing you can do is work around it with hacks that imperatively update the DOM.</p>
]]></description><pubDate>Thu, 21 Sep 2023 16:34:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=37600151</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=37600151</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37600151</guid></item><item><title><![CDATA[New comment by rich_harris in "Svelte 5: Runes"]]></title><description><![CDATA[
<p>Michel and I have been internet acquaintances for years, and we've even talked about this stuff IRL. MobX certainly isn't something we just somehow never learned about!<p>But anyway: it's absurd to compare this with React+MobX. MobX replaces useState, sure, but you're still re-rendering entire components on each change (which is why MobX explicitly recommends that you break apart your app into many small components, regardless of whether that's a boon to readability and maintainability.<p>By contrast, Svelte (and Solid, and other frameworks) understand signals on a much deeper and more optimal level. They're really not the same thing at all.</p>
]]></description><pubDate>Thu, 21 Sep 2023 15:55:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=37599538</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=37599538</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37599538</guid></item><item><title><![CDATA[New comment by rich_harris in "Svelte 5: Runes"]]></title><description><![CDATA[
<p>Hi! First up — not that it matters, but since people will wonder — our design wasn't informed by the Reactivity Transform. We evaluated something close to 50 designs, some of them extremely wacky, before settling on runes, and it wasn't until after that time that the Reactivity Transform was brought to our attention.<p>Nevertheless, it's interesting and validating that we landed on such similar approaches. While the Reactivity Transform failed, it did so for reasons that I don't think apply to us:<p>- $state and $ref are quite different. $state doesn't give you access to the underlying object, so there's no conversion necessary between reactive variables and ref objects (either in your head or in code).<p>- There's strict read/write separation. Anyone with access to a ref has the ability to change its value, which definitely causes problems at scale. It's something that React, Solid and Svelte 5 get right.<p>- Reactivity Transform introduces things like $() for magic destructuring and $$() for preserving reactivity across boundaries. We're instead encouraging people to use familiar JavaScript concepts like functions and accessors<p>- There are already a lot of different ways to work with Vue — SFCs vs non-SFCs, template syntax vs JSX, composition API vs options API, `<script>` vs `<script setup>`... on top of that, adding a new compiler mode that needs to interoperate with everything else is inevitably going to be a challenge. This isn't the case with Svelte. While both runes and non-runes mode will be supported for the next two major versions, meaning there will be some short term fragmentation, we've made it clear that runes are the future of Svelte.</p>
]]></description><pubDate>Thu, 21 Sep 2023 12:53:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=37596916</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=37596916</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37596916</guid></item><item><title><![CDATA[New comment by rich_harris in "Svelte 5: Runes"]]></title><description><![CDATA[
<p>FWIW you can of course implement createSignal in four lines of code, if you prefer the ergonomics of that:<p>function createSignal(initial) {
  let value = $state(initial);
  return [() => value, (v) => value = $state(v)];
}<p>Note that the Solid change is _not_ 'one step' — the `completed` property is being turned from a property to a function, which means you must update all the usage sites as well. Using getters and setters also allows you to use Svelte's convenient `bind:value` approach, which is much less verbose than using the equivalent event handler code. And don't get me started on the [type narrowing issues](<a href="https://www.typescriptlang.org/play?#code/C4TwDgpgBA4hzAgJwDwBUB8UC8UAUAlDlmgNwBQokUAyvIqpjvgG4BcUaR2JF5AZgFcAdgGNgASwD2wqKKQQAhohoSA5sMUAbdBjwttgiBy4cA2nATJdAGlr1rmALpQA3uSieoC4IKSyzQmIoAy0jO30Tbix9Q2hcFgInCgBfcnIAegyoAFo89IlhBn5FUWgAVQBnZDcPL00AW2MoSuAkQrVU9NEZVqgzQWqkO2rgKuQXXHklFXVNHXGkKAAfKGFBLS09dy81xSaOAHJ20QALQ-IUgj4JfnxB5EIiHa8sqFOJABMOkLjKqAARhAPsJPlAhGJJDI5NotP8kFJBJJhBAtCA6p43gpKhtgP9ClBFMJhFIQD8qNBkAikJUMXJelItBAAHRaKRqPAAA1OqLZUAAJK4HkhCMzGhAUgBCTnXS5AA" rel="nofollow noreferrer">https://www.typescriptlang.org/play?#code/C4TwDgpgBA4hzAgJwD...</a>).<p>There's nothing _wrong_ with the Solid approach, but the ergonomics aren't to our liking. If we need to take a hit in terms of verbosity, we'd rather do it once at the declaration site than n times at every usage site.</p>
]]></description><pubDate>Thu, 21 Sep 2023 12:13:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=37596482</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=37596482</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37596482</guid></item><item><title><![CDATA[New comment by rich_harris in "Svelte 5: Runes"]]></title><description><![CDATA[
<p>> Can you build a $derived from multiple other $derived?<p>Yes<p>> Will the end result see temporary, half-updated values?<p>No. It uses a push-pull mechanism — dependency changes don't result in a re-evaluation until something asks for the value, meaning derivations are 'glitch-free'</p>
]]></description><pubDate>Wed, 20 Sep 2023 21:48:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=37590682</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=37590682</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37590682</guid></item><item><title><![CDATA[New comment by rich_harris in "Svelte 5: Runes"]]></title><description><![CDATA[
<p>> the more Svelte you write, the more compiled code appears - generally, Svelte compiles to a size somewhat larger than the original source file.<p>This is one of those things that's more of a problem in theory than in practice, but nevertheless it's worth mentioning that Svelte 5 output is _much_ smaller than Svelte 4 output.</p>
]]></description><pubDate>Wed, 20 Sep 2023 21:45:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=37590657</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=37590657</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37590657</guid></item><item><title><![CDATA[New comment by rich_harris in "Svelte 5: Runes"]]></title><description><![CDATA[
<p>That would be a _terrible_ outcome. Things would routinely break, and code would be vastly more confusing.</p>
]]></description><pubDate>Wed, 20 Sep 2023 16:47:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=37586515</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=37586515</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37586515</guid></item><item><title><![CDATA[New comment by rich_harris in "Svelte 5: Runes"]]></title><description><![CDATA[
<p>Yes. Signals are a wonderful mechanism, but they do come with headaches. Our goal was very much to adopt the elegant reactivity model without all the downsides, and we've approached this by making them an under-the-hood implementation detail that you don't interact with directly.</p>
]]></description><pubDate>Wed, 20 Sep 2023 16:31:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=37586274</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=37586274</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37586274</guid></item><item><title><![CDATA[New comment by rich_harris in "Svelte 5: Runes"]]></title><description><![CDATA[
<p>We evaluated somewhere close to 50 different design ideas (seriously) before settling on this one, and what you describe was one of those ideas.<p>But one of our goals was for you to be able to use Svelte's reactivity inside .js/.ts files, since that's one of the things people have been crying out for since we released Svelte 3. For that to work, reactivity has to be opt-in, not opt-out.<p>And that's how it _should_ be — someone reading the code should be clued into the fact that this `let` won't behave like a normal `let` in JavaScript, and it should be possible to move code between modules (and between modules and components) without worrying about whether a specific file was opted in to certain behaviour.<p>In other words this...<p>> This way, the change wouldn't break existing code<p>...isn't quite right — it would break _all_ your existing code that wasn't in .svelte files.<p>> If I'm not mistaken, the compiler allows Svelte to define its syntax to anything they want.<p>On this point specifically: unfortunately not. The code in a .ts file, for example, has to be valid and typecheckable. You can't insert a preprocessing step ahead of the TypeScript compiler. Again though we concluded that this is a good thing, since it means this all works with all existing ecosystem tooling.</p>
]]></description><pubDate>Wed, 20 Sep 2023 16:28:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=37586235</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=37586235</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37586235</guid></item><item><title><![CDATA[New comment by rich_harris in "Svelte 5: Runes"]]></title><description><![CDATA[
<p>We've toyed with this idea. There's a couple of problems though. Firstly, if you have this...<p>type Reactive<T> = T;
function $state<T>(value: T): Reactive<T><p>...then TypeScript will 'unwrap' the type anyway, unless you do funky stuff like this...<p>type Reactive<T> = T & { [uniquesymbol]: any };<p>...in which case things like `value += 1` will cause type errors because it coercies `value` from `Reactive<number>` to `number`.<p>But it also creates problems here:<p>let message = $state('hello');
obj = { message };<p>The type of `obj.message` is Reactive<string>, but it's _not_ reactive — it's a non-reactive snapshot of the value when the object was created.<p>It's possible that we can do some fun stuff with TypeScript plugins, but we haven't dived too deeply into it yet.</p>
]]></description><pubDate>Wed, 20 Sep 2023 16:21:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=37586137</link><dc:creator>rich_harris</dc:creator><comments>https://news.ycombinator.com/item?id=37586137</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37586137</guid></item></channel></rss>