Jack_Herrington:
Welcome to React Roundup. I am your host, Jack Harrington, and with me today is my esteemed colleague, TJ Vantoll,
Tj_Vantoll:
Hey everybody.
Jack_Herrington:
as well as Sam Magura. Hi, Sam. Yeah.
Sam_Magura:
Great
Jack_Herrington:
So,
Sam_Magura:
to be on.
Jack_Herrington:
Sam, you did a blog post recently around CSS in JS. So, yeah, you want to talk a little bit about that and then we can kind of see how that segues into other things?
Sam_Magura:
Yeah, sure. So I wrote this post in October. It was titled, Why We're Breaking Up with CSS and JS. And it's kind of a combination of my personal journey with the technology and then also at my company's spot, like how I saw them using the technology and how I eventually realized that it was really harming us in terms of runtime performance of our React app. But yeah, so the post, I basically... Um, just went through like, you know, what's attractive about this technology, uh, which is like, you get the locally scope styles. You can use JavaScript variables in your styles. You can put the styles right in the same TSX file as your component. Like there's a lot of convenience that comes with it. Uh, but there's also a lot of nasty things that come with it. Like, uh, so I was actually a contributor to the emotion project, which is the second
Jack_Herrington:
Oh wow,
Sam_Magura:
most popular.
Jack_Herrington:
like so you were bought in.
Sam_Magura:
Oh yeah, I was way in. Yeah, I was like the, pretty much the number two contributor to that project for about a year, which isn't saying a ton because the project is not, it receives like critical maintenance only basically. It's very hard to contribute to. Like it's still written in flow and
Jack_Herrington:
Oh
Sam_Magura:
just
Jack_Herrington:
no way, really?
Sam_Magura:
it is, yeah.
Jack_Herrington:
Oh my
Sam_Magura:
I was
Jack_Herrington:
God.
Sam_Magura:
actually working on converting it to TypeScript, but it was a huge task.
Jack_Herrington:
I'm guessing a lot
Sam_Magura:
Yeah.
Jack_Herrington:
of people don't even know what flow is, but okay.
Sam_Magura:
Yeah,
Jack_Herrington:
It's an alternative to TypeScript, real fast.
Sam_Magura:
the Facebook
Tj_Vantoll:
Well.
Sam_Magura:
version of TypeScript. Yeah.
Jack_Herrington:
Yeah.
Tj_Vantoll:
To take even a bigger step back, I wanna start by just saying we should define CSS in JavaScript.
Jack_Herrington:
Yes, please.
Sam_Magura:
Sure.
Tj_Vantoll:
Just
Sam_Magura:
Yeah.
Tj_Vantoll:
for our very basics, let's say maybe you can get us started with what is the tech, I guess we can focus on the positive too early. What sort of things drew you in? Maybe give some real world examples of how you've used it successfully.
Sam_Magura:
Yeah, I mean, so just at a super basic level, I mean, back in the old days, you had your HTML file, you had your CSS file, they were separate things. You wrote classes in the CSS that applied to the HTML, but I'm not really sure what caused people to think we should start writing those CSS classes inside of our JavaScript, but that's
Jack_Herrington:
I think I know
Sam_Magura:
really
Jack_Herrington:
what it
Sam_Magura:
what
Jack_Herrington:
was.
Sam_Magura:
it is.
Jack_Herrington:
I mean, I think they just
Sam_Magura:
Okay.
Jack_Herrington:
wanted, I just wanted a single file.
Sam_Magura:
Yeah,
Jack_Herrington:
It's probably
Sam_Magura:
it
Jack_Herrington:
that
Sam_Magura:
is
Jack_Herrington:
easy.
Sam_Magura:
pretty nice.
Jack_Herrington:
Yeah. Like you had to have this external CSS file and it was either in the same directory and I got like a directory per component. It was a huge pain in the butt,
Tj_Vantoll:
Yeah.
Jack_Herrington:
but you
Tj_Vantoll:
And
Jack_Herrington:
can have
Tj_Vantoll:
I mean,
Jack_Herrington:
it all in one file. It's
Tj_Vantoll:
CSS
Jack_Herrington:
easy.
Tj_Vantoll:
organization is like a historic pain point for
Jack_Herrington:
Oh yeah.
Tj_Vantoll:
any,
Sam_Magura:
definitely.
Tj_Vantoll:
any large company, any large app. So you have like different CSS structures and, but like those, those can get hard, especially
Jack_Herrington:
Yeah.
Tj_Vantoll:
like
Sam_Magura:
They're
Tj_Vantoll:
on
Sam_Magura:
fine.
Tj_Vantoll:
large teams, right? And then you end up with this situation where it's like, oh crap, what is, what styles are you even controlling this random header or button I'm in? Like it might be in three different files in three different places. And it's,
Sam_Magura:
Yeah.
Tj_Vantoll:
it's a challenge that we've had for a long time.
Sam_Magura:
Definitely. Yeah. And I think the core challenge there is that CSS is global by default.
Jack_Herrington:
Mm-hmm.
Sam_Magura:
So you style your class dot my button, anything in your entire huge enterprise app that has that class is getting those styles. And so CSS and JS kind of fixes that by making styles locally scope by default. And it does that by generating like a artificial class name. for each piece of CSS that you write. And so that's one of the big appeals to it, in addition to being in the same file as your React or other JavaScript code.
Jack_Herrington:
It amazes me how much we've done to get around cascading in cascading
Sam_Magura:
Hmm.
Jack_Herrington:
style sheets.
Sam_Magura:
That is
Jack_Herrington:
You
Sam_Magura:
really
Jack_Herrington:
know,
Sam_Magura:
true. Yeah.
Jack_Herrington:
right? That was supposed to be the benefit. You're supposed to be able
Sam_Magura:
Hahaha.
Jack_Herrington:
to create like a body tag that has the other right font and then everything cascades from that.
Sam_Magura:
Mm-hmm.
Jack_Herrington:
we want to get around it. So yeah, we did the CSS and JS. So why is it inefficient? Did you drill down into the actual implementation and find out like
Sam_Magura:
Um,
Jack_Herrington:
why
Sam_Magura:
so
Jack_Herrington:
it's taking so long?
Sam_Magura:
I profiled some of our components that we're using it heavily. I didn't like thoroughly profile emotion itself, but I do have some pretty good guesses for why it's not performant. Um, so one of them is you write like a CSS string or an object style in your JavaScript code, and then emotion has to convert that to a serialized style is what it's called in the code base.
Jack_Herrington:
Okay.
Sam_Magura:
Um, which is like a piece of CSS text that can be directly inserted into the document. And the way it's shown in the emotion documentation and how I think a lot of people do it is that that style serialization happens on every render of your React component. So if your component's rendering, you know, 15 times per second, it's doing all this work to serialize those styles for every tag that you use CSS and JS on.
Jack_Herrington:
Oh wow.
Sam_Magura:
on every render. And so I think that's a big performance cost. And then another one, which is much harder to observe is that, uh, like the way almost every CSS and JS library works, even compile time ones is when a component mounts, it inserts its style into the DOM. Um, and browsers like to cache like all of the style rules for a page. And so whenever you have a new component mount, It inserts new style rules and that invalidates this kind of internal browser caching mechanism, which causes the browser to have to redo a lot of work. So that's, it's hard to see that really in practice, but that is another performance impact from it.
Tj_Vantoll:
Yeah, I think it's funny because at its core, the CSS in JavaScript is somewhat replacing some of the browsers built in ways of handling these processes because
Sam_Magura:
Mm-hmm.
Tj_Vantoll:
the browser, by default, the browser is going to handle the CSS sort of parsing and applying it to things. And essentially you're somewhat replicating that in JavaScript. And the difference
Sam_Magura:
Yeah.
Tj_Vantoll:
there is if the browser is doing it, it's like optimized
Jack_Herrington:
Yeah,
Tj_Vantoll:
C code.
Jack_Herrington:
that's C++. Ha ha ha.
Tj_Vantoll:
It's
Sam_Magura:
Yeah.
Tj_Vantoll:
yeah, that's running that's running in the background that's doing this on your behalf. And if JavaScript is doing it, it's first of all, more code for the user to download, um, just the, the downtime. But I think the bigger cost is the, like, like you said, the runtime nature of this, cause JavaScript's just got to do more work that otherwise it would just defer to the browser to take care
Sam_Magura:
Yep.
Tj_Vantoll:
of.
Sam_Magura:
And also the stuff the browser is doing is totally separated from the React render loop. But if you're serializing those styles and render, it's happening every render, which you want to limit what happens every render as much as possible.
Tj_Vantoll:
Yeah, the browser can multi-thread
Sam_Magura:
That's
Tj_Vantoll:
the
Sam_Magura:
true
Tj_Vantoll:
handling
Sam_Magura:
too,
Tj_Vantoll:
of
Sam_Magura:
yeah.
Tj_Vantoll:
some of this stuff, whereas your JavaScript code is not. It's
Sam_Magura:
Yeah.
Tj_Vantoll:
that stuff's just got to happen. And I think too that it's another one of those situations where it really depends on the scale you're operating with, I feel like, because just to take the simplest example, if you're building Hello World with CSS and JS and you're adding one or two components, there's like a 0% chance you're going to notice any performance issues.
Jack_Herrington:
Oh
Sam_Magura:
Definitely.
Jack_Herrington:
yeah.
Tj_Vantoll:
Because... It's going to parse a small group of styles. It's going to paint them. It's going to do them in like two milliseconds.
Sam_Magura:
Mm-hmm.
Tj_Vantoll:
It's not going to be human perceivable. No one's going to care. And that's probably true even up to, I mean, my guess would be even to like small websites that it's almost going to be somewhat negligible. But I'm curious, what was your flag, what sort of cued you into this? Because there's might be a problem that this might be something that... you needed to investigate. Were you getting like user reports of problems? Was it starting to get to the point
Sam_Magura:
Yeah.
Tj_Vantoll:
where you could like visually see differences or?
Sam_Magura:
That is a really good question. And I'm going to have to think very hard back in my memory to remember why.
Tj_Vantoll:
Hehehehe
Sam_Magura:
So yeah, we have a pretty big app at Spot. And I was tasked with just improving the performance of the app overall. And
Jack_Herrington:
Mmm.
Sam_Magura:
so
Tj_Vantoll:
Okay.
Sam_Magura:
I was both looking at things like using a service worker for caching and also like once the app is loaded, how do we optimize the rendering of these React components? And so I think I started where everyone should start, which is using the react dev tools profiler and in that profiler, I saw that. So, uh, at spot, we weren't just using emotion, like directly on Dom elements. We had all of these kind of style primitive components like box and flex and typography and heading one heading two, which are actually react components. that we're using emotion to apply styles. And I just saw that these little components were actually a kind of non-trivial amount of our render times in the profiler. And so that's what caused me to be like, all right, I'm gonna take this page, I'm gonna rewrite it with plain CSS, and I'm gonna compare the performance. And that was really like the kind of aha moment where I was like, that cut the render time in half. So.
Jack_Herrington:
Oh wow.
Sam_Magura:
Half of our time rendering this component was just attaching CSS to these box components and these flex components and these typography components. And it's like, we were really deriving very little value from those components over like using something like CSS modules or utility classes, which would have been much more performant. And so,
Jack_Herrington:
So
Sam_Magura:
you
Jack_Herrington:
it
Sam_Magura:
know,
Jack_Herrington:
wasn't the
Sam_Magura:
big
Jack_Herrington:
existence.
Sam_Magura:
costs, little value, yeah.
Jack_Herrington:
Yeah. It wasn't the existence of box that like, cause I think folks. Like we want to, I think there's a sentiment out there where we want to reduce the number of components overall. Like
Sam_Magura:
Yeah.
Jack_Herrington:
there's some overhead, neat, natural overhead to, to components. What you're saying is the fact that there was a box that's fine. It was the fact that we had, that we're laying out box with this particular method of CSS. That was the problem.
Sam_Magura:
I think that's kind of a complex issue. So yes, the, the fact that we were using CSS and JS inside of that box component was the main problem. I think the total number of components is really maybe focused on too much. Like, uh, just in my experimentation, like React is very efficient with dealing with large number of components.
Jack_Herrington:
Yeah!
Sam_Magura:
Um, and then the third thing I would say though, is like, if you have a component called box, you're going to want to style it with props. which means you're either using CSS and JS or you're using inline styles, neither of which are ideal for performance. But at least inline styles don't really hurt your render times. It's only more of a browser performance thing.
Tj_Vantoll:
It's funny. The other thing you have listed in your article
Sam_Magura:
Mm-hmm.
Tj_Vantoll:
is that is how CSS and JavaScript clutters the react dev tools. And that's
Sam_Magura:
Oh
Tj_Vantoll:
something
Sam_Magura:
yeah.
Tj_Vantoll:
I've ran into before as well. And it seems like such a small thing, but like those sort of developer conveniences can really just make your life more difficult. And
Sam_Magura:
Definitely.
Tj_Vantoll:
those, those little things like that do do legitimately translate into lost time, lost productivity, lost money. all those sorts of things, because you don't want to be sifting through all of these from your image, like insertion, emotion,
Sam_Magura:
Mm-hmm.
Tj_Vantoll:
CSS, because then you're looking at this and your brain loses any construct of what this component tree actually is, because
Sam_Magura:
Yeah.
Tj_Vantoll:
it just looks like a hot mess.
Sam_Magura:
The signal to noise ratio is just really low there. Yeah.
Tj_Vantoll:
Yeah.
Sam_Magura:
Um, yeah, I mean, it's like, if we're using this technology because we feel like it has a better developer experience, then it really is fair to criticize it and that while the developer experience is not better when you're using the dev tools.
Tj_Vantoll:
So then I'm curious then you've you identify these problems, you decide that there is some definite performance gains to be made. I do wanna get in a chat of like what sort of things you do recommend now or what other things you investigated, but
Sam_Magura:
Mm-hmm.
Tj_Vantoll:
I'm curious your process of if to choose to migrate away from that, like what is that process like? Did you end up converting the app or is that something that's in progress?
Sam_Magura:
Yeah.
Tj_Vantoll:
How much of a pain did that end up being?
Sam_Magura:
Um, so I guess I'll start with like, what do I recommend now? Which
Jack_Herrington:
Yes,
Sam_Magura:
is,
Jack_Herrington:
please.
Sam_Magura:
yeah.
Tj_Vantoll:
What is
Sam_Magura:
Um,
Tj_Vantoll:
the magic answer? Well,
Jack_Herrington:
Yes.
Sam_Magura:
yeah,
Tj_Vantoll:
I guess I'll
Sam_Magura:
basically
Tj_Vantoll:
go convert all of my
Sam_Magura:
CSS
Tj_Vantoll:
apps.
Sam_Magura:
modules are the magic answer for me. I mean, they provide the locally scoped styles. Uh, they, I mean, you don't have to do it this way, but a lot of people will write a CSS module right next to the, uh, component. So like you have my button dot TSS, my button dot module dot CSS. It's not in the same file, but it still keeps things closely tied to each other so that it's not confusing. And I like the extra power that SAS gives you. So I actually do CSS modules with SAS. But I mean, if you don't like SAS, you don't have to use it. That's just kind of like extra syntactic sugar on top. And then I do kind of like utility classes for really simple things like. You want to make this div have display flex. Like, it's annoying to have to define a CSS class for that. So I do think utility classes have their place. We are using kind of a forked version of the Bootstrap utility classes, which was mainly because that's what I was familiar with, having used Bootstrap for many years. Of course, Tailwind is the most popular utility class
Jack_Herrington:
new hotness.
Sam_Magura:
framework. Yeah, which. I have some opinions on Tailwind.
Jack_Herrington:
Oh yeah?
Sam_Magura:
I haven't used it that, that much, but yeah. I mean, they even say this in their docs, like it's effectively like writing inline styles, so you end up with a lot of duplication and, uh, I'm sure someone who loves Tailwind would tell me why my opinion is wrong, that that's a bad thing. But yeah, I just feel like, uh, huge benefit of CSS is that you can define a class once and then use it in a hundred places.
Jack_Herrington:
Yeah.
Sam_Magura:
And I just don't really see how you're supposed to do that with tailwind. Um,
Tj_Vantoll:
Well, Jack likes Tailwind, so
Jack_Herrington:
Well,
Sam_Magura:
okay.
Tj_Vantoll:
I'm waiting
Sam_Magura:
Go
Tj_Vantoll:
to hear
Sam_Magura:
for
Tj_Vantoll:
the
Sam_Magura:
it.
Tj_Vantoll:
defense here.
Jack_Herrington:
do I like it? I'm conflicted about it because on the one hand, I love like MX dash two, right?
Sam_Magura:
Mm-hmm.
Jack_Herrington:
That is so nice. Like I,
Sam_Magura:
Definitely.
Jack_Herrington:
you know, just throw that into a class and you're good. Right. But then when I look at like a button and the buttons got like 40 classes on it and
Sam_Magura:
Hehehehe
Jack_Herrington:
it's just like, what is going on? You know, and so it's very, it's like cognitive dissonance when it comes to this. I just, I, you know, it's hard for me to justify it really. So yes, I like it, but I also don't like it.
Sam_Magura:
Yeah, yeah, so I guess we're using a more of a pared down utility class approach where we do have the MX-2, but we're not trying to apply all of the button styles just with the utility classes. We
Jack_Herrington:
Yeah.
Sam_Magura:
just use CSS modules for more complex things
Jack_Herrington:
Right.
Sam_Magura:
like that.
Jack_Herrington:
I think actually if I, if there was, you know, I'm, I'm sure you can do this, but you can just basically take tailwind and take all of the, like, cause there's, there's definitely there's there's CSS that's like layout and there's, there's CSS that's styling. And I'd like to have the CSS that's styling kind of, you know, be one thing. And that layout thing, the MX two or whatever. I think that that's really handy. Just being able to say like flex, flex, blah, blah, blah, blah, blah. And you're good. Like that. That would be right. Is that sounds like it's something like what you've got. You've got basically CSS modules plus
Sam_Magura:
Yeah,
Jack_Herrington:
that or.
Sam_Magura:
so kind of the way I do it is like, if I can write all of the styles for this element just with a few utility classes, I'll do it that way. But if I get to the point where I need to apply a style that can't be done with our utility classes, then I'll just write all the styles for that element in plain CSS or CSS modules really. So yeah. I don't really divide it like you do between these are styling attributes and these are layout attributes, but that is a good way to think about it.
Tj_Vantoll:
I'm curious, have you experimented with Svelte at all and the way it approaches CSS? Cause...
Sam_Magura:
I have not, so I don't know anything about that.
Tj_Vantoll:
It's fun because it, I'm also a fan of your approach. When I, for the big React app I work on, we use the exact same approach. We have
Sam_Magura:
nice.
Tj_Vantoll:
CSS modules that are with SAS. We like SAS too, is it just some of the niceties,
Sam_Magura:
Mm-hmm.
Tj_Vantoll:
syntax niceties and like variables and stuff like that tend to be really nice. But I've got a small little utility app that I worked on last year in Svelte and they do styles that are scope styles, but you can write them in the same file. And then it comes though, as I understand it, and this, I'm also not the world's biggest spelt expert, but it's, it's sort of like bakes, bakes them into the components. So I don't think, and this is the part where we need our listeners to like fact check us
Jack_Herrington:
Hahaha
Tj_Vantoll:
on it, but I, I don't think it comes with some of the baggage of like the CSS in, in JavaScript approach. Cause I, as I understand it, it kind of almost generates a module for you that scoped. But, uh, and it also works a lot like view, cause view lets you do something. similar as well, where you just write a style in their file. I think now as I'm talking, now I'm like starting to doubt myself.
Sam_Magura:
Well, I mean,
Jack_Herrington:
Yeah.
Sam_Magura:
this is React Roundup. We don't have to know about other
Tj_Vantoll:
Yeah.
Sam_Magura:
frameworks.
Jack_Herrington:
about
Sam_Magura:
Ha
Jack_Herrington:
film.
Sam_Magura:
ha ha.
Jack_Herrington:
Oh, yeah. Yeah. Yeah. Although we end up talking about it so
Sam_Magura:
Hehehehe
Jack_Herrington:
often. Don't
Tj_Vantoll:
Yeah,
Jack_Herrington:
know what
Tj_Vantoll:
no,
Jack_Herrington:
that's
Tj_Vantoll:
I think it's, I mean, I don't think there's a single React developer. I think it's important to know a bit about the broader ecosystem, right?
Jack_Herrington:
Oh,
Tj_Vantoll:
Cause
Jack_Herrington:
definitely.
Tj_Vantoll:
React's
Jack_Herrington:
Yeah, no,
Tj_Vantoll:
not always
Jack_Herrington:
I'm
Tj_Vantoll:
the
Jack_Herrington:
just
Tj_Vantoll:
right
Jack_Herrington:
joking.
Tj_Vantoll:
tool for it, but it does show when I try to speak from a position of authority on things that I've only toyed with
Sam_Magura:
Hehehehe,
Tj_Vantoll:
here or there.
Sam_Magura:
yeah. Um, but I think the other thing you asked TJ was how are we migrating our app from this like heavily
Tj_Vantoll:
Yeah.
Sam_Magura:
CSS and JS approach to more of the CSS modules and utility classes. And it hasn't been a like, all right, drop everything. We're going to rewrite the whole app using CSS modules right now. It's like, um, we were already using CSS modules for some things. So it's more like if we add a new component or heavily rework a component, we're convert it to the new styling system. But we're not aggressively trying to remove every instance of that box component, which I think there's still probably like a thousand times that we use that box in the code base.
Tj_Vantoll:
Yeah, it's.
Jack_Herrington:
I'm kind of surprised though. So I mean, wouldn't you just change box once and get the fix everywhere?
Sam_Magura:
Um, that's the problem though, uh, that I spoke about earlier, which is like, so box takes in all sorts of prompts, like, uh,
Jack_Herrington:
Oh, okay.
Sam_Magura:
flex and padding and margin. And so if you want to rewrite that component without using CSS and JS, you would basically have to use inline styles, which honestly would probably be more performant, but inline styles are still not ideal when you have those same inline styles applied to many elements. So. That's why we didn't go with that approach. That would have been a quicker way to extract the CSS and JS from the code base.
Jack_Herrington:
That makes sense.
Tj_Vantoll:
It's interesting too, because this actually strikes me. We talked to a lot of people, a lot of people end up on this show because they've migrated from some technology to
Sam_Magura:
Hahaha
Tj_Vantoll:
another technology. It's like a common pattern, I guess, of, of guests or just reasons people reach
Sam_Magura:
Mm-hmm.
Tj_Vantoll:
out. And this actually strikes me as one of the somewhat simpler migrations because like you're these two technologies can easily coexist.
Sam_Magura:
Exactly.
Jack_Herrington:
Oh yeah.
Tj_Vantoll:
Um, whereas like in some other cases, like we've had some people migrate JavaScript to TypeScript or. Angular to react or those
Sam_Magura:
Mmm,
Tj_Vantoll:
sorts of things.
Sam_Magura:
yikes.
Tj_Vantoll:
And those are things where they're solvable problems, but you have to get kind of creative in how you approach this. Whereas this, it's just like, I could totally see it being like a backlog item. If you're
Sam_Magura:
Mm-hmm.
Tj_Vantoll:
there, touch it. Probably at some point, once you get to a reasonable number, there probably will be some, put some intern on the last one, the
Sam_Magura:
Hahaha,
Tj_Vantoll:
last pass
Sam_Magura:
yeah.
Tj_Vantoll:
of getting rid of all of them.
Sam_Magura:
Yeah, it's a very easy migration. Yeah, I think JavaScript to TypeScript is hard, but it's not undoable because you can't have a mix. But when you said Angular to React, that sounds horrifying.
Jack_Herrington:
Yeah.
Tj_Vantoll:
Yeah, I'm trying to remember what episode it was, but we had somebody that they were using both for rendering on the same time on the same
Sam_Magura:
Wow.
Tj_Vantoll:
page and they had it working. So
Sam_Magura:
That
Tj_Vantoll:
you
Sam_Magura:
is
Tj_Vantoll:
can get...
Sam_Magura:
wild.
Tj_Vantoll:
yeah.
Jack_Herrington:
So I don't know if you guys have played around with Next.js or Keen at all in the new app directory. Yeah.
Sam_Magura:
I have,
Tj_Vantoll:
I have not
Sam_Magura:
yeah.
Tj_Vantoll:
yet.
Jack_Herrington:
Yeah. Yeah. So their default thing is, uh, module based CSS, right? That that's out of the box. And I think it was out of the box too, for the pages directory. I think that's always just been there. They're shtick, but emotion and CSS and JS just clearly don't work. And anything built on top of it. Don't work either. Um,
Sam_Magura:
Hmm.
Jack_Herrington:
In as you got to go, you got to switch it into the client mode, which is terrible. Even the, the, the, the CSS and JS extracted stuff, which I think is supposed to take away some of the performance issues that we're talking about, like. Vanilla extract. Um,
Sam_Magura:
Yeah,
Jack_Herrington:
that doesn't work either.
Sam_Magura:
even
Jack_Herrington:
So
Sam_Magura:
that doesn't work, wow.
Jack_Herrington:
yeah. I mean, I, I really tried, honestly, there's like a, some, some sort of it. When you get to vanilla extract, that's actually when you start getting into like the whole world of the. the SWC issues with the compiler.
Sam_Magura:
Mm-hmm. Oh, yeah.
Jack_Herrington:
Oh, it's a mess.
Sam_Magura:
Yeah, I really want to use SWC for everything, but then like you run into any library that needs some kind of compiler transform and it's
Jack_Herrington:
Oh
Sam_Magura:
back to Babel.
Jack_Herrington:
yeah. Yeah, exactly.
Sam_Magura:
Hehehehe
Tj_Vantoll:
All right, what is SWC? What am I missing here?
Jack_Herrington:
It's an alternative compiler. I mean, I think it's written in Rust. I
Sam_Magura:
Yeah,
Jack_Herrington:
want to
Sam_Magura:
it's
Jack_Herrington:
say
Sam_Magura:
rest.
Jack_Herrington:
that one. It's tough to know Rust or go nowadays,
Sam_Magura:
Hahaha
Jack_Herrington:
or, you know, which one's trying to eat the JavaScript ecosystem as a new whatever, but yeah, it basically it's a transpiler. I don't think it has type check. I don't think it does type checking, but it does type script, um,
Sam_Magura:
Correct.
Jack_Herrington:
you know, language removal and transpiling. Um, Yeah. And then there's also, yes, build is another one. I don't, I think
Sam_Magura:
Mm-hmm.
Jack_Herrington:
that's kind of falling to the wayside, but next, next picked that's a SWC and that's kind of given it a lot of impetus because
Tj_Vantoll:
Okay.
Jack_Herrington:
it's
Sam_Magura:
Yeah.
Jack_Herrington:
next. And anything next does ran.
Tj_Vantoll:
Well,
Sam_Magura:
Hehehe
Tj_Vantoll:
and then the, so then the server rendering part is that's because in, because it's server rendering the page, it can't like bake in the JavaScript handling of the styles more or less would be the reason why the CSS and JS
Sam_Magura:
Hmm.
Tj_Vantoll:
stuff doesn't work, or is it just that the next team has like chosen not to build in the integrations necessary to make it happen?
Jack_Herrington:
They actually have a documentation page specifically around this. I'm sorry to dominate the podcast. They have a documentation page around this for CSS and JS. And apparently the issue is that it is incompatible with React 18's concurrency mode.
Sam_Magura:
mmm
Jack_Herrington:
I mean, there's a whole thing around concurrency and it's no
Sam_Magura:
Yeah.
Jack_Herrington:
longer a mode and it's kind of weird, but whatever. It's incompatible with that and therefore it's incompatible with React Server Components and And there you go. And so CSS modules for everybody.
Sam_Magura:
I'm a bit surprised about the comment that it's not compatible with a React concurrent mode because Emotion should be compatible with that using use insertion effect, which is like a hook that they added specifically to make CSS and JS work in concurrent mode. But there's just a huge amount of complexity around server-side rendering with CSS and JS. So it's really not surprising to me that it doesn't work. I mean... Like back when I was trying to fix issues in the emotion project, we would just get issue after issue about SSR not working with different frameworks. So yeah, I have a feeling it would be a lot of work for the next JS team to get that working with the new app directory. And so probably just not worth the cost.
Jack_Herrington:
Yeah.
Tj_Vantoll:
So then the other thing you brought up is some of these, the compile time CSS and JavaScript
Sam_Magura:
Yeah.
Tj_Vantoll:
frameworks. So maybe Sam, you could explain like what those are, like what the difference in approach is and
Sam_Magura:
Yeah.
Tj_Vantoll:
maybe how they work.
Sam_Magura:
So, caveat or disclaimer, I haven't directly used any of these libraries, but compile time CSS and JS is like, basically you wanna write the same code that you were doing with emotion or style components, but instead of that being converted to plain CSS at runtime, we wanna do it at build time instead, so that the end user doesn't pay the performance cost. And so it sounds like a really good idea, better idea, but there's still some downsides to it, like going back to the box component where it takes in a prop called background color. If you're providing a different background color every time you use the box, there's no way to statically extract that style. Like it's just not known at compile time what the background color is. And so these compile time libraries, they're able to statically extract a lot of styles, In the case of like a style that is from a prop, they just have to, they basically would set background color equals variable background color in the CSS and then they would use an inline style to define a CSS variable that sets the background color. So they basically fall back to inline styles when they have to. So that's one of the problems. And then another one is you still have that issue of your inside. inserting new styles when a new component mounts, which invalidates that browser caching thing I talked about. So I think it's an improvement, but it still has some of the downsides of traditional runtime CSS and JS.
Tj_Vantoll:
Yeah, I feel like it's closer because that to me, this approach feels like it should be the holy grail because
Jack_Herrington:
Yeah, right?
Tj_Vantoll:
I kind of, I almost wonder if somebody will eventually nail this approach and that
Sam_Magura:
Mm-hmm.
Tj_Vantoll:
can get it to take off. Cause it seems me, me very naively looking at this problem. I feel like there should be some way where I can define my styles in my component and some magical tool will extract them,
Sam_Magura:
Hehehe
Tj_Vantoll:
place them into like some. global style sheet, but maintain this, like generate a dynamic name. So it's say it's like pseudo scoped and that those styles will be available for that component. And I don't, I don't know if you can solve the dynamic styling. That part
Sam_Magura:
Yeah.
Tj_Vantoll:
might be tricky, but it feels like even if you could just get static styles in a way where you could define them in the components, they get registered globally and I don't pay any of the runtime performance penalties that would be my sort of ideal. workflow
Sam_Magura:
Yeah.
Tj_Vantoll:
for working with this. And I don't know if we're quite there yet.
Sam_Magura:
I think some of those libraries are close to that. I don't know if I'll ever be able to reach exactly that ideal that you're speaking of.
Tj_Vantoll:
Yeah, because it has to almost like, you almost need like a next JS level tool that controls everything for you to
Sam_Magura:
Mm-hmm.
Tj_Vantoll:
kind of pull that off. Like sort of an isolated tool doesn't control enough, I feel like, to almost
Sam_Magura:
Yeah.
Tj_Vantoll:
be able to pull that off. It's tough.
Sam_Magura:
And there's, I think there's a lot of self-discipline required to stick to static styles that can be extracted
Tj_Vantoll:
Hehehe
Sam_Magura:
and not just use dynamic styles all over the place.
Tj_Vantoll:
Yeah.
Jack_Herrington:
Yeah, that's problematic. Because it's so
Sam_Magura:
Mm-hmm.
Jack_Herrington:
easy. You know, if
Sam_Magura:
Yeah.
Jack_Herrington:
you have those properties on it, it's just... You know. When it's this, make it roundy. When it's that,
Sam_Magura:
Yeah.
Jack_Herrington:
make it not roundy. It's just nice, you know.
Tj_Vantoll:
I don't know, like I feel like a tool could maybe enforce that. And I mean, inline styles exist for a reason. They're
Sam_Magura:
Yeah,
Tj_Vantoll:
not
Sam_Magura:
they
Tj_Vantoll:
like,
Sam_Magura:
do.
Tj_Vantoll:
they're not evil. I mean,
Jack_Herrington:
Hahaha
Tj_Vantoll:
there, if there's legitimate use cases of them where you might want to, to switch display on and off or
Sam_Magura:
Mm hmm.
Tj_Vantoll:
like things like that. So I,
Sam_Magura:
Yeah,
Tj_Vantoll:
I don't know.
Sam_Magura:
they're totally
Tj_Vantoll:
I still maintain
Sam_Magura:
valid.
Tj_Vantoll:
it's possible.
Sam_Magura:
They're use cases where, I mean, you definitely should be using inline styles. It's just like you never want inline styles to be the foundation of all of your styling for your whole app.
Tj_Vantoll:
Yeah, I do agree with that. Sam, another question for you. I'm curious, what made you want to write this up? Because I'll be honest, I thought this was a really excellent article. You've got like,
Sam_Magura:
Thank you.
Tj_Vantoll:
I don't know if you ever desire this, but you've got a future in like marketing or dev role because you got like a nice click baby title, nicely
Sam_Magura:
Ha
Tj_Vantoll:
organized.
Jack_Herrington:
Oh,
Sam_Magura:
ha ha ha!
Jack_Herrington:
nice. That's an art.
Tj_Vantoll:
It's like marketing, I know is an evil word, but you've got a talent for it. So I guess what made you want to sort of share and talk about this?
Sam_Magura:
Yeah, so, um... Really two main factors. I guess the smaller one is that, uh, My boss, Gordon at spot was like, Hey, this would be a good blog post. You should write this up and we'll post it on our blog. And, uh, we did actually get like a customer lead through someone who had
Tj_Vantoll:
nice.
Sam_Magura:
read the blog posts. So, but the bigger thing was like, I kind of felt like this was a big problem that no one was talking about. And. As someone who had like advocated a lot for CSS and JS in the past, I felt like someone needed to like, just not try to tear down this technology, but just inform people that if you use it this way, there is a significant runtime cost. And so I felt like I needed to tell people about that.
Tj_Vantoll:
It's, I'm sort of fascinated that no one had sort of wrote this story earlier. Cause I feel like, and even just take 30 seconds in the comments and you see people that are, um, chiming in with their own stories of this sort of thing.
Sam_Magura:
Mm-hmm.
Tj_Vantoll:
So it's, it's kind of interesting to me that, um, this hasn't come up before. Uh, and that
Sam_Magura:
Yeah,
Tj_Vantoll:
more people aren't,
Sam_Magura:
it was surprising.
Tj_Vantoll:
cause I mean, cause I mean, CSS and JavaScript has a huge number of users, right? It's a, it's. This is a general technology. It's fairly widespread and I'm positive. There are tons of big organizations that are relying on this now. So I'm just surprised that it has not come up.
Sam_Magura:
Yeah. And the thing is, even if you're not using it directly, you still might be using it because they're big component libraries like MUI is the
Jack_Herrington:
Yeah.
Sam_Magura:
one that comes to mind that
Jack_Herrington:
Yeah.
Sam_Magura:
it's all powered
Tj_Vantoll:
How?
Sam_Magura:
by style components or emotion. And I know there's other ones that are the same way.
Jack_Herrington:
Yeah, chakra, all of it.
Sam_Magura:
Yeah.
Jack_Herrington:
I mean, that was one of the reasons why I figured out that CSS and JS and emotion were the problem. You know, you try to bring up next JS 13 and you're like, great, this is awesome. React server components are great. Now I want to just use my material UI just because I'm,
Sam_Magura:
Hehehe
Jack_Herrington:
you know, it looks decent, whatever, and you bring that in and kaboom right away, and you just want to add
Sam_Magura:
Yep.
Jack_Herrington:
a button to a page. And it was a little scary too, because it's complaining about create context. I'm like, oh my God, does context not at all work? And that turned out to be kind of lark because it's actually just around this concurrency mode, blah, blah, blah. But it was scary.
Sam_Magura:
Yeah, that's definitely not a good like a first time using next 13 experience. I'm
Jack_Herrington:
Right?
Sam_Magura:
sure they would like to avoid that.
Tj_Vantoll:
I'm curious what you learned from the feedback you've gotten from this article because there are a whole lot of comments here and I know you've probably heard on social media and stuff about this. Like what's been
Sam_Magura:
Oh,
Tj_Vantoll:
the reception?
Sam_Magura:
yeah.
Tj_Vantoll:
I'm
Jack_Herrington:
Hehe.
Sam_Magura:
So
Tj_Vantoll:
sure there's been some. Yeah.
Sam_Magura:
I felt like the reception to this article is very positive. I've done articles in the past and kind of learned, don't say anything controversial unless you really can back it up because people will roast you on that thing that you said. And so I managed to stay fairly non-controversial on this post, except for one thing, which is I quoted, I'm going to mispronounce his name, Sebastian Mark badge, one of the like React team guys about the problems of CSS and JS in concurrent mode. And I unintentionally took that quote out of context and kind of
Jack_Herrington:
Uh
Sam_Magura:
misrepresented
Jack_Herrington:
oh.
Sam_Magura:
it. But it was such a subtle and like such a advanced thing that the only person who called me out on it was Dan Abramov. So
Jack_Herrington:
Oh shoot!
Tj_Vantoll:
Hehehehe
Sam_Magura:
Yeah, he tweeted about my article and I felt so nervous after that. I was like, oh my God, I got to race home and fix the thing in the article that's wrong. And he had just pointed out that I had described the problem without mentioning the solution that the React team had implemented for that problem. And yeah, so it's a bit nerve wracking, but also cool to have been noticed by the React guy.
Tj_Vantoll:
That is very fun. I think Dan is addicted to, it's amazing how many times I've seen him just nitpicking random React articles and it
Sam_Magura:
Haha
Tj_Vantoll:
just boggles my mind. He must have Google alerts for these things and sits
Sam_Magura:
Yeah.
Tj_Vantoll:
around and watches them like hawks. It's kind of fascinating.
Jack_Herrington:
I kind of get
Sam_Magura:
Mm-hmm.
Jack_Herrington:
where he's going though. I mean, in a way you kind of got to defend react and, and these things, sort of things can spin out of control. You know, like
Tj_Vantoll:
Yeah.
Jack_Herrington:
there's definitely a culture of, uh, you know, old wives tales when it comes to software engineering and web engineering in particular, like the whole, you know, you have to do SEO SSR to be good for SEO kind of old wives tale. And it's like,
Sam_Magura:
That's
Jack_Herrington:
that
Sam_Magura:
an
Jack_Herrington:
thing
Sam_Magura:
old
Jack_Herrington:
will
Sam_Magura:
wives
Jack_Herrington:
just.
Sam_Magura:
tale.
Jack_Herrington:
Yeah. Yeah.
Sam_Magura:
I always, I could never get a solid answer to that question,
Jack_Herrington:
No,
Sam_Magura:
whether.
Jack_Herrington:
no, Google for like a whole, like almost a decade now has been parsing client side, it's, it's fine. Um, but you know, I think, you know, there's an SEO community out there. That's not technical. It's more about like tagging and stuff. And they, they're basically thing is they just tell the engineers, Hey, we just need SSR. That's because that's what you've been told. Whatever.
Sam_Magura:
Hehehe
Jack_Herrington:
And the engineers like, I don't want to fight it. You know, SSR, um, you know, but yeah, so there's, there's, if you've let these things kind of get out. then people will start quoting it and quoting it and quoting it and quoting it and it just explodes. And so I can imagine why. I don't know what this particular thing was, but again, I can certainly see the end. I guess this is his job in a way.
Tj_Vantoll:
Well, I think that's kind of like the quirk about him that's made him who he is, is just his superhuman dedication and effort he puts into it.
Jack_Herrington:
You have to. I haven't, I was thinking about react. Isn't it like basically, I mean, it's the number one web platform outside of like jQuery, like
Sam_Magura:
Hehehe
Jack_Herrington:
in existence, like it's just, I mean, it's, it's a huge platform just like there's, there's millions and millions and millions of downloads.
Sam_Magura:
Yeah,
Jack_Herrington:
Yeah.
Sam_Magura:
yeah, way ahead of Angular review.
Jack_Herrington:
Oh yeah, yeah, it's crazy.
Sam_Magura:
Yeah, it's
Jack_Herrington:
Well.
Sam_Magura:
pretty remarkable that we, you know, programming languages like on the back end, we have so many competing technologies. It's like every company kind of uses a different language, but React is like kind of a unifying factor in that not everyone uses it. There are other popular frameworks, but it's really like dominating that market, so to speak.
Jack_Herrington:
Yeah, you don't see like Go and run, you know, like I, you know, this definitely like a whole culture out there of using Go as the new kind of Java to do like microservices and that stuff.
Sam_Magura:
Mm-hmm.
Jack_Herrington:
And a lot of examples you see, it's like React on top of Go. It's not like they've decided that, oh, we're going to create our new, you know, Go based web framework. No, no, no. We're not even going to try to compete with React on the front end. We're just going to grant them. you know, the web and we'll just be the beat, the folks in the back.
Sam_Magura:
Yeah, well, it's pretty challenging to compete with JavaScript in the browser. I mean, Microsoft is trying to do it with a C sharp and Blazor, which compiles your C sharp code to WebAssembly, but I
Jack_Herrington:
Yeah.
Sam_Magura:
think there are some pretty big downsides to that approach.
Jack_Herrington:
WebAssembly is certainly something to keep an eye on going forward.
Sam_Magura:
Yeah, definitely. It's exciting. I just haven't like yet seen like, oh, this is like the killer
Jack_Herrington:
But,
Sam_Magura:
app for web assembly.
Jack_Herrington:
killer app, yeah.
Sam_Magura:
Yeah.
Jack_Herrington:
Big time. Well, Sam, this has been awesome. Have we neglected to ask you any questions that you think we should have asked you during this?
Sam_Magura:
No, A plus for asking good questions. I
Jack_Herrington:
Hahaha!
Sam_Magura:
feel like you brought out my interesting opinions.
Tj_Vantoll:
Thanks for watching.
Jack_Herrington:
All right. Well, we try, we try. And now we get into a section that we like to call picks and we get to talk about ideas, topic or, sorry, let me, let
Sam_Magura:
Yeah.
Jack_Herrington:
me do a different second.
Sam_Magura:
Okay.
Jack_Herrington:
I kind of got off on it. And now we get into a segment called picks where we get to talk about kitchen utensils or shows are watching or.
Tj_Vantoll:
Woo!
Jack_Herrington:
Whatever. So TJ, when you start us off.
Tj_Vantoll:
Yeah, I'm going to pick the movie Megan, which is
Jack_Herrington:
Oh yeah!
Tj_Vantoll:
the like thriller horror movie about an AI doll that sort of goes on a rampage, more or less. It was pretty good. It wasn't amazing. I think what made the movie good was that it felt way too plausible, like the plot did.
Sam_Magura:
Wow.
Tj_Vantoll:
Especially with how much we talk AI on the show a lot or AI playing a bigger part of our lives that like movie, this movie hits a little closer to home than it would have even like two or three years ago. And I think that's the chilling part about it. But overall, it was pretty good. It's like an hour, hour and a half. It's very entertaining. So
Jack_Herrington:
much horror is in it? You know, my daughter is that's her name. And so we were like, Oh, we got to go see that, you know, and you know, she's older. So it's not a big deal. But my wife hates horror. Like, so is it horror horror? Like what, how, what's, what's
Tj_Vantoll:
So
Jack_Herrington:
the level?
Tj_Vantoll:
it's PG-13, so it's
Jack_Herrington:
Okay.
Tj_Vantoll:
pretty light. There's jump scares, but to keep a PG-13, they kind of have to cut away
Jack_Herrington:
Ha ha.
Tj_Vantoll:
at certain scenes. It's definitely not gory because they can't show much and keep the rating. So, I mean, I took one of my sons who's 12 to see it, and he did mostly okay. He had to cover his eyes a few times, but it's a pretty good intro to horror
Jack_Herrington:
There you go.
Tj_Vantoll:
if you have a kid that's around the teenager age.
Sam_Magura:
I saw the preview for that and so I'll say I'm quite surprised but pleasantly so that it turned out to be good. It looked kind of cheesy but I guess it didn't end up being that way.
Tj_Vantoll:
It's a little cheesy, but it's still, it's just enjoyable. It's fun to see.
Jack_Herrington:
And it's got that whole, the TikTok dance that everybody kinda,
Tj_Vantoll:
Yeah.
Sam_Magura:
Hahaha
Jack_Herrington:
you know, kinda
Tj_Vantoll:
Yeah.
Jack_Herrington:
do, you know, kinda thing. Cool, well, Sam, so you have a pick for us?
Sam_Magura:
Yeah. Um, so I'm actually from North Carolina, but I'm not in North Carolina right now. I am in winter park, Colorado. Uh,
Jack_Herrington:
Ooh!
Sam_Magura:
so I'm out here skiing for an entire month. And so my pick is definitely like skiing in Colorado.
Jack_Herrington:
You ain't gonna
Sam_Magura:
I,
Jack_Herrington:
die, man. Ha ha ha.
Sam_Magura:
yeah,
Tj_Vantoll:
Nice.
Sam_Magura:
for an entire month, I would, I would say people should not come to winter park, it's absolutely the worst resort. It's super crowded. It's just. everything about this place is bad. So you should go somewhere else where I'm not so that I can continue getting the short lift lines.
Tj_Vantoll:
Thanks.
Jack_Herrington:
Are you being
Sam_Magura:
I'm
Jack_Herrington:
like one
Sam_Magura:
totally
Jack_Herrington:
of those folks
Sam_Magura:
kidding.
Jack_Herrington:
who are being fictitious,
Sam_Magura:
It's,
Jack_Herrington:
like this is a
Sam_Magura:
yeah,
Jack_Herrington:
great place, you just
Sam_Magura:
it's
Jack_Herrington:
don't want
Sam_Magura:
a
Jack_Herrington:
to
Sam_Magura:
great
Jack_Herrington:
tell them.
Sam_Magura:
place. You know, there's just kind of a, I feel like it's a great place, but if too many people come to a great place, it becomes a little bit less great because it's just crowded and you're waiting in line for a long time. And so that's all I was getting at.
Tj_Vantoll:
Let's say hypothetically you're somebody who's very bad at skiing but still
Sam_Magura:
Hmm.
Tj_Vantoll:
enjoy doing it. Would I still be okay? Am I going to be intimidated off the lifts because I'm going to die going down
Sam_Magura:
Oh,
Tj_Vantoll:
these
Sam_Magura:
no,
Tj_Vantoll:
hills?
Sam_Magura:
no, no, no, it's, it's not that kind of place. I mean, they have some pretty gentle beginner terrain here, but they also have some terrifying expert terrain
Jack_Herrington:
Cool,
Sam_Magura:
that
Jack_Herrington:
what
Sam_Magura:
I watch my
Jack_Herrington:
is
Sam_Magura:
friend
Jack_Herrington:
Sam
Sam_Magura:
do.
Jack_Herrington:
Ski? Double black diamond?
Sam_Magura:
No, no, no, no. That's what I watched my friend do from the bottom yesterday.
Tj_Vantoll:
This is...
Sam_Magura:
So they actually have a blue-black rating here, which is pretty nice, like
Jack_Herrington:
Nice.
Sam_Magura:
an advanced intermediate slope. So I do those, and I do the single black diamonds. I don't know if I will attempt a double black. I like having my legs and knees intact.
Tj_Vantoll:
Yeah,
Jack_Herrington:
Right?
Sam_Magura:
So
Tj_Vantoll:
that's where I'm at.
Sam_Magura:
yeah.
Jack_Herrington:
This is what keeps me from skiing is, and at every age, I'm just
Sam_Magura:
Hehehe
Jack_Herrington:
like, this is cool, but I don't wanna die over this. Like,
Sam_Magura:
Yeah, I know.
Jack_Herrington:
you know.
Sam_Magura:
Like, I don't think I ever want to ski something where it's like, you might die if you fall. Like, that's just not worth it.
Tj_Vantoll:
It's one thing I learned with my kids that I feel like it helps a lot if you can learn it at a young age because
Sam_Magura:
Mm-hmm.
Jack_Herrington:
Yes.
Tj_Vantoll:
if you watch, my kids learned when they were like seven or eight and if you fall when you're seven or eight, it's no big deal. You get
Sam_Magura:
Yeah.
Tj_Vantoll:
right back up. Whereas I learned in my mid-30s and when I fell, I could get back up, but it take a second and I didn't fall lightly. So if
Sam_Magura:
Yeah,
Tj_Vantoll:
you...
Sam_Magura:
I know I'm kind of envious of people who have been doing it since they're like three, because I started at around 24. I'm 28 now, so like,
Tj_Vantoll:
Yep.
Sam_Magura:
you know, it still can bounce back up, but maybe don't learn as fast as a child would.
Tj_Vantoll:
Yes.
Jack_Herrington:
think you gotta be better, you know, live or be born in a mountain town.
Sam_Magura:
Yeah,
Jack_Herrington:
You know,
Sam_Magura:
which,
Jack_Herrington:
where you where
Sam_Magura:
you
Jack_Herrington:
you
Sam_Magura:
know...
Jack_Herrington:
get that for like, six months out of the year, you know, and
Sam_Magura:
Mm-hmm.
Jack_Herrington:
like, every like the local pizza place has like, you know, skis on the wall and blah, blah, blah, blah,
Tj_Vantoll:
Yeah.
Jack_Herrington:
you
Sam_Magura:
Yeah.
Jack_Herrington:
know, that kind of place and you know, and then if you live there, it's like, it's no big deal. All your buddies are up
Sam_Magura:
Exactly.
Jack_Herrington:
on the hill and
Sam_Magura:
Yeah.
Jack_Herrington:
all that, right. And so yeah, you learn when you're like to
Tj_Vantoll:
Yeah, I'm
Jack_Herrington:
Yeah.
Tj_Vantoll:
guessing
Sam_Magura:
Mm-hmm.
Tj_Vantoll:
there's not many slopes in North Carolina.
Sam_Magura:
There actually are, I believe,
Jack_Herrington:
Really?
Sam_Magura:
five resorts in North Carolina. Yeah,
Tj_Vantoll:
Is
Sam_Magura:
it's
Tj_Vantoll:
it like
Sam_Magura:
like
Tj_Vantoll:
on the Appalachian
Sam_Magura:
pretty.
Tj_Vantoll:
side of the
Sam_Magura:
Yeah,
Tj_Vantoll:
state
Sam_Magura:
exactly.
Tj_Vantoll:
or? Okay.
Sam_Magura:
The western side. Yeah, it's pretty much the farthest south you can ski on the East Coast. And so the conditions are not great. But if if you're just trying to learn, it's a good place to go.
Jack_Herrington:
Very cool. Well, thank you for that. My pick this week is going to be a show called Midnight Gospel on Netflix. It is the weirdest thing I've seen in a long time. It helps if you are in a significantly altered state when you watch it.
Tj_Vantoll:
Yeah.
Sam_Magura:
Hehehe
Jack_Herrington:
It is a weird combination of animation plus extreme violence plus long 25 minute rants on, you know, all kinds of metaphysics and this sort of stuff. It's like people talking about religion and philosophy, while at the same time killing zombies, and or something like that. And the first episode is great. I think it's got Dr. Drew in it. And he talks about, you know, various things. And it's at the main at the same time, he's like, killing zombies. And it's hilarious. And they kind of wind it in like So as opposed to a podcast, it's just the weirdest. Like I kinda, Netflix has this, you know, the quality is extremely variable kind of thing, right? But this one, I don't know who their target audience is. I don't even know how they got a green light for this thing. But the fact that it exists is hilarious. You know, it's like heavy metal. Like how did they ever, the movie, heavy metal. Like how did they ever get any money for that? But that it exists is awesome, you know? Whatever. It's great.
Tj_Vantoll:
Yeah, it's that looking just over the show and it is it is very unique looking. I could definitely say that.
Jack_Herrington:
That's a word for it.
Sam_Magura:
It is
Tj_Vantoll:
Yeah.
Jack_Herrington:
That's
Sam_Magura:
usually
Jack_Herrington:
definitely...
Sam_Magura:
not a compliment when someone says it.
Jack_Herrington:
yeah.
Sam_Magura:
Unique.
Tj_Vantoll:
But it can be, right?
Sam_Magura:
It
Tj_Vantoll:
Like
Sam_Magura:
can be.
Tj_Vantoll:
in a world where we have a million shows,
Jack_Herrington:
Right!
Tj_Vantoll:
that's
Sam_Magura:
If
Tj_Vantoll:
so.
Sam_Magura:
someone told me I was very unique, I would not take it. It's a good
Tj_Vantoll:
Okay.
Sam_Magura:
thing.
Jack_Herrington:
Okay.
Sam_Magura:
Might depend on how they said it.
Jack_Herrington:
Yeah,
Tj_Vantoll:
Yeah,
Jack_Herrington:
exactly.
Tj_Vantoll:
I think
Jack_Herrington:
Yeah.
Tj_Vantoll:
it depends on the context.
Jack_Herrington:
Yeah, it's like that Southern thing where they say, oh, you're so special. It's like,
Sam_Magura:
Hmm.
Jack_Herrington:
that's
Sam_Magura:
Yeah.
Jack_Herrington:
not,
Tj_Vantoll:
Mm.
Jack_Herrington:
you don't want to be special
Sam_Magura:
God bless you.
Jack_Herrington:
in this
Tj_Vantoll:
Hehehe
Jack_Herrington:
stuff. Yeah. Bless your heart.
Sam_Magura:
Yeah, yeah.
Jack_Herrington:
Yeah. All right. Well, this has been really fun, Sam. Thank you
Sam_Magura:
That's
Jack_Herrington:
for
Sam_Magura:
funny.
Jack_Herrington:
a deep education on CSS and JS and the issues thereof.
Sam_Magura:
Mm-hmm.
Jack_Herrington:
And
Sam_Magura:
Thanks
Jack_Herrington:
we will
Sam_Magura:
so
Jack_Herrington:
see
Sam_Magura:
much for
Jack_Herrington:
you.
Sam_Magura:
having me on.
Jack_Herrington:
Yeah, we'll see everybody on the next react roundup.
Tj_Vantoll:
Bye everybody.
Sam_Magura:
Bye.