Rich Harris on the Svelte 5 reception
(upbeat music)
- Welcome to Svelte Radio.
- Welcome everyone to another episode of Svelte Radio.
I am back with yet another guest.
Can you guess who it is?
It's Rich Harris.
Hello, Rich.
- Hello, Kev.
- Nice to meet you again.
We're here in your beautiful apartment in Brooklyn.
- Welcome to my digs.
- Yeah, it's nice.
You've offered me tea, I've graciously accepted the tea.
It's nice.
- She's currently sitting on a--
- On a Svelte's coaster.
- A Svelte-themed coaster, courtesy of Dana Woodman.
- All right, Rich.
It was a long time since you were on Svelte Radio.
You've been on the devlog on YouTube a couple of times.
But yeah, Svelte Radio, it's been,
we haven't recorded as many episodes as I'd like to lately,
so it's great to have you on.
Let's, do you wanna introduce yourself?
Do you need to introduce yourself?
(laughing)
- I mean, I guess I should.
I'm a guy who works on Svelte for a living.
- Did you make Svelte?
- I did the initial commit, yes.
A little over eight years ago.
- Eight years?
That's been that long?
- It's been that long.
- Wow, that is a long time.
That's nice.
All right, so we've got a bunch of topics here
to get through.
Svelte 5 is finally out.
What are your thoughts?
Positive, negative?
- I mean, my main thought is thank God I can--
- You can breathe again?
- Yeah, have some sleep and relaxation.
Feeling pretty good about it, if truth be told.
There was definitely some nervousness from me
and from the rest of the team that,
because in some ways it is quite a radical departure
from Svelte 4, that a lot of people were gonna be like,
ah, you know what, I'm out, I don't like it anymore.
And the feedback that we've had,
obviously there's a couple of people who are like,
who moved my cheese?
But the overwhelming consensus seems to be
that this is a good and needed change to Svelte.
Even the people who initially were very skeptical.
- I was kind of one of them.
I don't know if you remember, I was pretty--
- You were, you've pushed back on a lot of things.
And in a lot of cases, that pushback has resulted
in better and more refined designs.
But in some cases, the ideas just kind of took a minute
to become apparent that they actually do make sense.
I can't remember Fireship in particular.
It was always like a big proponent of Svelte on his channel.
And when we previewed some of the Svelte 5 stuff,
he was like, what is going on?
This is, they've cocked it right up.
And even Fireship came around after we launched.
- He has a huge following as well.
- He really does, yeah.
And so it's very gratifying to see people
who have approached this from a position of skepticism
and have taken an honest look and re-appraised it
and said, yeah, this is the good stuff.
- I'm in that camp, for sure.
For me, as someone who doesn't really use that many,
or I did not use that many reactive statements,
for example, I heavily relied on SvelteKit
and the load function and the form actions
and use/enhance, I never ended up really having
to use reactive statements for a lot of things.
So for me, that part had never really been a big issue.
It was never, it never got complicated enough
that I would really have to sort out lots
of reactive statements that are tied together
and depending on each other in some weird ways, right?
'Cause that's kind of what effect and derived by
is trying to solve.
- It is, and the biggest pit that people dug
with Svelte 4 was using too many reactive statements
to do effects, basically.
- Yes, yeah.
- And that is still a pit that you can dig in Svelte 5.
If you use the effect room too much, then chances are
you're going to end up with some code
that is a little bit difficult to reason about.
But having that as a separate concept
from the derived concept, which they're obviously
different things, but in Svelte 4,
they're treated with the same mechanism.
We're able to much more clearly disentangle them now
and say you probably shouldn't be using effects
most of the time.
There are cases where they are valid,
there are cases where they're necessary,
but for a lot of tasks that people want to reach
for an effect for, actually it's not the right tool.
- Right.
- And having that distinction is very helpful.
- Yeah, it's clarifying as well,
like the code makes it easier to read.
Yeah, I have some horror stories of seeing components
where like everything is a reactive statement
rather than just like having a let something,
it's just like dollar sign, colon, something equals.
- Yeah.
- Why?
- Yeah, I mean.
- 'Cause people are confused probably,
like when to use it, when not to use it.
- In some cases, yeah, I mean, there's this idea
that if you just put a dollar in front of it,
then it'll become reactive and you can do what you want.
- Why wouldn't I want it to be reactive?
- Exactly, and part of that is perhaps
a little bit of laziness on the part of component authors,
but a lot of it, I think, is really that you are
kind of pushed in that direction by Svelte 4
because if you start putting something
in a reactive statement, it becomes pretty hard
to refactor it out because of the compile-driven semantics
of reactivity in Svelte 4, they become magnets
for more and more code, and the larger it gets,
the harder it becomes to disentangle.
And that's something that when you have
runtime reactivity based on signals,
refactoring is just like refactoring
any other JavaScript code.
- Finally.
Yeah, one thing about other features of Svelte 5
that I've heard people like a lot is snippets
'cause that was a missing piece in Svelte 4, right?
You couldn't reuse logic unless you created
a completely new component.
Like recently I heard, it was probably someone mentioned
it was their favorite new feature of Svelte, actually,
so that might be surprising, but I can see it.
It solves a lot of issues with slots,
especially the, you know when you had slots
and you had to use the let directive?
- Yeah. - It just got super confusing,
like which way is it going, like what is happening?
Just like, ah. - And now there's no symmetry
between the things that are part of the default slot
and the things that are not part of the default slot.
Like the lexical scoping is very confusing.
- Oh yeah, yep. - Yeah.
Always been one of my least favorite parts
of the design of Svelte 4, also the code,
like the implementation of that stuff is really filthy.
And it all gets so much cleaner with,
now that we just have this one concept that is used
both to pass stuff to components,
but also if no other components are involved at all,
it's like, it's all one consistent way of dealing with it.
- Yeah, and it's very nice, it's very nice.
- And the implementation is much nicer.
I'm really looking forward to when we're eventually able
to delete some of the code powering the,
you know, backwards compatibility was felt for me.
Not gonna happen anytime soon,
wanna reassure people that like a minimum of, you know.
- One major version at least?
- Yeah, I mean, we think in terms of timeframe
rather than version numbers,
because, you know, that's how people operate
in the real world, like it takes a certain amount of time
to migrate the code. - Is that how it works?
- Yeah, and I, you know, I'm not gonna say that
on such and such a date we're gonna flip a switch,
but I can say that it will be a very long period
with lots of warning.
But when we get to the end of that,
and the warning has been issued,
and the deprecation notices have been emitted,
and all the rest of it, and we're able to delete that code,
we're gonna be able to just get rid of swaths
of code in the code base, and it's gonna feel so good,
because deleting my code is like one of my favorite things,
not just in programming, but in life generally.
Deleting code makes me so happy.
- Yeah, yeah, I agree, same for me.
Like, seeing those red lines on GitHub,
like the diffs, it's like, oof.
- My hot take is the color of the diffs is wrong.
- Oh, right, yeah, yeah. - Like, you see a big diff
where you're deleting a bunch of stuff and it's all red,
but it's a good thing, like, if I'm deleting all this code,
like, I want a big green thumbs up.
- Yeah, it shouldn't be a--
- Give me the red danger color for when I'm adding code,
'cause adding code, that's--
- Leads to problems.
- That's the stuff that you should avoid.
- That's a nice hot take.
So any other feedback on Swath 5,
like, what have you heard?
- The thing that's brought me the most happiness
is hearing people say they have like 100,000 plus line
code bases who've migrated to Swath 5, like, in a single day.
- Right, with the new migrate script, right?
SV migrate, is that?
- Yeah, yeah, so we have a new command line tool.
- Oh, yeah.
- One of the commands of that tool is the migrate command.
MPX SV migrate Swath-5 will take your existing code base
and upgrade to Swath-5 and change the syntax
of your components where appropriate.
- Yep, I actually used it recently at work, more great, so.
- Yeah, it's been a huge success.
Lot of that is down to Simon, who from the start was like,
we've gotta be really good at the migration stuff,
otherwise, like, we're gonna lose people's trust
and people are gonna be very, very annoyed.
- Then you'll end up in like the Vue 2, Vue 3.
- Exactly, exactly, and so, you know, a lot of that
initially is down to him.
Paolo, which you think has been doing a lot of work
on the migration tool more recently as well.
It's turned out really well, very happy with that.
- Yep, yeah, it's like one of Svelte's strong,
like really, what's it called, strong points?
Is that a word, no?
- Yeah.
So it was like, I feel like the other frameworks
are not as good in general at migrating stuff.
So there was a migration script for kit as well, I think,
from like before the plus page stuff, right?
- Yeah.
- So it really is a very strong point,
like having an easy way to upgrade your stuff
without having to manually change laborious things
that are just like name changes or stuff like that.
- Yeah, I mean, there's basically three ways you can go.
You can make it easy for people to migrate.
You can retain backwards compatibility forever.
That's sort of what React has done.
You can still use--
- Class components.
- I think you can still use the thing
that was before class components.
- There was something before class components?
I had no idea.
- Yeah, but before classes were part of the language,
you would do, I think you would call create component
or create class or something like that,
and then you'd pass in your definition
and it would do auto binding of your methods
and all of this sort of thing.
A lot of stuff that with modernized looks super janky,
but that was how it was before classes were in the language.
And then obviously hooks came along,
but you can still use that very, very old stuff today.
And the third option that you can do is just not care.
Just say, all right, people, you're in version.
And that's what Angular 2 did, for example.
And of the three of those, I understand and respect
the whole backwards compatibility thing,
but at the same time, that is technical depth
that can really kind of slow your development down.
And so for me, I think it's better
if we can get the whole community
singing from the same hymn sheet
and working with Svelte5 as a baseline.
It'll allow us to move a lot faster
and add a lot more cool stuff.
- And it's not only the code base itself, right?
It's also all the content that's done around the framework,
like articles and all this stuff.
Like if you can somehow get people to write new stuff
instead of writing it in the old way,
then that's a good thing.
I think having migration scripts
is a good way of promoting that.
- Yeah, although you really can't do anything about--
- No, no, I mean-- - The Stack Overflow--
- Yeah, I mean, it's gonna live forever,
but it's at least like someone can just drop a comment
or add a notification, or like a, I don't know,
an information box or something that says,
oh, this is deprecated, use an npxsv migrate svelte5
and get the new stuff, or something like that,
rather than having to rewrite the whole article, maybe,
or stuff like that.
All right, cool.
So before we started recording,
we talked a bit about Advent of Svelte.
So we actually did an Advent of Svelte last year
at Svelte Society, right?
A bunch of different coding challenges, if you will,
with different, I think it mostly used just svelte,
but might have used SvelteKit as well, I don't remember.
But now you mention that there's an Advent of Svelte
from the core maintainers as well, in some way.
- There is, yeah, I'm not sure how
or if we're gonna combine forces on this, but--
- Yeah, yeah, there's been some talk about that, yeah.
- Yeah, the basic idea is we've been working
on the Svelte5 release for, what, 18 months or so.
And all of our effort has been basically spent on that.
And as a result, there's a whole lot of features
and ideas that have been sort of left to languish.
And now that we have this brand new shiny stable foundation
to build on top of, wouldn't it be nice
if we can start knocking out some of the quick wins
that have been piling up in the issue tracker?
And so our plan is, once a day,
from the first of December up until Christmas,
we'll ship a feature that people have been asking for.
Maybe in Svelte, maybe in SvelteKit,
maybe it'll be something--
- Like an ecosystem thing, or--
- An ecosystem thing, or the svelte.dev/playground.
- Ah, great, yep.
- There's various ways that that could be improved.
And so that's gonna be our big thing for the next month.
- That's a lot of new stuff, right?
25 things?
- It is, I mean, some of these things will be fairly small.
- Of course.
- Some of them are things that people have been asking for
for a long time, but we just haven't got around to.
But actually, the implementation isn't that taxing.
It's gonna feel good.
- Can you, do you wanna spill the beans on some of them?
- I can tell you what we're shipping first,
because by the time this airs, it'll probably already
have happened.
Day one of Adventist Svelte,
we are gonna ship error boundaries.
- People have been asking for that.
- People have been asking for error boundaries.
This has been a pretty big gap in Svelte,
like ever since it's existed, really.
And the way that Svelte operated from day one
is that you have a state change,
and that directly results in an update to the DOM.
- Right.
- And that just kind of happens sequentially.
And that was why Svelte, in the very early days,
like Svelte was so fast because it didn't have
all of this intermediate stuff of,
oh, we're gonna update some key value store,
and then we're doing the key value observation,
which is gonna, you know, or some virtual DOM diffing,
like whatever it is, all of the different mechanisms
that people use for translating a state update
into a DOM update, Svelte just kind of bypassed that.
- Screw it.
- Yeah.
And so, because of that, it was, I mean,
really hard as understanding it.
Basically impossible to add error boundaries
in a really consistent and reliable way.
But obviously, if you're building an application,
error boundaries are important,
because you can't always guarantee
that you've written your code perfectly.
- Or if there is a network error,
maybe that you didn't anticipate,
or anything that you didn't anticipate, really, right?
- Yeah.
- You don't want your whole application
to just like crash, and you end up in that state
where you're like clicking a button, nothing happens,
and you're like, you open the console,
oh, there are 58 different errors over here.
- Yeah.
- It's not a nice experience.
- Yeah, so the state becomes corrupted,
and like it basically can't recover from it
without refreshing the page, which is obviously no good.
- Yeah.
- Pretty shocking that we've been without it for so long.
- Maybe a testament to how resilient
Svelte applications have been written, I don't know.
- Or how just gushed-down, talented Svelte developers are.
- That is also an option.
- Everyone's been writing perfect apps.
- Obviously.
- Yeah, but that's gonna be a really nice thing to have.
And it's one of the things that is actually pretty easy
now that we have this new approach to--
- The layer in between, the update, right, so you can--
- Yeah, so in Svelte 5, if a piece of state changes,
then what happens is immediately, like fan that out
to all of the effects that ultimately depend on that state,
including intermediate derives, like your dirty deriver,
that will cause everything below it
to be considered maybe dirty.
And then once we've run a microtask
so that any other state updates happen at the same time,
we then go through all of those effects
and update them in a group.
- Yep.
- And with this way of doing things,
we're able to say, oh, one of these failed,
but because it happened within a boundary,
we can just remove all of the effects within that boundary
that had been updated up to that point
and show some fallback content.
And it means that you're given the opportunity
to retry whatever operation failed or show some UI,
describing the failure, and you don't need
to have really defensive code.
- Yeah, yeah, it's interesting with the defensive coding.
So I talked to someone about how I tried
a different kind of handling errors,
just experimenting with it, with like,
instead of doing like a returning,
you know how in Rust you usually have like an okay
and error tuple that you get from functions and stuff?
- I'll take that for it.
I'm not a Rust-ation.
- Yeah, same, but yeah, it's a thing.
So you return like, you handle the errors
where they happen and stuff, but I was thinking like,
maybe I could just like wrap the load function in kit
and then just throw somewhere and just handle
all the errors at the top in some wrapper function
and then return error depending on what kind of error it is
rather than like returning it up all the way
to where I send it back to the client and render something.
And that makes your control flow logic much easier,
but then you also lose like context from the error
and where it happened and why it happened and stuff.
You only get like a, I don't know.
Well, I would do stuff like prepend the error message
with validation, for example, and then I would do like,
oh, you didn't enter your details correctly
and something like that.
- But you know, you're still left with the possibility that--
- Oh, yeah, yeah, yeah, for sure.
- That like somewhere in your template
you refer to foo.bar and foo is undefined and--
- Yeah, so to clarify, this was in the back end, right?
So in Svelkit, so in the load function specifically.
I didn't try it in the front end, but it's like a fun,
it's a different way of doing errors
that I haven't done before.
Interesting experiment, fun experiment.
All right, what else other than error boundaries?
Are we getting portals?
Is that a thing?
- No, I don't think that's on the radar.
I know that is a thing that has come up
as a feature request in the past.
I feel like a lot of the time you can do the thing
that you would want portals for in userland already.
- Yeah, I don't think I've ever really needed a portal,
to be honest, but.
- Yeah, you know, with some of the CSS stuff,
we have anchor positioning,
and we have these new popover APIs on the platform.
Like, do we still need portal APIs?
I don't know.
- Probably not, probably not.
- So by, yeah, I think we can probably get away
without adding a first-class built-in portal API to Svelte.
But, I don't know, people feel very strongly otherwise
then, let us know.
- Yeah, all right.
All right, what else?
I kind of interrupted you there with my portal question.
- What else?
All right, I don't want to give too much stuff away,
'cause we've got some nice surprises lined up.
But I will say that people who use Tailwind
have found it a little bit annoying
that you can't have multiple classes in a class directive.
And so, if you have an element that is conditionally styled,
you either have to use a big old ternary statement
inside a class attribute,
or you have to have a whole bunch of class directives.
You know, like class margin for equals condition.
- Very ugly.
- Whatever, yeah, and we have a solution to that,
which we think people are really gonna like.
- That's exciting.
I use Tailwind, so that'd be great for me.
Like, the way I do it now is I just opt out
of writing the Tailwind stuff in the template,
and I do it in the style tag instead.
'Cause you can still use like an @apply something.
- Which I believe the Tailwind guys don't like.
- Yeah, yeah, but it's like a work-around, right?
Because it's like I'm not gonna have
16 class directive statements in my one element,
and then maybe have to do it in six different places.
I'd much rather have like class colon danger,
and then I'll apply all the like border red,
whatever, in the class.
But yeah, kind of defeats the purpose of Tailwind, I guess.
We chatted a bit about the bind directive as well,
is that something that's gonna change, or is this a secret?
- Yeah, well, it's not a secret,
because it's in the pull request queue.
In general, if people wanna know
what is coming down the pipe,
then looking at the pull request queue
is the best way to do that.
- This part I will edit out, because no, I'm kidding.
(laughing)
- Yeah, and honestly, there are people who spy on that,
and it's pretty great, because they'll offer feedback
and sometimes help us make better design decisions.
So the deal with bindings is if you have a bind directive
on an element or a component,
the value of that must be some local state or a local prop,
which we read or write directly.
Sometimes you wanna intercept the write.
- Yep.
- Maybe you wanna do some validation or something like that.
And at the moment, the only way that you can really do that
is by having an object with a get set property pair.
- Oh, right, you could already do it, I guess.
- You can, so suppose you have const text equals,
and then you have an object with a get current,
which returns some other piece of state
that you defined elsewhere,
and a set current, which just writes that value.
Inside that set function, you can do your validation.
And then, on the element, you'll do input bind colon value
equals text dot current,
and then that will use the getter and the setter.
It's a little bit cumbersome, obviously.
- Yeah, I mean, the way I've done it,
it's just like I opted out of bind
and just used an event.
- Which is also a totally valid approach,
but that, too, is a lot of boilerplate.
- Yeah, yeah, it's pointless.
Well, it's not pointless,
but irritating to have to write.
So we have a way now to provide the getter
and the setter directly within that bind directive,
which is particularly useful
if you want to do some one-off validation,
like you don't want to go through all the rigmarole
of creating this object or adding an event handler,
and that's something that you should be shipping
pretty soon, too.
- It's like one of those things
that when you try Svelte the first time
and you try the bind directive,
and it's like, oh, it's so nice.
You don't have to write any code.
And then as soon as you have to do something
where you have to manipulate the value a bit
before you send it up or do anything,
it becomes a bit irritating,
'cause you're like, oh, I could use this very nice thing
over here, but I have to do something here first.
- It is irritating, but it's also,
it pushes people towards using effects.
Like, you often see people using effects to do validation.
- Right, okay.
- And that's absolutely the wrong thing to do.
The effects are very bad for validation.
And there are a lot of things that they're good for,
but if you want to do your validation,
that should be happening upstream.
It should be happening within an event handler, essentially.
And having bindings where you can control
what happens on write,
that essentially gives you a place to put that logic
that's equivalent to the event handler.
- Oh, that makes sense, that would be a nice addition.
There's also, we chatted a bit about actions, is that?
- This is, no, this is--
- That's not for Advent of Svelte, maybe.
- Yeah, this is a longer term goal that we have.
So the use directive and the transition directives,
transition in and out, these are actually quite similar
in that they are essentially element lifecycle callbacks.
And another thing that they have in common
is you cannot spread them onto an element.
Like you cannot receive them,
if you're building a component,
you cannot receive those things as props
and then spread them onto an element,
which by extension means you can't really pass them
into a component in the first place.
- Yeah, you kind of have to do weird workarounds now, right?
- A lot of weird workarounds.
And just the design of them is a little bit funny,
like even on a syntactical level,
they're candidly a bit weird, like use colon foo
means that you have something that is called foo
that is lexically scoped, like you can't define an action
in line on the element, and all that sort of thing.
So I think we can do a better job,
I think we can make these things more composable,
spreadable, and so on.
We can make them more consistent with each other,
have less syntax, less API surface area
than having all of these separate bindings,
write things that are actually quite similar.
And I think we can make it so that they're
a little bit more flexible and powerful as well.
So we have some ideas for what the evolution
of that basic idea of an action could look like,
and that's something that we'll be focusing on in 2025.
- 2025 isn't that far off.
All right, what about this async stuff
that you mentioned beforehand?
Is that something you want to talk about,
or should we skip it?
Like, what's...
- I can give the very high-level view,
which is wouldn't it be nice if we had
more of an ability to think sensibly about
how async state works inside Svelte components.
At the moment, we have the await block,
which is really good if you have a promise
and you want to show some pending state
until the promise resolves,
and then you want to show the value of the promise
or some fallback UI if the promise rejected
for whatever reason.
Really great in the case of a single promise.
As soon as you have multiple promises
and you want to coordinate somehow,
and you want to show some skeleton UI
until multiple promises are resolved,
doesn't really help you anymore.
And so you have to do a lot of
fairly tedious orchestration yourself.
Some frameworks have kind of solved this problem.
Like, you hear about React suspense, for example,
which is essentially a way of coordinating activity
that could be happening in multiple components
that aren't aware of each other
and haven't been designed to coordinate
with each other in the first place.
And Svelte doesn't have that,
and it would be nice if we did.
And so while we don't exactly know
what the Svelte way of doing that is going to be,
it's something that is definitely top of mind.
- Yeah, and that would probably also affect
like data loading in KIP.
- Potentially, but potentially.
I don't see the load function going away anytime soon.
Like, I think that the distinction that SvelteKit has
between the loading and the rendering phases
is actually really useful and important.
Like, the fact that you have this loading phase first
in which you can throw errors and you can do redirects
and all of that sort of thing
before you start the rendering process,
I actually think that's a pretty essential separation.
- Yeah, I mean, I prefer it as well.
I'm very, like, I really do not like to have logic
inside of my visual, like, mixed into the visual stuff.
- Yeah, at the same time, at the same time,
sometimes you'll have a component somewhere in your tree
that needs to get some data asynchronously,
and you're left with a choice of showing some,
like you have a flash of unfetched content
while that component does its business,
which might have to happen with a fetch inside an on mount
or something like that,
which is kind of a grubby way of thinking about the problem.
Or you have to hoist that data requirement
all the way up to your load function
and then sort of prop drill
all the way back down to that component.
And then, you know, if you end up not needing it
and you delete it, then you've got to remember
to also get rid of the data loading code
in your load function.
And that kind of sucks.
It would be nice in a lot of cases
if you could have that loading logic inside the component
so that it was co-located sensibly,
and if you deleted the component,
you're also deleting the data loading code.
Obviously, you want to be careful that if you do that,
you're not introducing the possibility of waterfalls.
So you have to be very careful
about how you design these things.
But if we do that, then that's one less thing
that needs to happen inside the load function.
And so, you know, it's very possible
that if we do manage to design async state
in a really good way that allows us to do this sort of thing
without introducing waterfalls,
then the way that we think about loading in SpeltKit will,
you know, could change quite substantially,
but, you know, that definitely not in the immediate future.
- Would that mean kind of like component-based loading,
or would it, how do you imagine it looking if?
- Yeah, I think you would probably want to have
the dependency on some asynchronous resource
expressed inside the component,
and then maybe your load function is primarily
about doing, you know, the errors and the redirects and--
- Right, yeah, yeah.
- Authentication and all those sorts of things
before the actual loading happens.
- I think I misspoke.
I meant component-by-component loading functions.
Maybe that's what you answered, though.
I don't know.
- It's very--
- Like, instead of having one page,
I'd have sidebar loading function, or, you know, like--
- Yeah, it's really hard to say what you like at this point.
- Like, I also, like, I kind of like having it all
in one file, in the sense that, like,
oh, I know where my loading is happening, right?
If that was split up into, like, 15 different files
that are all over my code base, then I'm like, ugh.
But then at the same time, if I'm in, I don't know,
the post list component, then it kind of makes sense
to also have the data loading next to it.
I don't know.
- Yeah, I mean, to push back a little bit on that point
of, you know, having the code in 15 different components,
like, do you think about CSS that way?
Do you think--
- I mean, I write Tailwind, right, so--
- Right, right, right, but, you know, it's a--
I mean, no, I think it does apply, actually.
Like, you're defining the styles on the element itself,
which is the most granular--
- That is true.
- You can do that, but the slightly less granular
and maybe more self idiomatic way is to have the styles
defined in the component, and if you don't do that,
then, you know, if you say, I don't have all my styles,
like, split across all of these 15 components,
I want to have, like, one global.css file.
And that's essentially what a load function is today.
There are obviously pros and cons and trade-offs and so on,
but I do look at what people can do
with React server components, like, a little bit of jealousy.
I think it would be nice if we could steal
the good parts of that.
- Yeah, all right, fair enough.
We also mentioned here that we wanted to talk about
the store, that stores are not scoped in Svelkit.
If you're doing the server side,
don't remember what it's called.
- Yeah, the, so people--
- They're global, right?
(laughing)
- Yeah, there's this meme that stores aren't SSR safe,
essentially. - Yes, yeah, yeah, so.
- You know, if you're referring to a store value
inside a component in your Svelkit app,
and you're deploying to a multi-tenant environment,
like a node server, then, in theory,
you could have a response for one user
displaying another user's data.
- Right, yeah, that's my point.
- Obviously, that would be very bad.
In practice, like, I think you've really got to mess up,
like, substantially before that.
And also, it's not about stores.
Like, this isn't a problem with stores.
This is just a problem with variables that,
yeah, with global state, essentially.
However it's expressed can be just a normal variable.
- Yeah.
- Like, if you really code things in quite a strange way,
then there is a possibility that you could leak data
between users, but like, number one, don't do that.
But number two, there is this primitive
that exists in basically every server runtime now
called Async Local Storage.
And in theory, it should allow us to build some primitives
that essentially make that a non-issue altogether.
What Async Local Storage does is it allows you
to associate a context with a specific request,
and then at any point while you're responding
to that request, you're in that context,
even if the response takes place
over multiple sequential steps that have, like,
an asynchronous gap between them.
- Right.
- So whereas today, you have a load function,
and you're sort of given things that pertain
to the current request, and they're part of the arguments,
the load function, so you know, you call event.fetch
instead of just calling fetch or whatever.
The reason that we do that is because that's how Svelker
is able to associate those resources
with the current request context.
- Right.
- But if we use Async Local Storage,
then we might be able to design things
in a slightly more ergonomic way.
So you know, sometimes you will see people
have an abstraction around an API,
and it requires a fetch implementation to be passed in.
- Yeah, that becomes cumbersome, yeah.
- It does, and so you have to pass event.fetch
in every time you make an API call.
It's very annoying with Async Local Storage,
like things like that, are no longer necessary.
And similarly, if you can associate
a particular store read with a request context
you know, store read or any other type of variable read,
then you can ensure that the stuff that you're rendering
while responding to this user is scoped to this user
and not some other user.
So I think that will hopefully put this--
- Alleviate and get rid of the mean.
- Yeah, once and for all.
And you know, this isn't a problem that's unique
to Svelte by any means.
This is like just the reality of building--
- Just how it works.
- Applications that work in multi-tenant environments.
- Yeah, you also mentioned here PPR.
- I did, yeah.
- What is that?
- Next.js has a feature called PPR, partial pre-rendering.
And what that means is in the same way that in Svelte
you can pre-render a page of your app,
or you can pre-render a root of your app,
I guess I should say.
In Next, you can do that on a more granular level.
You can pre-render a particular layout or a particular page.
So say for example you have a navigation bar
that has a login/logout button.
Obviously that needs to be dynamically rendered
because we need to read cookies and see who you are
and what your name is and include that in the rendered HTML.
But maybe the page is just a static piece of content,
like a blog post or something.
So does it make sense to de-opt out of pre-rendering
so that you get the navigation bar,
but then you've got to hit a database to get the blog post
because you're dynamically rendering the blog post?
No it doesn't.
It makes a lot more sense to have the inner HTML
of the page pre-rendered and put somewhere,
and then you just do the dynamic rendering for the layout.
Or vice versa, you might have a static navigation bar,
but then you have some content on the page
that needs to be dynamically rendered.
- How granular could you get with this?
Like can you do it per component basically and then like?
- I don't know about that.
That starts to get--
- The overhead is bigger than--
- I think it's just too complicated for,
at least for me personally,
to figure out how you would do that.
But definitely pre-rendering at the granularity
of layouts and pages, I think is,
most of the time that's kind of--
- That's enough, good enough.
- Realistically that's what you want.
- 'Cause we've had some people asking for,
you know if you have a, before Svelte 5,
if you had a really long blog post,
like that could be, that could end up being
quite a lot of JavaScript, I think.
Because like, if you have a,
takes a long time to hydrate, right?
If you have a really, really long blog post.
And if you could pre-render that
and still have some things that are interactive,
that could be nice.
- Yeah, that's a slightly separate issue.
Yeah, that's about how you describe the component
in JavaScript, and what techniques you use
to avoid doing any unnecessary hydration work.
And Svelte 5 is a lot better than Svelte 4,
was it avoiding unnecessary hydration work?
We can skip over entire subtrees
if there's nothing to hydrate inside,
whereas Svelte 4 would do a lot of fairly unnecessary work.
And so things are definitely better in that regard.
There's room for improvement still.
Like we're still not as fast at hydration
as frameworks that don't ship any JavaScript
by default at all.
Those that use islands or resumability or whatever it is.
In practice, like, it's fine,
but there is room for improvement,
and that means that we, our work is not done.
- Right, yep, yep.
Well, I'm excited about partial pre-rendering.
Does that mean, like, so partial pre-rendering,
does that mean that we can stream just HTML
to some parts of the page,
like stitch it together somehow with,
'cause I remember I read a blog post a while ago
by Phil Walton, like some Googler.
He'd done like a service worker kind of thing where--
- That sounds like a Phil Walton thing.
- Yeah, yeah, he'd done like a,
he would split up the page in different,
like HTML sections, and then he would like
stitch them together in a service worker
and like stream that to the browser,
and just change the content part of it.
- Yeah.
- Maybe that's completely different though,
probably to partial pre-render.
I don't know.
Like could you stream in the,
make it so the layout section that's pre-rendered
streams in while the data for the other stuff,
like, am I making any sense?
- Yeah, I think streaming in SvelteKit
is gonna continue to be based on data rather than markup.
The way that we think about streaming
is a little bit different to other frameworks.
Like I'm not entirely convinced that streaming markup
makes that much sense in most cases.
You can invent scenarios in which
the ability to stream markup is helpful,
but most of the time what you really want
is to render the page immediately,
and then stream in the data that populates
the components that then subsequently get rendered.
You're much more likely to avoid broken layouts
and things like that if you do it that way.
- All right.
Yep, cool.
Let's talk about, so I'm here in New York
visiting a friend, but then for some reason
there was also JS Nation at the same time.
You did a talk, North Star I think you called it.
Should we talk a bit about the conference?
Did you like it?
- Yeah, I mean look, conferences are always fun.
They're a lot of work if you're going there to speak.
- Yeah, if you're just going out to talk to people
and hang out, then it's not a lot of work.
- But once the talk is over and you can sit back
and just enjoy hanging out with a bunch of other nerds,
then yeah, these things are great, have a good time.
- Yeah, definitely recommended for people
that haven't been to a conference.
It's definitely something you should experience.
What was your talk about?
- So the idea of the talk was Svelte has had
a lot of different identities over its eight years.
And we've just shipped Svelte 5 which is
a bit of a departure from what the framework
has looked like up until this point.
And so the talk is sort of a forcing function
for me and the rest of the team to try and codify
what it is we're actually trying to do with this project.
When Svelte 1 came out, its raison d'etre was to let you
ship applications with the smallest bundle size possible.
And then later that focus switched to be a little bit more
about making apps that are very fast
because you have compile time reactivity.
And then we realized that what people actually like
about Svelte is that it allows them to write applications
very concisely and that it's just kind of fun to write.
And so we leaned into this idea that with Svelte
you can write less code and as a result of writing less code
you can write more robust code, you can write code
more quickly and so on.
And then obviously SvelteKit, we shifted focus towards
well here's how we think you should build an application.
Doesn't solve all of the problems of application building.
Like it's, wouldn't call it a full stack framework
but like a lot of the stuff that Svelte itself
doesn't help you with, SvelteKit is there to help with that.
So with Svelte 5 a lot of the focus has been on
reliability and predictability and so on.
And that's changed a lot over the course of the project.
And so the last maintainers meeting that we had last month
we sat down and we talked about why we're doing this.
Like why we do all this work, what impact are we hoping
to have in the world through Svelte.
And what we realized was the thing that we kept coming
back to, the thing that I for one am particularly motivated
by is this idea that most software just isn't usable.
Like most software in the world sucks.
Software is everywhere, it's ubiquitous.
Like everything in life nowadays is mediated through
software and collectively we have done a terrible job
of writing software.
You just think about the number of times you see
inscrutable error messages or--
- Blue screens.
- Blue screens, blank screens, I pick on GitHub a lot
because that is probably the piece of software
that I spend most time in.
- Right, yeah.
- And it's not good, there's a lot about GitHub
that is really not good.
And there's reasons for this and the reasons
that we're all reasonable and it's not because
people don't care, it's not because people aren't trying.
But it's a problem nonetheless.
And so our North Star, we concluded, should be about
helping people make better software that doesn't have
some of these reliability issues and so on.
And so the talk was really about how we arrived
at that conclusion and what it means in practical terms
to orient a project around those goals.
- Yep, cool.
So that kinda ties in a bit to error boundaries, I guess.
Like a way of handling errors and not bricking
the application when something goes wrong.
Like imagine if you're, I don't know,
you're at a ticket kiosk and you're buying a ticket
and for some reason the application is a JavaScript
application and it just errors and nothing's happening
when you click the screen, that's not good.
So yeah, that's nice.
All right, I think we've gone through all the talking points
that we have here.
There's just the two last sections left,
hot takes and picks.
So let's start with hot takes.
Do you wanna go first or should I?
- Sure, my hot take is a meta hot take.
It's that there should be more hot takes.
There's a little bit too much resistance to openly
being critical of each other's work, I think, online.
Which isn't to say that I think we should all be mean
to each other, I don't.
I think that one of the things I like about our community
is that everyone is, in general, pretty friendly
and respectful towards each other.
But I don't think we have enough willingness to say,
you know what, this thing sucks, this idea sucks.
- This is wrong.
- I personally relish it when someone comes along
and makes a reasoned argument about why something
that I've worked on sucks.
Because that's how we can make things better.
And we tend not to do that, we tend to shy away from that
because we don't wanna hurt people's feelings,
which is understandable and admirable.
But ultimately, if we're gonna get better as an industry
at our craft, then we need to get better
at telling each other when stuff sucks.
- Yeah, all right.
I do wonder, though, if that actually is a hot take.
'Cause it's kinda like, it probably is,
but I also feel like it's like common sense as well.
- I mean, I think it's common sense,
but it's common sense that is not very common.
Like, a lot of people just don't seem to wanna do that.
And I think a lot of times as well it's because
people aren't all that confident in their positions.
Like, sometimes if I see something and it seems not great,
then my first instinct is like, oh, it's probably me,
like I'm holding it wrong.
- Right, right.
- And so there's a little bit of a reticence to say,
hang on a minute, this is--
- Is this really right?
- This is bad, you know, you don't wanna do that
and then it turns out that you're the idiot.
- Yeah, I feel like that happens to me a lot.
I always have weird opinions and I'm like, oh, wait,
I was using it wrong.
Happens a lot.
All right, my hot take is that SQLite is the best database.
I use it specifically synchronously as well,
which is kind of different, I guess.
Well, for SQLite, I don't think it's that weird,
but fetching data from a database synchronously
is probably not the most common thing.
I think more people should use SQLite.
I've had great fun using it for the new
Roosevelt Society website that's coming up soon and yeah.
I think that's it for my hot take.
Maybe it's not a hot take either, I don't know.
- I mean, I think everyone loves SQLite.
I think it'd be hard pressed to find someone
who doesn't think SQLite is great.
Maybe the hot take is that you're using a database
that intended to be used in like embedded devices
instead of using a traditional database server,
like you're using SQLite over Postgres
even though you're building something that is web scale.
- Yeah, yeah, yeah, always on Hacker News, right?
Someone posts something and you're like,
oh, but how will this scale to one million users?
I'm like, nah, you don't need it, it's like, it's not,
you're not gonna have one million users.
It'll be fine with SQLite.
Yeah, all right, picks.
- I have two picks.
My first pick is Blue Sky.
- It's having a bit of a resurgence at the moment.
It's nice.
- It really is.
So at the time of recording,
Blue Sky had just passed 20 million users.
It has been consistently adding like a million users a day
for the last several days.
- That's awesome.
- Which is, yeah, I mean, I joined sometime early last year.
- Yeah.
- I was a relatively early user.
- Felt completely dead for a long, long time.
- Felt completely dead.
I think I was one of the first 40,000 users,
which now that it has 20 million users
feels like I was pretty ahead of the curve.
But the reality is, I just squatted on a handle
and then ignored it for a long time
because it didn't feel like a lot of conversation
was happening there.
All of a sudden, basically all of the people
that I wanna hear from are on Blue Sky.
- It's like Twitter, but without all the Twitter.
- Yeah, it's Twitter without all the Twitter,
Twitter without Elon in particular.
And it's nice.
Like, a lot of people, the timing of this
was obviously around the US election.
Like a lot of people were just very mad at Elon Musk
because of his involvement in the US election
and moving to Blue Sky was sort of an act of protest.
But regardless of the catalyst,
because it's so based around network effects,
it kinda doesn't matter why it's happened.
But the fact that it's happened
is reason enough for it to keep happening.
And for a long time, I was a total Twitter addict.
Like, I was like on Twitter all the time.
Even if I wasn't posting,
I was just like mindlessly scrolling.
And I tried a bunch of times to just quit
because I know it's not healthy being on there.
But I couldn't because it's like heroin.
Well, it turns out Blue Sky is like methadone.
It's the thing that has,
like, I no longer have a Twitter addiction.
- Right, now you have a Blue Sky addiction.
- So this is the thing about Blue Sky.
It is so much better and healthier
than Twitter in a lot of ways.
But it is also not, like, Twitter is like crack.
I just couldn't get--
- I mean, it's also--
- I guess I've compared it
to two very, very destructive substances.
But the point I'm making is that you go on Twitter
and it's gonna tickle the outrage sensors in your brain
in a way that you just keep coming back from.
Blue Sky doesn't really have that.
Like, it doesn't reward the sort of engagement bait
that you see on Twitter.
And that's such, even though I like being there a lot more
and I check in on Blue Sky probably multiple times a day,
I don't feel, and my thumb doesn't naturally gravitate
towards the icon as soon as I turn my phone on,
which it did with Twitter.
- Same for me.
- I mean, maybe that'll change.
Like, a lot of people are like,
"It's gonna go the same way that Twitter went."
- I don't think so.
- Yeah, I mean, it's being designed specifically
to avoid some of the things that happen to Twitter.
But even if it does, like, I will take the possibility
of future shittiness over the guarantee
of present shittiness.
- Yeah, I mean, yeah, Twitter is crap, right?
It's really bad.
I recently found out that there's, like,
you can actually use different feeds in Blue Sky.
- Oh, yeah.
- I had no idea about that.
And that's, like, a great feature.
And also, the fact that it's chronological by default,
I think, is good.
'Cause that's one of the dumb things about Twitter,
like, also makes you, there's this never-ending scroll
of seeing new content all the time, and ugh, yeah.
I wish I could delete it, though.
But there's still a lot of folks on Twitter.
- There are for now.
I mean, I haven't deleted my Twitter account,
partly because, you know, I'm candidly hedging my bets.
Like, maybe this thing doesn't work out,
and everyone moves back to Twitter,
and if everyone else moves back to Twitter,
then I'm gonna do the same.
Because I wanna be where my friends are, honestly.
Partly it's because when people delete
or deactivate their accounts,
anything that they've posted in the past,
like, if it's embedded somewhere, that vanishes.
So there's a lot of holes in dev.to articles
all of a sudden, stuff like that,
which, as someone who cares about
the archival properties of the web,
it would feel very hypocritical for me to do that,
because I know that, in some cases,
my tweets are those end breaks.
But also, like, I won't be able to refer back
to thoughts that I've had in the past,
and conversations that I've had in the past,
because, you know, sometimes I'll remember
that I had a conversation with someone,
and there was a link that was shared,
and I wanna be able to go find that again.
And if I destroy that archive,
then it's gonna be a lot harder for me to do that.
So I'm keeping it around.
Also, you know, the Svelte accounts
have way more followers still on Twitter.
And even if a lot of those followers are illusory,
they're bots, or they're inactive, or whatever.
- Still a lot of people following them, yeah.
- You know, it would be irresponsible
to delete those accounts, but.
- It's funny, by the way, when,
I think the Svelte Society account,
no, it was the Svelte site that added the blue sky link.
- You did, yeah.
- And some people were outraged because of,
like, the, oh, you removed, oh, this is so woke.
- The Svelte Society removed the Twitter icon
and put the blue sky icon there, because they're woke.
So, first of all.
- There was no Twitter link.
- First of all, I'm begging you to define that word.
Absolute numskulls.
But second of all, yeah,
we never had a Twitter link in the first place.
- It's so funny.
- Yeah.
- Oh, well, it is what it is.
- Yeah.
- All right, your other pick.
- My other pick, I'm reading a book at the moment
called Lifespan by a chap named David Sinclair.
- That name sounds very familiar.
- Yeah, so it turns out he's quite a well-known guy.
I didn't know about him until fairly recently.
He was in Brooklyn for an event at a place
that we like to go to from time to time.
And it was a sort of a panel discussion
on the topic of longevity, which, I don't know,
I guess I've had a passing interest in longevity.
I think it would be cool to be able to live
a healthier life for longer.
Like, I like being alive.
I would like to keep being alive for as long as I can.
- I think that makes sense.
- Yeah, and this guy, apparently a lot of people knew this.
Apparently this is like a very widely read book.
He has a theory on why we age
and by extension, why we suffer diseases
like heart disease, cancer, Alzheimer's.
A lot of things are all fundamentally driven
by the same mechanism, which is aging.
I'm not a scientist.
I'm not qualified to know if this is now a mainstream view.
But the idea is that aging is a result
of an information breakdown in the epigenome.
And then you can repair that.
You retain all of the genetic information
that you need to create new young cells.
- Right, yeah.
- But it's the stuff around the genome
that starts to break down and results in aging.
And science is starting to uncover ways
that we can inhibit or even reverse that process.
- Yeah.
- And so I've been learning about where we are
or at least where we were when this book was written,
which I think was about five years ago.
So after I finish reading it,
I'm gonna try and catch up on the latest science.
- Right, yeah.
- And where we might be in the very near future
once a few of the clinical trials that have been underway
either turn up some results or don't.
Like, maybe--
- Maybe we can live forever.
- Maybe we can live forever, but even if we can't,
there's some tantalizing ideas about a pill
that can cure blindness and things like that, which--
- I mean, it's interesting.
I recently read about this thing
where you can, so basically, where I'm from,
there's this medical university,
and they've developed this method
of working with stem cells, basically,
to kind of, basically what you do,
they extract these stem cells from donors,
and then you can get a shot with stem cells
like into a joint or something if you have arthritis.
And then the idea is that the stem cells
are gonna regenerate the tissue and stuff like that.
I guess that's kinda, maybe not exactly longevity.
I guess it's longevity focused,
but it's kinda like repairing tissue damage in a sense.
- Yeah, it is-- - I just find it
super interesting.
- It seems like a different approach
to solving-- - Yes, yeah, yeah, exactly.
Like, fixing issues after the fact,
maybe rather than before, I don't know.
Super interesting.
All right, what is my pick?
My pick is gonna be Silo season two.
So Silo is a TV show based on a series of books.
I don't remember what the books are called.
I think the first one's called Wool?
Anyway, it's a good TV show.
It's about a bunch of people living in a silo,
and it's like a dystopian kinda sci-fi thing.
- So I watched season one, and it started out really strong.
By the end of it, I was like, "What is going on here?"
- They really lost me, but people have been raving
about episode one of season two.
Should I give it another chance?
- I would, I would.
But then I really liked even the end of season one,
so I would give it a go.
- All right.
- So yeah, I think it's great.
And also, the main character, the actress is Swedish, right?
So I had to support it.
- Oh, she is?
- Yeah.
Yeah, so that's my pick.
And with that said, I guess we're done.
Thanks for doing the interview with me again.
And thanks for having me over here.
- Always welcome.
- And yeah, where can people find you?
Not on Twitter, but maybe on--
- Blue Sky, @rich-harris.dev.
- Yeah, awesome.
All right, and with that said,
thank you everyone who is listening,
and we will see you next week.
Bye bye.
- Hey, it's Kev here.
If you like the show,
please drop a review on your favorite podcast player.
It would help out a lot.
