[HN Gopher] Why I don't miss React: a story about using the plat... ___________________________________________________________________ Why I don't miss React: a story about using the platform Author : tomduncalf Score : 120 points Date : 2022-05-03 07:14 UTC (15 hours ago) (HTM) web link (www.jackfranklin.co.uk) (TXT) w3m dump (www.jackfranklin.co.uk) | [deleted] | apprewired wrote: | > In our case, we still felt this decision was justified because | we don't have to recreate a scheduler with all the complexity of | React's; we can build a small, self-contained implementation that | only implements what we need. | | I wish there were more details about this. Implementing a small | scheduler seems like a monumental task and I'd love to learn more | about how to implement a base-case. | ng12 wrote: | > But the web platform isn't perfect, and I suspect most React | developers have come across a situation where you'd love to be | able to just tweak how your component is being rendered. | | Honestly, I haven't. The only potential caveat I can think of is | when you have some non-reactive legacy code you want to embed | inside a React component... but even then React's escape hatches | are more than sufficient. | | If you're really worrying about when your component renders or | re-renders it's probably because there are other issues with your | app. | Tarks wrote: | The escape hatches were one of the first things I used to | explain why I initially liked react, called them exactly that | too. | | "They're smart enough to know they're not smart enough to build | perfect abstractions, so they do a great job but leave escape | hatches just in case" | Esther432q wrote: | nightski wrote: | The only case I have is I love to use D3 for vis. But the thing | is it's trivial to embed D3 into a react component and either | let react handle rendering via svg or honestly just let D3 take | over the DOM in that component. I do this all the time and it | works very well. | nawgz wrote: | I wrote my own React components using D3 to do the underlying | math but setting up my own DOM rendering. It's ok, my | thoughts | | Pros: | | * I have generic "zoom/pan" implemented. I did this by making | a generic ChartContainer with 5 zones - top, right, bottom, | left, content - and you specify just the size of the non- | content zones (if displaying them at all) and otherwise it | behaves responsively (i.e. CSS style on the container is | respected in the internal math). When you scroll the | left/content/right vertically, or the top/content/bottom | horizontally, it virtually scrolls the other components for | you. It also of course handles the math, each area of the 5 | is passed a DOMRect describing how big of SVG it can render | | * I have smart edge routing component on a graph; if you are | doing the math yourself on how to position the SVG elements, | you can easily describe that graph, so smart edge routing is | free | | * my library has themes via CSS vars, and the components | written in this way are obviously automatically themed | | Cons: | | * it's a bit verbose for sure, takes some small time and | focus. After the initial investment in ChartContainer though, | they work freaking awesome | | * D3 graphs often come with sweet animations and such, I | don't have any capability to emulate this today, I hate to do | performance-heavy things like manually doing math every frame | in a hooks-based way, and I don't want MobX in my component | library | | * you sort of lose access to the D3 ecosystem, nothing is | free | | To be honest, I think I have made a top-tier Gantt with the | smart edge routing and zoom, my Graph looks sharp too, and | for overhead views it's super nice to be able to zoom and pan | and show rulers on the side (imagine showing factory layout, | or a board layout, etc). Otherwise, if you are doing more | traditional pretty eye-catching stuff, it's not quite meant | for that approach | cyral wrote: | I also went this route and used d3 for the math but my own | hand-made SVGs for the rendering so that the DOM is all in | "react land". | | You may want to check out this library: | https://airbnb.io/visx/ They converted a ton of d3 features | into proper React components | whimsicalism wrote: | Does d3 have a typescript wrapper? | dmitriid wrote: | Everything on the web "uses the platform". There's no other way | to get content into the browser. | | Web Components are just a part of that platform, and very badly | designed at that. A lot of the platform around them now exists | only to patch holes in them (like form participation) and to | solve the problems they introduced. | | And since they are now a part of the platform, they poison | everything like upcoming CSS scoping which instead of being a | straightforward thing now has to account for all the web | component insanity. | | _Edit_. There also so many thing wrong in the article that argh. | | "We don't need React and dependencies"... and then talks about | lit-html which is a small framework with custom syntax and | constraints on how you can use tagged literals. | | "Easily replaceable dependencies"... and again talks about lit- | html which is a fully incompatible replacement for Polymer. I | wonder how folks that used polymer (Youtube) feel about "easy | replacements". | | "Can't control rendering with React" and talks about Web | Components which literally give you no control over when a | component can be rendered, don't have lazy loading, cannot | subclass SVG or embed partial SVG etc. | | And so on and so on... | [deleted] | daok wrote: | The rendering part resonate with me. I've tried in some side | projects SolidJS framework and I really enjoy that the rendering | of each component occurs once! Easier to not fall into some traps | that React has. | tentacleuno wrote: | > Easier to not fall into some traps that React has. | | Honestly once you get used to it, it becomes second nature... | For me at least. | | One piece of advice I would give is to not try to ram the hooks | use-case into things. It becomes especially annoying when | you're dealing with asynchronous values, where you need to deal | with 'null' and friends. Sometimes some imperative code in | useEffect is simpler to read and easier to maintain; it's fine | to step out of the paradigm for some things. | TAKEMYMONEY wrote: | > Was this slightly more work than using a library from npm? | | > I'd definitely recommend using a library for this, and we | settled on lit-html _(link to library from npm)_ | | This article is mostly about switching from React to Lit. You can | use modern web APIs (like FormData) _with_ React, FormData 's not | a replacement for state management. | | You can use Web Components _with_ React, the way Fluent UI does | (https://docs.microsoft.com/en-us/fluent-ui/web- | components/in...). | | In this single case they replaced a couple validation functions | with attributes. Good to move that direction but if that's all | you use React for then yeah, you might not miss it much. | Bellend wrote: | Anyone know what is going on with lit-? Their TypeScript | starter is painfully bloated and outdated and never seems to | keep pace. I actually ended up looking at microsoft/fast for my | use case but that seems to be stale in some way. | | I kind of feel that given the "simplicity" of a single class | wrapping custom elements, everything is pretty boring. | | Note: I cannot do better. | LAC-Tech wrote: | Can't speak for the Lit framework, but never had any issues | with lit-html or it's typescript defs, it's been rock solid. | claytongulick wrote: | I'm in the same boat. | | I don't use lit-element, it's too heavy for me. | | lit-html, on the other hand, is wonderful and rock solid. | | I typically do light dom components, rendered with lit- | html. Simple classes that extend HTMLElement. | | When I want reactive style, I add setters that call | render(). When I want imperative, I add class functions. | | All my components generally take care of themselves and are | mostly encapsulated, they'll generally have a init() method | that loads the data they need, and calls a setter which | kicks off the render cycle. | | Alternately, data will be passed from a parent component | via a property, and that'll also kick off the render cycle. | | In many cases I do a combination of the two in order to | support deep linking. | | I'll mix and match design systems sometimes, depending on | the payload weight. Ionic, shoelace, etc... | | The Vaadin router ties everything together beautifully. | | I also have a small state utility called | ApplicationState[1] that I use for the edge case of cross- | component communication and triggering. It provides a | graph-based approach to notifications/state change. | | I've been using this approach for several years with | success, with deeply complex and large applications and | small lightweight tiny footprint apps. | | [1] https://claytongulick.github.io/applicationstate/ | kall wrote: | I feel like google does web component frameworks like it does | messaging apps. Each new one is the silver bullet. I wouldn't | build on any google web framework personally, even if it | claims to be oh so simple and lightweight. | Bellend wrote: | I been looking since Polymer and appreciate the history | (polyfills, change of direction from other W3 holders etc). | I agree but Lit Element still seems a contender but also | seems that few people work on it. | | An example is that I have a basic scorebox. It's | essentially a div with custom styling, used across 100 | games, has language support, updates in real time and | everyone should be using it. | | npm install @mycompany/score-databox | | This is how you use it... this is how you integrate with | all games.... etc. It's so basic that it rarely changes. | The API is the same everywhere etc etc. | ummonk wrote: | It's bizarre to see the author waxing poetic about the small size | of lit-html when it's actually no smaller than Preact. | mappu wrote: | lit-html is great although at $DAYJOB we ran into some issues | with missing linting on them. | | We now use a JSX renderer that emits plain HTML strings. | | You get all the ergonomics, the IDE assistance of checking for | typos in your attributes, ensuring your closing tags line up, and | webpack can flatten it back to plain HTML at compile-time for no | run-time __jsx / React.createElement() calls. | _pdp_ wrote: | If all you need is a couple of basic forms and some basic | interaction, you can do it all with vanilla JS but let's not kid | ourselves. This will not allow you to build very rich apps | without implementing a significant chunk of the frameworks you | dislike so much. In fact, I would even say that if this is not a | core part of your product, you are simply wasting time and | resources. There is a huge amount of man-hours poured into making | these frameworks work correctly under any condition. | otikik wrote: | > of the frameworks you dislike so much | | This is totally uncalled for. He's not attacking you. He's | explaining a tradeoff, very reasonably. | | > I would even say that if this is not a core part of your | product, you are simply wasting time and resources. | | I find especially interesting that this phrase can be used to | defend _both_ sides of the argument. If you are building a | highly rich application, chances are that using a framework for | that is the right choice, agreed. | | But. | | Not all the apps being build out there need to be Very Rich | Apps. There's indeed a lot of space for only-slightly-rich-but- | mostly-static apps, despite the recent HN article. | | And for those, introducing a framework is ... precisely, a | waste of time and resources. | klodolph wrote: | > This is totally uncalled for. He's not attacking you. He's | explaining a tradeoff, very reasonably. | | What? I don't see how "dislike" would describe anything other | than some kind of preference. I don't see how it's an attack. | samhw wrote: | Their comment is perfectly reasonable and measured. I don't | think anything in it is 'uncalled for'. Your own comment is a | confusingly ironically ill-tempered response. | LAC-Tech wrote: | I think react sits really well with some people, and with | others it doesn't. For me I find I have to fight against the | platform to separate presentation from behaviour. And let's not | kid ourselves, a lot of react code bases do the classic | winforms mistake of having an essentially code behind | architecture. | datavirtue wrote: | And why was that a mistake? | [deleted] | interlocutor wrote: | React works well for simple, non-interactive components. Complex, | interactive components are going to have state. Stateful | components don't work so well in React. If you want to update | props in a stateful component, the recommendation is to replace | the component entirely by changing its key. At the point all of | the benefits of React (preservation of selection, caret position, | scroll position etc.) vanish. You might as well use vanilla js | instead of React. | | What does using Vanilla JS look like? Here's an example: | https://github.com/wisercoder/eureka It uses two tiny 500-line | libs. It uses TSX files, just like React. It has components, just | like React. It doesn't have incremental screen update, but | neither does React, if your components are interactive and | stateful. | kall wrote: | Wait isn't state the whole point of react? What level of | interactivity are you talking about? State and props, that's | it's thing: you can always update them. | | I've only need the "change key to flush components" trick very | few times, and most of those where rush fixes for bugs that had | a better "doing it right" fix at a different level. | Jcampuzano2 wrote: | This is categorically false. If you want to update props in a | stateful component it is exactly the same - just pass new | props. | | If you instead are talking about syncing props with state, | there are ways to do this as well without changing the key, but | this is considered an anti-pattern in the first place. | | This sounds more like bashing react without even knowing it | very well in the first place. | kikki wrote: | This is either a fundamental misunderstanding of React, or | you're actually talking about a different library. | | > React works well for simple, non-interactive components. | Complex, interactive components are going to have state. | Stateful components don't work so well in React | | React components are designed with state in mind. When state | changes, components passed that state in the form of props are | re-rendered. Don't take my word for it though, from the first | paragraph on the reactjs.org website; "React makes it painless | to create interactive UIs. Design simple views for each state | in your application, and React will efficiently update and | render just the right components when your data changes." | | > At the point all of the benefits of React (preservation of | selection, caret position, scroll position etc.) vanish. | | I have never heard these spouted as the benefits of React. The | main fundamental philosophy of React is that only components | that have state changing "react" to changes - in other words, | the benefits of React are: no unnecessary re-rendering (hence | the virtual DOM). | | > If you want to update props in a stateful component, the | recommendation is to replace the component entirely by changing | its key | | This part just threw me, if you are doing it this way - you are | doing it wrong. | tentacleuno wrote: | > Stateful components don't work so well in React. If you want | to update props in a stateful component, the recommendation is | to replace the component entirely by changing its key. | | Do you have any concrete examples for this? I'm not sure I | agree: I've made plenty of stateful components in React and | they are just fine. If anything, they're a lot cleaner than | what I could do in plain JavaScript, thanks to the framework. | | Further, could you expand on what you mean re: recommending | changing the key? I have never heard the React team suggesting | to do this, although maybe I missed something in the | documentation :-) | zelly wrote: | The problem with Web Components is it's slower than React or | other vDOM implementations. Also everything is a string. To re- | render, you have to manipulate the innerHTML--usually replacing | the string every update. To pass a prop to a component in a | modular way, you have to pass a string attribute (e.g. something | like <my-component my-attribute="[1,2,3]"/>). Even though v8 is | extremely fast at string operations, it's just not a good | practice and doesn't scale. | | W3C standardized Web Components before React existed and took | off, unfortunately. I expect the next standard to just be React | itself (or a barebones version that the library can build on top | of), patent licenses permitting. I'm pretty sure as a C++ | precompile, it would be unstoppable and end the debate for good. | brundolf wrote: | > Web Components is it's slower than React or other vDOM | implementations | | > To re-render, you have to manipulate the innerHTML--usually | replacing the string every update | | "Usually" is relative, I guess, but nothing's stopping you from | using the imperative DOM APIs to update the component's | contents; I daresay this would be the typical thing to do. | These APIs will be just as performant as anything else out | there. What you're really giving up, then, is the reactive | programming model. Web Components are just a way of | modularizing things; they have nothing to say about how you | update the DOM (for better and worse). | zelly wrote: | If you're using a framework like lit-html as the author | recommends, it will replace the string every update. Most | people will prefer that way since it's more ergonomic and | similar to React. You could do imperative DOM updates, but | that'd be like going back in time to jQuery. | brundolf wrote: | Right, all I'm saying is this is nothing intrinsic to the | Web Components standard like the parent comment suggested. | It's just one particular way you might use them. | LAC-Tech wrote: | Really enjoyed this article. Web components seem promising, I | played around with them a bit but I found it difficult dealing | with global styling (ie, how do I make my component have the same | colour scheme as everything else?). | | Probably worth looking into again. | | I also concur with the author about lit-html. It does one thing | and does it really well, easy to understand, and no transpiling | needed. Can't recommend it enough for generating dynamic html | client side. | claviska wrote: | If you're using a shadow root, look into CSS Custom Properties | which poke through it and the HTML part attribute as well as | its corresponding CSS :part() selector. | bobertlo wrote: | My ad for web components: btw I used to use react | [deleted] | lcnPylGDnU4H9OF wrote: | > Firstly, because some people on the internet like to get | angry over opinions that may not match their own, I want to | make clear what this blog post is not: | | > It is not a call for everyone to immediately drop React and | move to web components. | | > It is not a blog post declaring React "dead", or the wrong | choice for every project. | | > It is not a blog post declaring web components the best | solution to all projects. | | You might want to consider how well the phrase, "Haters gonna | hate," applies to your comment. | lozenge wrote: | The author makes some fair points but I also think part of it is | learning. It sounds like they had finished learning React and the | ecosystem and all that was left was finding React bugs, and | occasionally identifying ways to work around React's way of doing | things. While they are still at a stage of learning Web APIs | which means exciting discoveries. | v0idzer0 wrote: | Yeah agreed. The arc of learning seems to be... | | This is interesting -> this is the best thing in the world -> | here's how this could be better | | The "use the platform" people have been making this case for | web components for at least 5 years now. The reality is WC will | take off when and if they are a better alternative and even | then they'll need to be paired with some sort of framework. | They may even make their way into React one day. | | The only thing that bugs me about these takes is React is using | the platform. It works great in all major browsers, it's not | some extension like Flash. It's the platform. | LAC-Tech wrote: | React very much feels like its own platform to me - having | its own browser tools to debug it is a dead giveaway. | kall wrote: | The section about trusting dependencies, the scenario where they | go away, version churn etc doesn't resonate with me in regards to | react. | | I don't know any project in JS-land that is more serious about | semver, backwards compatibility and reliable upgrades than react. | If facebook dropped the project tomorrow, Vercel alone could | probably continue to maintain it well. | mathgladiator wrote: | I'm moving towards vanilla JavaScript for my platform, and one of | the things that I've discovered is that if you have a reactive | data source then you don't need a lot of framework. Granted, I'm | taking advantage that the core platform is much more stable than | a decade ago. | throwaway894345 wrote: | What is a reactive data source? | mathgladiator wrote: | A data source that you subscribe to and get a stream of | updates. I'm building https://www.adama-platform.com/ | bern4444 wrote: | I imagine a webhook source could be a reactive data source or | any stream based API | sibit wrote: | To me a reactive data source would be something like Asana, | Trello, Teamwork or on an ecommerce site it could be the cart | widget. Basically any type of data that needs to react | without requiring a page reload or any data source that needs | to sync with another users inputs in real time. | zelly wrote: | RxJS aka the reason so many websites take 100MB of memory | nowadays | | Don't use it | rglover wrote: | Come on over rovers: https://github.com/cheatcode/joystick. | | I promise you'll love it if you're switching from React (pure | HTML, CSS, and JavaScript w/ minimal abstraction). And it's full- | stack so no more stitching together frankenstacks. Good ol' | isomorphic JS for devs who value their time/productivity. | andrewstuart wrote: | There's pointers here to interesting new things which I'll have | to learn more about. | | One of the core values for React for me is simply code structure | - organising things into a hierarchy of elements seems to make | sense - I found that hard to replicate when I once tried to build | a vanilla js application. | k__ wrote: | Aren't web components more of an addition to frameworks like | Bootstrap than a React replacement? | zelly wrote: | Correct. The best use case for Web Components is to ship a | bloat-free, reusable widget that doesn't care whether a | consumer uses it with React, Vue, vanilla JS, Angular, etc. | Bellend wrote: | I don't think so. I want to wrap webgl games with a custom | component, and they share basic UI (which are also custom | component dependencies). But none of this has anything to do | with the larger web application (Angular) which manages much | much more. | | So stuck with iframes which although I can hide to some extent, | are terrible. | k__ wrote: | But React does much much less than Angular. | Bellend wrote: | I am not meaning it like that sorry that I did not explain | well. There is a place for frameworks, and there is a place | for "wrapping" non framework projects as a consumable. I am | stuck here. I just meant that any framework or not is | optional. React, Angular, Vue, Svelte or my funny.html | should be able to use my "bundle" with options because the | "bundle" doesn't care. That is where Custom Elements shine. | It's just that from my perspective, Angular is the | interface to the project. | rexpop wrote: | It seems that the author switched from Facebook's React to [his | employer] Google's [Lit](lit.dev), and subsequently wrote a blog | post in praise of _the hand that feeds_. | | > Replacing lit-html would be an undertaking but much less so | than replacing React: it's used in our codebase purely for having | our components (re)-render HTML. | | That's high praise. I might take a second look at Lit and style | it facilitates. ___________________________________________________________________ (page generated 2022-05-03 23:00 UTC)