News for hackers. Stuff that matters.
Re:Making Sense of React Server Components by paulddraper on Wednesday September 06, 2023 @02:01PM (#37408692)
> The function useEffect has so many caveats and such a terrible API.

Really? What caveats?

The only maybe oddity that I can think of is that if the deps array is omitted it always runs.

What API would you prefer? Something more like signals?

Re:Making Sense of React Server Components by SinParadise on Wednesday September 06, 2023 @02:10PM (#37408813)
Not useEffect specifically, but wiring something very stateful like a map library into the React rendering paradigm while keeping the state management in React via useState etc. can be very difficult to do so in a performant way.

I recalling using a lot of useRef to manually tune when to re-render, and in an ideal world I shouldn't be this granular about it.

You can certainly use one of the many React map wrapper libraries to lessen the pain, the pain is still very real, just dealt with by someone else.

Re:Making Sense of React Server Components by nwienert on Wednesday September 06, 2023 @02:23PM (#37409034)
But what’s better? In the end you need control over stuff, it’s almost like people want frontend to be magically easy but unfortunately there’s just the reality that either you have high abstraction but less control, or low abstraction and more control (more code, more gotchas, etc) until you get a smart optimizing compiler ofc.

Hooks imo are great, as they are pretty explicit and low level.

Nowadays signals are the new kid on the block, though mobx and similar have existed since forever in react land, but they have their own crazy edge cases like reactive loops and implicit behavior.

Re:Making Sense of React Server Components by SinParadise on Wednesday September 06, 2023 @10:47PM (#37414142)
I like Svelte. It embraces the fact that UI is stateful and doesn't try to pretend it isn't.
Re:Making Sense of React Server Components by nwienert on Wednesday September 06, 2023 @11:24PM (#37414392)
I do too, I made this [0] 3 years before Svelte existed. But I don't think the "pretend it isn't" makes any sense, I actually like React more than Svelte for many reasons, but magic compilers and templates are two big ones.

[0] https://www.youtube.com/watch?v=HHTYHm6qLFY&t=11s

Re:Making Sense of React Server Components by SinParadise on Thursday September 07, 2023 @11:51AM (#37420795)
Thats a cool project.

>But I don't think the "pretend it isn't" makes any sense

Well, let me expand a bit more. React's pitch is that view is a function of state, and essentially designed around the idea of an immutable state which re-renders everything when changed. It then offered some APIs to allow fine-tuning of rendering via hooks which either ties with data changes or some rendering life-cycle. To me the API screams of stubborn refusal to let go of the "view as a function of state" mantra: When you encounter a scenario where it breaks the mantra, lets add another lever to handle it. This lever also has to be pulled by you the developer, and it is up to you to know when to do it.

>I actually like React more than Svelte for many reasons, but magic compilers and templates are two big ones.

I don't really have an issue with compilers. They are the accepted magic that bridges between language for people and language for machines. The ideal language might be something that is functional and immutable language that it is easy for us to read, but compiles to the optimized, imperative updates that machine can run well.

I'd probably like React better if it had a compile layer on top of its more functional parts?

As for templates, JSX is probably the one great thing that came out of React. It is no wonder that many other frameworks are embracing JSX, but none of them are really forking the idea of hooks.

Re:Making Sense of React Server Components by nwienert on Friday September 08, 2023 @02:24PM (#37437383)
I don't think React ever pitched view as a function of state actually. Many in the community latched onto that, and some React-inspired projects tried to make that a thing, but I'm positive that was never the pitch from the core team, in fact very certain of this.

Lifecycles existed since the first version, and they were always absolutely critical. Hooks just fixed many of their issues and made them more elegant, composable, and simple to write.

Re:Making Sense of React Server Components by SinParadise on Saturday September 09, 2023 @11:54AM (#37446787)
>I don't think React ever pitched view as a function of state actually. Many in the community latched onto that, and some React-inspired projects tried to make that a thing, but I'm positive that was never the pitch from the core team, in fact very certain of this.

If it quacks like a duck..

Re:Making Sense of React Server Components by paulddraper on Wednesday September 06, 2023 @02:24PM (#37409057)
> and in an ideal world I shouldn't be this granular about it

Hm, could you give an example of this ideal performant state management world? Angular? Vue? Svelte? MobX?

Re:Making Sense of React Server Components by keb_ on Wednesday September 06, 2023 @03:01PM (#37409561)
Svelte is a good example. But you don't have to go that far; Solid and Preact have signals with auto-tracked dependencies.

As another commenter mentioned, yes it's less low level than managing your own dependencies, but then again, most React apps are already wrapped in layers and layers of abstractions/context providers/selectors and use Jest as their test runner (which injects the global namespace with functions) and does other black magic and weird metaprogramming, so I think most React devs are already OK with less lower level stuff.

Re:Making Sense of React Server Components by paulddraper on Wednesday September 06, 2023 @04:06PM (#37410561)
I'm a bit surprised the poster was asking for something more magic not less.
Re:Making Sense of React Server Components by SinParadise on Wednesday September 06, 2023 @10:53PM (#37414196)
I mean, I am OK with magic, but it has to remain magical to me. The moment I have to deal with the magic, I don't want it anymore.
Re:Making Sense of React Server Components by keb_ on Wednesday September 06, 2023 @02:27PM (#37409094)
The dependency array is a huge footgun. Engineers, experienced and newbie alike, get it wrong all the time (either causing infinite render loops, or skipping necessary re-renders). This affects useCallback and useMemo as well. After a while, I stopped thinking "oh the developers just aren't doing it right" and more "the React team can do better than this."

> What API would you prefer? Something more like signals?

Yes. Or full tree redraws like Mithril.js did 8 years ago.

Re:Making Sense of React Server Components by paulddraper on Wednesday September 06, 2023 @02:32PM (#37409150)
React does full tree redraws (well, unless you use memo).

useEffect is for side-effects.

Re:Making Sense of React Server Components by keb_ on Wednesday September 06, 2023 @02:36PM (#37409197)
It does not. Child components will only render when their parent component re-renders or for example, its state changes.

Either way, this is different than what I mean with Mithril.js (it does full tree re-renders on event handler calls or when a manual redraw function is called).

Re:Making Sense of React Server Components by Izkata on Wednesday September 06, 2023 @03:05PM (#37409610)
Class components have "shouldComponentUpdate()" that avoids this entirely.
Re:Making Sense of React Server Components by tshaddox on Wednesday September 06, 2023 @03:38PM (#37410121)
Or you installed the lint rule once 4 years ago and never had a problem again.
Re:Making Sense of React Server Components by gyanreyer on Wednesday September 06, 2023 @03:57PM (#37410418)
Agreed, everyone who complains about dependency arrays almost certainly hasn't used the linting rule. That being said, I'm not sure that an API is well-designed if the only way to use it effectively is by forcing you to even know there is an eslint plugin to begin with, and then once you do know that, that means now you're being forced to add eslint to your project whether you like it or not. And sometimes eslint just stops working for who knows what reason, I have a developer on my team who's constantly dealing with issues where his eslint/prettier setup isn't running correctly.
Re:Making Sense of React Server Components by tshaddox on Wednesday September 06, 2023 @04:14PM (#37410665)
> That being said, I'm not sure that an API is well-designed if the only way to use it effectively is by forcing you to even know there is an eslint plugin to begin with

I don't really agree with this except to the extent that, sure, it would be ideal for all APIs and indeed the entire syntax of your programming language to be so well-designed that you don't need any lint rules to catch common mistakes. I'd love it if my static type checker could catch most mistakes like this (although the boundary between linting and static type checking is fuzzy).

But in practice, you're almost certainly going to either 1) have a linter or 2) have strong resolve that you will not make any easy mistakes that a linter could catch. And if you're in the second boat, it doesn't make sense to single out this particular easy mistake, given that omitting arguments is always an easy mistake to make in JavaScript.

Re:Making Sense of React Server Components by keb_ on Wednesday September 06, 2023 @04:16PM (#37410689)
> Agreed, everyone who complains about dependency arrays almost certainly hasn't used the linting rule.

Which linting rule?

> That being said, I'm not sure that an API is well-designed if the only way to use it effectively is by forcing you to even know there is an eslint plugin to begin with, and then once you do know that, that means now you're being forced to add eslint to your project whether you like it or not. And sometimes eslint just stops working for who knows what reason, I have a developer on my team who's constantly dealing with issues where his eslint/prettier setup isn't running correctly.

Yes, not to mention eslint is slow with large codebases. Fingers crossed for the Rust(?) rewrite.

Re:Making Sense of React Server Components by gyanreyer on Wednesday September 06, 2023 @04:30PM (#37410869)
The linting plugin is eslint-plugin-react-hooks[0], which enforces React's "rules of hooks"; it can detect when you access a value inside a React hook and will warn you that you should add it to your dependency array. It enforces some other rules here and there but that's the big one worth caring about the most. I would consider it essential for working with React hooks.

The only downside is that sometimes, the rule can end up being overly aggressive and tell you to add things which you explicitly don't want in your dependency array, but it's helpful probably 95+% of the time and not hard to opt out of or work around as needed.

[0] https://www.npmjs.com/package/eslint-plugin-react-hooks

Re:Making Sense of React Server Components by keb_ on Wednesday September 06, 2023 @04:34PM (#37410918)
Ok, these are the linting rules I was thinking of when I mentioned this in the other comment: https://news.ycombinator.com/item?id=37410666

As you already mentioned, it's not a silver bullet.

Re:Making Sense of React Server Components by keb_ on Wednesday September 06, 2023 @04:14PM (#37410666)
Can you be more specific which linting rule you're talking about or the sake of readers who may be unaware, and perhaps mention how this completely solves this problem? Because 1. a linting rule does not absolve this from being a footgun and 2. if you're talking about 'exhaustive-deps' there are many cases where following the linter here has caused infinite render loops among newbies across multiple teams I've worked with. Also see this highly contentious thread: https://github.com/facebook/create-react-app/issues/6880
Re:Making Sense of React Server Components by Jcampuzano2 on Wednesday September 06, 2023 @04:39PM (#37410983)
The number of times I still see people not follow the lint rule even when it is installed, or use things like eslint-disable because its not always intuitive how to get around certain scenarios kind of rules this point moot.

In my opinion if people have the rule installed and still feel the need to disable it then it shows there may be an issue with the API itself. This is coming as someone who has written React for a living since before even ES6 classes were supported.

I see it relatively often, including in production codebases where people just disable the rule because they don't know how to write the sometimes non-intuitive way to get around it.

Re:Making Sense of React Server Components by cjcenizal on Wednesday September 06, 2023 @02:06PM (#37408759)
This page[0] lists many situations in which useEffect shouldn’t be used. Some might seem counter-intuitive.

[0] https://react.dev/learn/you-might-not-need-an-effect

Re:Making Sense of React Server Components by consilient on Wednesday September 06, 2023 @02:15PM (#37408891)
That's not a bunch of separate caveats, it's a few principles illustrated with lots of examples.

- Don't use effects for things that aren't genuinely effectful

- Put finnicky state management stuff in reusable utils instead of re-implementing it from primitives over and over again.

Neither is React-specific.

Re:Making Sense of React Server Components by paulddraper on Wednesday September 06, 2023 @02:26PM (#37409080)
tl;dr Don't use useEffect if there is an alternative.

That's a bunch of examples where there are good alternatives.

Re:Making Sense of React Server Components by Scarblac on Wednesday September 06, 2023 @04:06PM (#37410568)
In particular that it's OK to directly call setState inside functional components was a surprise to me (when I read that some months ago), it does make things simpler.
Re:Making Sense of React Server Components by foota on Wednesday September 06, 2023 @02:21PM (#37409001)
Personally, I grew to prefer signals and rx and APIs for heavy things. I wish it were easier to hook up some custom class object to a component to use as state, but it always feels clunky.
Re:Making Sense of React Server Components by danielvaughn on Wednesday September 06, 2023 @02:45PM (#37409308)
This may be a personal thing, but I really like reading and writing code that feels like it's telling a story. That is, operating sequentially (this happens, then this happens, then this other thing, etc).

useEffect breaks the sequential nature of your code and makes it feel like you're reading a script from a Quentin Tarantino movie.

Re:Making Sense of React Server Components by littlecranky67 on Wednesday September 06, 2023 @03:08PM (#37409662)
Agreed, but non-sequential execution is the nature of event-driven, async non-blocking code. Event-driven as Web Applications (not Websites!) mostly deal with events (user input or network events). As long as the JavaScript VM and the DOM uses non-blocking async models no framework - being it Vue, Angular, React or whatnot - will ever change that.

Sequential, blocking modells like i.e. batch ETL jobs are just not the domain of the browser.

Re:Making Sense of React Server Components by SahAssar on Thursday September 07, 2023 @07:49AM (#37417575)
> As long as the JavaScript VM and the DOM uses non-blocking async models

The DOM is almost entirely sync, all the operations on it are blocking operations (including things like replacing an entire document with innerHTML).

Re:Making Sense of React Server Components by littlecranky67 on Friday September 08, 2023 @02:51AM (#37430337)
While not strictly on "the DOM", a lot of modern APIs are within the browser's JS VM (Notification, Camera, Audio, QR scanning, etc.) and all of them are async to the core. My argument therefore stands.
Re:Making Sense of React Server Components by SahAssar on Monday September 11, 2023 @02:37PM (#37471646)
It does not, since most of those APIs are not directly called from the framework. What react and most other JS frameworks do is DOM modification (which is clearly sync) and delegate events (which is usually done via callbacks or binding).
Re:Making Sense of React Server Components by paulddraper on Wednesday September 06, 2023 @04:05PM (#37410546)
THAT'S THE BEAUTY OF IT!

Thing about async/await.

  const a = await doThing();
  const b = await doOtherThing();
The order of the written code and the order of the executed codes are two different things. Being able to write code in proximate/logical order is a enormous relief, even if things don't actually happen like that.

Same with hooks.

Re:Making Sense of React Server Components by danielvaughn on Wednesday September 06, 2023 @04:20PM (#37410727)
To be fair I wasn't very clear, but what I meant was like this:

  function SomeComponent({ someProp }) {
    function doStuff() {
      // do stuff
    }

    useEffect(doStuff, [someProp])
  }
This trivial example is easy to read, but as more state and effects get added to a component, it quickly becomes fairly cumbersome to figure out the exact order in which your code runs.
Re:Making Sense of React Server Components by c-hendricks on Thursday September 07, 2023 @08:43AM (#37418087)
They're side effects, by the very nature of them, if you're putting them in your code you shouldn't care which order they run.
Re:Making Sense of React Server Components by Izkata on Wednesday September 06, 2023 @03:03PM (#37409591)
It does a shallow compare, not a deep compare. Workarounds tend to involve additional hooks: https://dev.to/vsramalwan/ways-to-handle-deep-object-compari...
Re:Making Sense of React Server Components by vlod on Wednesday September 06, 2023 @04:06PM (#37410563)
I heard that immutability libraries like immer.js [0] help with this. Anyone go this way and had good success? Is this 'the way'?

[0]: https://immerjs.github.io/immer/