News for hackers. Stuff that matters.
Re:Astro 1.0 – a web framework for building fast, content-fo... by tshaddox on Tuesday August 09, 2022 @07:46PM (#32406160)
Nothing about the developer experience of React seems better than any old HTML template language (and hardly better even than plain HTML), if you're not doing any interactivity and are just going to render once and spit out the HTML.
Re:Astro 1.0 – a web framework for building fast, content-fo... by cercatrova on Tuesday August 09, 2022 @07:49PM (#32406190)
Have you used React before? It's miles above HTML templating. I honestly don't use frameworks that have regular templating anymore, like Vue or Svelte.
Re:Astro 1.0 – a web framework for building fast, content-fo... by tshaddox on Tuesday August 09, 2022 @08:54PM (#32406658)
I have used React. I'm a huge fan and I also prefer it over its most common "competitors" like Vue and Svelte.

But React (like Vue and Svelte) are fundamentally about interactivity. If I had a project where I knew for sure that I only wanted to generate HTML sans JS on the server (or with a static build process) I wouldn't even consider using React.

It barely even makes sense. Your "React components" would just be JavaScript functions that take props and return some JSX. None of the interesting React features and hooks would even make sense, other than maybe context (and presumably most or all popular static HTML templating tools have comparable features).

Re:Astro 1.0 – a web framework for building fast, content-fo... by munbun on Wednesday August 10, 2022 @09:48AM (#32411862)
JSX is much easier to maintain than pretty much every other templating language.

If you are building a growing design system with any degree of complexity, React is one of the best tools available.

Re:Astro 1.0 – a web framework for building fast, content-fo... by dsego on Wednesday August 10, 2022 @06:37AM (#32409920)
Which looks nicer? Eta vs JSX

   <%~ includeFile('./navbar', { pages: [
     'home',
     'about',
     'users'
   ] }) %>

   <navbar pages={['home', 'about', 'users']} />


> would just be JavaScript functions that take props and return some JSX

They can also be async functions that process data independently. Whereas templates are commonly just passed in data from the controller.

https://github.com/dsego/ssr-playground/#jsx-partials

Re:Astro 1.0 – a web framework for building fast, content-fo... by acdha on Tuesday August 09, 2022 @08:20PM (#32406418)
Yes. JSX is nice for escaping by default but encourages total spaghetti coding hiding app logic in the templates and various footguns like non-standard attributes className and breaking id. Running it on the server side mitigates the React performance hit somewhat but the selling point is interactivity.
Re:Astro 1.0 – a web framework for building fast, content-fo... by alanwreath on Tuesday August 09, 2022 @08:30PM (#32406502)
What are you referring to? I am unaware of what “regular” templating you’re referring to or what react is achieving that is not available or cumbersome under react or svelte.

I mean if JSX is considered as something particularly powerful (not saying it does) doesn’t Vue actually do that https://vuejs.org/guide/extras/render-function.html ?

Re:Astro 1.0 – a web framework for building fast, content-fo... by zdragnar on Tuesday August 09, 2022 @09:52PM (#32407053)
Think of JSX as a macro, rather than "regular" templating, which is typically string substitution.

For static sites, this means that you get functions and objects the entire way through the render pipeline right up until there is a full tree built and the final output is rendered.

You still get all the separation powers of contexts, the component based reusability, etc, and it is all regular JavaScript / typescript except for the JSX macro itself and React's APIs (which are just JavaScript). Conversely, with templating engines like handlebars / erb / et al you need to learn the specific DSL of the template engine- custom loops and controls, imports for partials, and your custom helpers are limited to what they can do. Even Vue's render function has special markup for control (v-if, v-else).

Re:Astro 1.0 – a web framework for building fast, content-fo... by ricardobeat on Wednesday August 10, 2022 @12:53AM (#32407968)
Some day we have to stop repeating this nonsense. JSX requires much more learning than simple templating, there is no inherent benefit. Even a simple conditional is more complex than your average template.
Re:Astro 1.0 – a web framework for building fast, content-fo... by zdragnar on Wednesday August 10, 2022 @01:09PM (#32415341)
How so? Any expression is valid within JSX- ternaries, function calls, binary and unary operators are all valid. If you know JavaScript, you already know all of the control mechanisms that are valid.
Re:Astro 1.0 – a web framework for building fast, content-fo... by cercatrova on Wednesday August 10, 2022 @01:32AM (#32408099)
The thing is, if you know JS, then a conditional is JSX is the same as in JS. Contrast that with every new templating language under the sun which might have its own way of doing conditionals and loops and control flow. That to me is much more annoying.
Re:Astro 1.0 – a web framework for building fast, content-fo... by chrismorgan on Friday August 12, 2022 @01:33AM (#32435007)
This is a dubious claim, since JSX is limited to expressions. If you ask people for “a conditional in JS”, they’ll very probably go for `if (…) { … } else { … }` first, not `… ? … : …` (if you can even rewrite it as a ternary). Same deal with loops: you’re limited to expressions, so you can’t use the normal way of writing a loop (and this regularly leads to mild contortions as you deal with iterables of diverse types). Therefore I’d tend to (qualifiedly) describe JSX as doing its own thing too.
Re:Astro 1.0 – a web framework for building fast, content-fo... by zdragnar on Saturday August 13, 2022 @02:05AM (#32447340)
Plenty of people are taught that ternary operators are evil and should never be used.

Plenty of people were also taught that proper architecture involved an AbstractGetterVisitorFactoryFactory.

That doesn't make either of those things true.

As a side note, if you find yourself wanting a loop but using `map` isn't sufficient, you should probably be preparing the values ahead of time and still using map. It'll be more efficient, and the code easier to read.

Re:Astro 1.0 – a web framework for building fast, content-fo... by 9dev on Wednesday August 10, 2022 @05:52AM (#32409660)
But you’re aware JSX is just plain old PHP files, code intermingled with HTML? It’s the exact same thing, and it breeds the exact same bad behaviour.
Re:Astro 1.0 – a web framework for building fast, content-fo... by zdragnar on Wednesday August 10, 2022 @01:18PM (#32415463)
Separation of concerns is different from separation of languages.

PHP intermingled with HTML was bad because developers would do things like run database queries and other operations that caused side effects directly in the markup. Every templating system still has logic in it, and almost every templating system as a way to create custom helpers which are written in the host language.

Since API calls and calls to react's `setState` are asynchronous, and the rendering pipeline is synchronous, it is still obvious that you can't put code that makes an AJAX call in your html markup.

Re:Astro 1.0 – a web framework for building fast, content-fo... by 9dev on Thursday August 11, 2022 @08:26AM (#32424643)
JSX doesn't separate languages, you're mixing HTML with TypeScript. You can absolutely do database queries in your template. What is keeping you from doing `fetch('https://side-effect.ts').then(() => doSomethingHorrible())` in your template? Or invoking an `alert()`?
Re:Astro 1.0 – a web framework for building fast, content-fo... by zdragnar on Thursday August 11, 2022 @10:37AM (#32426360)
You can do those things, but you're not going to capture the effect that you want. Renders happen frequently, and the render process will complete before your `fetch` resolves. As for alert, the alert will pop up immediately before the render is applied to the DOM- and will likely pop up many times more than you thought it would, assuming you're popping it up based on some state variable.

In short, you can do those things maliciously, but if you do them naively it is immediately obvious when you run the code that it's not correct.

Compare that to the original analogy to mixing raw PHP and HTML templates. Since the rendering process is blocking, you can easily stuff form handling, remote API calls, and database calls in amongst your markup, and can make it "work" even if it's not clean.

Even Laravel's blade components let you write custom components and helpers in PHP which can do all of those things from the template- you just don't see the actual SQL mixed with the HTML in the same file. The problem is still there, just now it is harder to see.

Re:Astro 1.0 – a web framework for building fast, content-fo... by nsonha on Wednesday August 10, 2022 @09:32AM (#32411614)
> Nothing about the developer experience of React seems better than any old HTML template language

Is that a joke? You get autocomplete from typescript and props to be fully typed functions, or any kind of object for that matter. That compares to autocomplete that's just some ad-hoc, bug ridden tools that locks you into some IDE or editor, and who cares because all the attributes have the same type (string) anyway.