Web components are okay

278 points by keybits 9 months ago | 356 comments
  • jeswin 9 months ago
    I tried to understand the referenced article "Web Components Are Not the Future" - but found that there weren't many convincing arguments.

    The current state of Front-end frameworks is an absolute mess. Speaking for myself, I don't want to learn a complex framework. I don't want to learn magic that I don't understand without reading the documentation (useState, createSignal et al). Magic in frameworks is often a hack, unlike magic in libraries. The first library I used was Prototype. It felt like magic, and it truly was. And so was jQuery, and Backbone. I never had to guess what "useState" does behind the scenes.

    There are many things which don't carry over into Web Components from current JS frameworks. But if you start from Web Components (ignoring everything you know about frameworks), it suddenly becomes intuitive. And it brings in abilities which are missing otherwise, such as isolation via Shadow DOM. It grows on you.

    In my view the only thing we should retain from the React era is JSX (for many reasons, true type-safety, autocomplete etc). I wrote a library last week for using Web Components with JSX. No magic other than JSX. https://webjsx.org

    • crabmusket 9 months ago
      > I don't want to learn a complex framework. I don't want to learn magic that I don't understand without reading the documentation (useState, createSignal et al).

      I can't really parse this sentence. It seems to have a lot of ideas in it. Do you want to learn a framework at all, or have one that is so magical that it feels like it doesn't need to be learned? Do you want to read documentation or not? Do you think the problem with React is that its primitives are unsuited to the work you do in it? Or to the work anybody needs to do?

      I've spent most of my professional career in Vue, so I don't have a great perspective on the React ecosystem. But Vue feels like it must be included in your "complex framework" statement. I've definitely felt some pain from overuse of the framework, or poor understanding of various features, libraries, etc. The ecosystem around full-on SPAs is indeed complex. I'm just not sure what other systems would let me personally, and us broadly, manage a complex stateful client-side app.

      (This is entirely separate to overuse of SPAs for things that shouldn't be SPAs.)

      • eddd-ddde 9 months ago
        I think the point is that frameworks ' magic isn't 100% there yet. You eventually HAVE to dive deep and understand things about the implementation to understand how to use it.
        • AlexErrant 9 months ago
          Ryan builds out Solid's reactivity system (createSignal) from scratch in about 20 minutes, live, in this video https://youtu.be/N-Y32BqhoYQ?t=1100

          I haven't bothered fully grokking it because I've never had to understand the impl details. Solid gives me literal dom elements, and that's low-level enough for me.

          • ruszki 9 months ago
            I’ve never seen a framework or even languages into which I don’t need to dig deep from time to time. It seems to me an unachievable high bar.
          • hu3 9 months ago
            I'll try to give an example of "bad magic".

            Did you know React renders twice in developer mode to try to expose bugs with side effects?

            If this doesn't raise an eyebrow, I don't know what will.

            • jemmyw 9 months ago
              That seems like a pragmatic solution. The point of having a dev mode is to help development and catch mistakes. if(devMode) { rerender() } doesn't seem like magic. Though in general I really dislike the term magic for what is just code doing something.
              • Guillaume86 9 months ago
                Why do you care? Or are you just against the general idea of a framework having constaints that are a bit unusual for their language, like "components must be pure"?
                • kaba0 9 months ago
                  Why would that be bad magic? It’s a very clever way to expose stuff that is accidentally side effecting.
                  • c-hendricks 9 months ago
                    It doesn't though. StrictMode does, and that's optional.
                  • szundi 9 months ago
                    I think he was pretty clear that the "magic" in frameworks is not something you can easily understand, therefore have to guess how it really works. He doesn't like that.
                    • jemmyw 9 months ago
                      You don't need to guess. You can actually read the code! Not saying that you should straight away when learning, but later, when you're familiar with your framework, I think reading through the codebase and understanding it is good practice.
                    • redman25 9 months ago
                      I've found the Vue community to be a little better at managing complexity than the react community has mainly because Vue was originally touted as a solution to some of react's problems. People are more conscious of the tradeoffs.
                      • mpweiher 9 months ago
                        > Do you want to learn a framework at all, or have one that is so magical that it feels like it doesn't need to be learned?

                        My view is that the problem domain is not complex enough to warrant the complexity of our "solutions".

                        See also: https://www.youtube.com/watch?v=ubaX1Smg6pY

                        Is it really "Complex"? Or did we just make it "Complicated"?

                      • rty32 9 months ago
                        One aspect of this is how you think about UI. The underlying pattern of jQuery is fully side-effects -- you select an element and make some changes to it. Frameworks like React and Vue.js allows to create UI components whose states are completely determined by data, i.e. what the UI looks like is the value of a pure function, mathematically speaking. It also updates the UI with minimum DOM changes when the data changes. (Although you don't have to make them pure, and arguably you can achieve the same thing with jQuery.) Depending on where you are, it makes UI widgets much more readable and maintainable. These frameworks are innovative in terms of state management compared to "old approaches" (of course, with additional benefits like reusability etc)

                        Bear in mind that today's websites and web based desktop applications are much, much more complicated than two decades ago, and has a much higher requirement for scalability and maintainability. If you just want to create simple UI, indeed they may not be your best choice.

                        • jsyang00 9 months ago
                          You do not need to know how `useState` works to understand how to use it to write a React application, it is fairly intuitive to understand how to apply the pattern.

                          If I look at your library, it seems to me like it requires a much more complex mental model to begin to use.

                          Of course, it is better in theory for a developer to thoroughly understand the details of their framework, but empirically, React has been very successful in allowing people to build relatively sophisticated applications while understanding very little of the underlying model.

                          • InsideOutSanta 9 months ago
                            "You do not need to know how `useState` works"

                            I feel like you eventually do. The issue with React, at least in my experience, is that it's a type of abstraction that seems ill-suited for how the web works under the hood, so it's incredibly leaky. Everything seems to make sense initially, and you get along just fine, but then you run into an edge case, and there's an official workaround for the edge case, but then you run into edge cases for the workaround for the edge case, and suddenly, that's your whole life.

                            Before you know it, you really do have to know how things actually work under the hood.

                            • dartos 9 months ago
                              I thought pre-hooks react provided a really nice and simple abstraction over how the web works.

                              FRP is a nice fit for the kind of UI that makes the majority of the web.

                              Hooks ruined the framework imo. Confusing api (useState returning an array for example).

                              Having a class component with hooks for lifecycle behavior made perfect sense. Each component’s state being a field on those classes was easy to understand.

                              Hooks came out of left field and made everything more complex for the worse.

                              • djbusby 9 months ago
                                Seems like that happens with every frameworks I've ever used since 2000 (in Perl, PHP, Ruby, JS, etc). Every framework makes the easy things slightly easier, the boring stuff is included and you get to focus on the fun/hard part - and I think then, naturally, you bump into the edge. But! You get to that point faster. And then you have to know the guts to solve the issue the "framework" way or do some lower-level shit-hack.

                                I feel like it's just a natural law of any general purpose framework.

                                It made the first 80% of the job easy. Now you just have to finish the other 80%.

                              • recursive 9 months ago
                                This hasn't been my experience at all. The implementation details even leak into this crazy thing called "the rules of hooks". It looks like a function but it's actually this new thing called a hook. Which state will you get? That depends on whether the reconciler considers this invocation to be a mount or update. Getting the wrong one? Try restructuring your elements or adding or removing a "key" attribute.

                                People tolerate this because they learned it but I don't think there is anything essentially simple about it.

                                • phist_mcgee 9 months ago
                                  If you have an understanding of closures, hooks are quite intuitive.
                                • bakugo 9 months ago
                                  You don't need to understand how useState works if you're writing a page with a button that increments a number when pressed, from a beginner's tutorial.

                                  As soon as you work on any remotely complex codebase, you will run into problems that require a decent mental model of the underlying "magic" to properly understand and solve. "Building sophisticated applications while understanding very little of the underlying model" is how you end up with gigantic piles of unmaintainable spaghetti code full of awful hacks, which seems to be the standard for React applications.

                                  • lolinder 9 months ago
                                    Is this less true of Web Components?

                                    I've worked with a lot of different tech stacks over my career and every single one of them has required understanding the internals once you start using them seriously. I haven't found React to be substantially worse for that than any other tech stack I've used.

                                  • azangru 9 months ago
                                    While you do not need to understand how useState, or any other hooks work, you do need to know that this piece of code will behave differently from the rest of your javascript. Painfully, when the calling of (most of the) hooks is concerned, React takes away from the developer the ability to write conditional logic. This is both unintuitive and bonkers, and it requires the developer to come up with convoluted techniques for working around this limitation. This is part of what 'understanding of how hooks work' means.
                                    • jeswin 9 months ago
                                      > If I look at your library, it seems to me like it requires a much more complex mental model to begin to use.

                                      How so?

                                      It has two functions:

                                      (1) createElement(jsx): Allows you to use JSX to write HTML markup. Returns Virtual Nodes.

                                      (2) applyDiff(parent, vNodes): Merges Virtual Nodes created with JSX into the real DOM efficiently.

                                      This is all you need to know. I can keep it simple because I am not doing much in the library. I felt that if I stayed close to the standards, I wouldn't need to do much.

                                      • BoorishBears 9 months ago
                                        Maybe you have the luxury of users who want applications that have all the reactivity of a DMV form, but in my apps at some point I'll need the very simple priciple of "do something complex when this value changes" and reimplement useState/useEffect in an ad-hoc manner anyways.

                                        I'm more of a backend/embedded developer than a web developer and I still honestly don't get how people find useState/useEffect as intimidating as your comment makes them out to be.

                                      • _heimdall 9 months ago
                                        There are a lot of footguns in react if you don't know how use state works.

                                        If you don't know what triggers a re-render you can end up in a state where the data was changed but the UI didn't update, or where the data changed once and re-rendered multiple times.

                                        In my experience the issues are more noticeable with async state changes, like making network requests or state-driven animations.

                                        • bvrmn 9 months ago
                                          Aha-ha. Devs constantly try to use dynamic hooks. For example conditionally rendered component which allocates a hook. Yes, React would trigger a warning, that number of hooks was changed. But this implementation detail requires you to have at least a mental model of what hooks actually are to avoid gotchas.
                                        • EMM_386 9 months ago
                                          > The current state of Front-end frameworks is an absolute mess. Speaking for myself, I don't want to learn a complex framework.

                                          It's really not that hard. I was able to pick up Angular to a level where I could create complex sites with it, or submit acceptable PRs that involved in, in week or so.

                                          Granted, I am an experienced developer (C# since beta, HTML/JS/CSS from the start) but it seemed to just make sense quickly.

                                          So when I was asked by a company to replace their aging, complex portal to manage critical infrastructure, I chose Angular for the front end.

                                          That was smooth sailing. It was stable, performant, looked good and everyone was happy.

                                          People often avoid it because it has a "steep learning curve" but that mainly seems to come from developers who came into the industry knowing only JavaScript and maybe a little React. If you are more experienced, you can pick it up right away.

                                          And it helps, a lot, to use such frameworks on large complex sites. For various reasons.

                                          • jeswin 9 months ago
                                            It's a libraries vs frameworks thing. Libraries are relatively safer.

                                            Frameworks in C# are slightly better (compared to those on JS), because there are blessed Frameworks and most people are using them. In the JS world, you can see very popular frameworks (with millions of downloads) get abandoned. Not saying that all is well in the .Net world; desktop frameworks are an example. But overall it's a bit different because one company more or less controls it.

                                            • edwinjm 9 months ago
                                              To be productive in Angular, you also have to know RxJS, which comes with twenty or so functions you have to become familiar with and with some peculiarities like hot and cold observables. So, no, Angular is not easy to learn.
                                            • chmod775 9 months ago
                                              > I don't want to learn magic that I don't understand without reading the documentation (useState, createSignal et al).

                                              Really now. Most devs who think to themselves "man I wonder how useState works internally" will arrive at the logical and correct answer within seconds. It's not complicated or magic. There are bare-bones implementations of react hooks (-ish) with a couple hundred lines of code. Implementing a basic "useState" and "runFunctionComponent" is easier than most third-semester CS assignments.

                                              If that's the bar for magic, I'm surrounded by 20th level Warlocks coming up with new Eldritch Invocations for fun over breakfast.

                                              • spion 9 months ago
                                                > Implementing a basic "useState" and "runFunctionComponent" is easier than most third-semester CS assignments.

                                                I'm not sure it is. There is a global dispatcher that finds the right component state to use and increments a counter to ensure that the correct state "slot" for that component is used. There are also a bunch of mechanisms to prevent slot mismatches. I guess you could make a loose analogy with writing custom allocators, except instead of the binding knowing the address, the order of calling useState determines the address :) Really not that simple.

                                                • chmod775 9 months ago
                                                  > I'm not sure it is. There is a global dispatcher that finds the right component state to use and increments a counter to ensure that the correct state "slot" for that component is used.

                                                  Explicitly not part of that proposed task. We're talking about a basic hooks implementation with useState here, not how react deals with its tree of components.

                                                  For the sake of the task the signature of runFunctionComponent just needs to be

                                                      runFunctionComponent<P, R>(fc: (props: P) => R, props: P, hooks?: any[]): { hooks: any[], returnValue: R }
                                                  
                                                  or even dumbed down to

                                                      runWithHooks(runFC: () => void, hooks?: any[]): any[]
                                                  
                                                  where runFC would wrap the call to the function component to pass the appropriate props and store the return value, freeing students from thinking about that. Also specify the function doesn't need to be re-entrant.

                                                  In either case it won't need concern itself with what the component returns (children, whatever), matching children to tree nodes, or scheduling, at all. Would be nonsense to cram that logic in there anyhow.

                                                  What you were talking about would make a good later task: easy to get a basic implementation, but hard to get an implementation that isn't subtly wrong in some way. Plus you can slap on extra goals like supporting keys. Lots of room to score students beyond just pass/fail.

                                                • imtringued 9 months ago
                                                  >Most devs who think to themselves "man I wonder how useState works internally" will arrive at the logical and correct answer within seconds.

                                                  The answer is shockingly dumb. To be fair, I checked the code years ago, but basically almost every hook calls useReducer internally and useReducer uses an array stored in a global variable that is set before your component code gets called and the order of the hook calls determines which hook gets what useReducer state.

                                                  It's basically a giant kludge and the React developers and users pat themselves on the back how "functional" their components are, when in reality they are flinging global mutable state like crazy.

                                                  • chmod775 9 months ago
                                                    > It's basically a giant kludge and the React developers and users pat themselves on the back how "functional" their components are, when in reality they are flinging global mutable state like crazy.

                                                    This is true for literally every useful computer program ever. At some level it operates exclusively on global mutable state. Doesn't mean your high level programmer-facing interface has to look like that though.

                                                    • kaba0 9 months ago
                                                      Haskell compiles down to a C “subset” called C-, and flings mutable state and memory like crazy. That’s the whole point of encapsulation, if the abstraction is sound then it absolutely doesn’t matter that react uses global state — like how else would they do it with this user ergonomics? Using JS is a given.
                                                    • zelphirkalt 9 months ago
                                                      Hundreds of lines of code?? That sounds like way too much complication for something like that, tbh.
                                                      • kaba0 9 months ago
                                                        Heh? My smallest hobby project that is not a POC but actually is finished and is doing something is like 1000 lines long. There are very few stuff you can do with less than 100 lines.

                                                        (Just for completeness sake, Haskell and alia sometimes might get away with less lines, because they tend to be “wider”. Word-count is a better metric here)

                                                        • chmod775 9 months ago
                                                          If you want to be at least sort-of react hooks compatible, there's a bunch of hooks you need to implement.
                                                      • InsideOutSanta 9 months ago
                                                        I'm building my most recent project with web components + htmx, and it's mind-blowing how much better all of this feels to me than the typical React/Angular stack. I think there's a place for React and Angular and technologies like them, but 90% of the projects that currently use them would be better off with a much simpler stack.
                                                        • DimmieMan 9 months ago
                                                          I have a growing belief the advantage the advantage you're seeing is more HTML first *culture* rather than HTMX itself, I feel the same way using SvelteKit.

                                                          For example, you submit a form with a couple extra tags on a stock HTML form, do some processing server side and swap out the form (or redirect or whatever). No overriding the on submit callback, no having to wire up a validation hook, no having to think about where things are running.

                                                          React and angular have a very "let's solve this in JS" culture that creates ultimately unnecessary complexity demons for that 90%.

                                                          • LegionMammal978 9 months ago
                                                            On the other hand, I've recently been helping someone out with their messy SvelteKit website, and I've personally found the framework horrible to learn. The routing and rendering logic is all diced up between +layout.ts, +layout.svelte, +page.svelte, another +page.svelte, and a few other .ts and .svelte files scattered around lib/, to the point where I can hardly understand what data is going where, and which parts are rerendered when that data is modified. Also, prerendering has bitten me with odd discrepancies between localhost and production.

                                                            While this messy project likely isn't the best showcase of SvelteKit, I just haven't experienced its alleged simplicity: there are too many files with special roles, and too much magic transforming things behind the scenes. I'd take React over this any day, where the components form a simple tree, and the dependencies are (often painfully) explicit instead of being swept under the rug.

                                                            • troupo 9 months ago
                                                              > No overriding the on submit callback, no having to wire up a validation hook, no having to think about where things are running.

                                                              BTW, forms are broken in Web Components. From needing to wire them manually with Javascript via Form Data to custom submit buttons not working in forms (will be solved with another Javascript-only spec maybe in the next ten years)

                                                          • meiraleal 9 months ago
                                                            > In my view the only thing we should retain from the React era is JSX

                                                            honestly lit-html is much better and based on existing browser APIs. We should make it part of the webcomponents spec! Which is a work in progress:

                                                            https://github.com/WICG/webcomponents/issues/1069

                                                            • troupo 9 months ago
                                                              > lit-html is much better and based on existing browser APIs.

                                                              Ah yes. A new framework with its own custom DSL, its own custom hook, sorry, "directive" rules, it's own incompatible flavor of SSR is definitely the way to go, and whould be a part of the standard unlike Polymer before it which was also touted as the bee's knees.

                                                              > We should make it part of the webcomponents spec! Which is a work in progress:

                                                              Whatever the outcome of that discussion, it won't be lit.

                                                            • mock-possum 9 months ago
                                                              Have you tried the Lit library? Using lithtml to write web components based on Lit Component is DREAMY imo, if you’re into web components. It really reminds me of using jquery’s helper methods for ajax - like why wasn’t it just this way by default all along.
                                                              • jdmg94 9 months ago
                                                                I work with web components within a FAANG company, it was a huge mistake and everyone hates it. If your argument for web components is that they're "so intuitive you don't have to learn" then you're lying to yourself.
                                                                • rty32 9 months ago
                                                                  The comment could be so much more helpful if it just casually mentioned what people hate web components about. Sigh.
                                                                  • cy_hauser 9 months ago
                                                                    How about Lit? I'm just looking at frameworks, components, etc. I was thinking of Lit as simplified web components? Is that valid?
                                                                  • coffeefirst 9 months ago
                                                                    Yeah. I know React quite well, there are legitimate use cases where it shines, but...

                                                                    What we've lost is the ability to say "let's make a website today" and just start making UI without build tools or crazy install trees or massive libraries that need maintenance and security updates, and drop it on a server somewhere.

                                                                    I keep thinking I can have that back... ES6 imports are fully supported now, modern CSS is amazing, all we really need is an SSR/a11y-friendly way to do some kind of nestable HTML macro/component, and we can party like it's 2007 (but with grid, and import statements, and all the other new shiny objects).

                                                                    • lolinder 9 months ago
                                                                      As I'm thinking about this, the main thing that is left before I could imagine a build-free website/webapp is TypeScript support in the browser. Even just esbuild-style stripping of types would be enough, but I can't imagine bringing myself to write even a small amount of JavaScript without types any more.

                                                                      Even without that, a tiny system that just depends on tsc should be within reach at this point.

                                                                      • evilduck 9 months ago
                                                                        I wouldn’t personally make these tradeoffs but for the sake of argument if you're willing to write substantially more type info into JSDocs (AI tooling may alleviate this nowadays) you can retain most of the coverage and assurances without using anything Typescript adds to the syntax superset while still using it for type checking during development. Even without the type-heavy JSDocs you might be able to alter your coding style to lean into easing and increasing inference (more classes instead of types or interfaces) and get pretty far.

                                                                        Honestly though, I just never really run into use cases where I need to "make a page in a day" and where modern tooling gets in the way. I'm comfortable with create-react-app, NextJS, Gatsby, and a couple other things, I can definitely put a new static asset project from one of those on a VPS by shuffling files over scp in the timespan it takes to make a pot of coffee, and I would strongly prefer having those tools than trying to be "pure" for hand-wavy reasons and unproven benefit.

                                                                      • codethief 9 months ago
                                                                        > and we can party

                                                                        You go party but for a large team (or group of teams) I will still prefer the explicitness of data flow and the type safety that Angular/React/Vue/… give me.

                                                                        • stickfigure 9 months ago
                                                                          As soon as you said "SSR" you've brought in a complex build system and server infrastructure.

                                                                          But if you just want a simple web page with some javascript or even a react spa, it's not a whole lot of buttonclicks. Super easy to get deployed on something like cloudflare pages too. IMO it's easier today than it was back in the html forms era.

                                                                        • 8n4vidtmkvmk 9 months ago
                                                                          In my admittedly little experience with shadow DOM, it doesn't isolate as much as it claims. CSS variables pierce the boundary, so if your styles are built around that, you can still run into trouble.

                                                                          I just haven't seen any benefit whatsoever once you have CSS modules. And CSS layers help too.

                                                                          • peebeebee 9 months ago
                                                                            ShadowDOM, and by extension web components are great for providing an extended set of HTML ‘native’ components. Let’s say your company has multiple frontend SPAs with different technologies (angular, react, svelte,…) they could all use the same set of company custom components, like a custom datepicker, or fancy selectbox.
                                                                            • epolanski 9 months ago
                                                                              This is the promise, but my experience tells me that web components fall short of that goal.
                                                                            • epolanski 9 months ago
                                                                              This has been a major concern for me.

                                                                              We went for a web component because we needed the same functionality on different websites using different tools.

                                                                              Issue was that we authored the web component with tailwind and then deployed the web component on different websites, some having different versions of tailwind themselves. Even minor differences in hosts tailwind versions led to quite surprising results.

                                                                              What we did in the end is to write a tool that given the tailwind classes used in the webcomponent it would then rewrite the rules at the :root of the web component's own css.

                                                                              Another reason for unhappiness came from lack of isolation regarding the units that derive from the host's base font which forced us to work in pixels directly.

                                                                              All in all, while I understand some of the decisions that went into web components, I can't lie and say that I too have few reasons to not be fully on the web components train, they fall short of the promise of author once, use everywhere.

                                                                            • kccqzy 9 months ago
                                                                              For the specific point about useState, I agree about it being too magical. These days when I do write frontend code I use Reagent in Clojurescript. (I use Clojurescript partly for other reasons like its elegant syntax that's better than JSX, and built-in immutable data structures.) Its implementation of (r/atom) is a whole lot more intuitive: you can even think of it as a mutable pointer where the dereferences are tracked. On the other hand useState just feels like a hack for people who really want to avoid writing both classes and closures, and it is a roundabout way of doing things that could have been done in a much more standard and familiar way.
                                                                              • blovescoffee 9 months ago
                                                                                How does your library deal with state management and data flow? What primitives does your library offer for optimization?
                                                                                • wruza 9 months ago
                                                                                  How does a regular program deal with “state management” and “data flow”?

                                                                                  We all just programmed things for decades when web guys pop out with this “state management” pseudo-problem and started to invent thousands of pseudo-solutions for it.

                                                                                  And why do we need “optimization”? It’s a user interface, not an accounting software core. A user types a character, you update few divs content or way under a thousand of divs’ visibility. Which optimization does that need?

                                                                                  • blovescoffee 9 months ago
                                                                                    First "Web guys" is such a demeaning way about talking about real and serious engineers solving real and serious engineering problems. If you don't think frontend engineering solves serious problems, I don't think your opinions about it are serious.

                                                                                    All real world programs are stateful. You need some tooling and/or conventions to handle that in a clean way. I recommend this blog post about React Query that talks about some challenges and solutions on the frontend for state management: https://ui.dev/why-react-query

                                                                                    You're questioning the importance of optimization on a website for hackers/tinkerers/engineers?

                                                                                    You need optimization for page speed, SEO, animation, elegance, pushing the boundaries...

                                                                                    edit to address: "Which optimization does that need?"

                                                                                    Optimistic updates, debouncing, handling large responses, cache, etc. etc.

                                                                                    • papichulo2023 9 months ago
                                                                                      Old way was storing data in sessions or hidden html inputs. Both way worse than modern alternatives. You kinda sound like you have no idea what you are talking about. Having to render thousands of elements is not uncommon.
                                                                                  • qudat 9 months ago
                                                                                    JSX is the worst part of react so I find that to be a pretty wild take.
                                                                                    • postalrat 9 months ago
                                                                                      You honestly can't think of anything worse than JSX? JSX bothers you more than all the ways useEffect gets used or the restrictions for hooks.
                                                                                      • qudat 9 months ago
                                                                                        The use API is very simple; JSX is a bastardized version of html that is atrocious to read and write. Just imagine all the dev time spent dealing with jsx/tsx. From IDE support to babel, typescript, etc. it is a burden on the JS/Ts ecosystem and severely contributes to fatigue.

                                                                                        Yes. JSX is extremely complex to support and it is absolutely the worst part of react.

                                                                                      • imtringued 9 months ago
                                                                                        Hyperscript was a mistake.
                                                                                      • azangru 9 months ago
                                                                                        > In my view the only thing we should retain from the React era is JSX

                                                                                        How do you deal with the non-existing difference between attributes and properties in JSX? Is every attribute a property and vice versa? Do properties reflect back as attributes?

                                                                                        • edwinjm 9 months ago
                                                                                          In Lit, a web component framework, you can set properties with, for example, href=... and you can set attributes with .href=...

                                                                                          This can be taken over to JSX.

                                                                                          • azangru 9 months ago
                                                                                            > In Lit, a web component framework, you can set properties with, for example, href=... and you can set attributes with .href=...

                                                                                            Only it's the other way around.

                                                                                          • nsonha 9 months ago
                                                                                            jsx is just a syntax to construct elements with attributes. You can still add properties like you do in a web component. In React you mostly never deal with instances (and properties) but that doesn't mean other ways to model components utilizing jsx cannot.
                                                                                            • azangru 9 months ago
                                                                                              Jsx uses properties, not attributes, while pretending that it uses attributes. Html attributes are strings, whereas jsx allows you to pass different data types to child components. Thus, properties. Which is also why is uses camel-cased names, or insists on className. Because these are the names of HTMLElement's properties.
                                                                                          • Narhem 9 months ago
                                                                                            If you use web components enough you realize why tools like useState exists then you have to bring in another library like alpine to offer the functionality.

                                                                                            The whole point of web components is the ability to offer class encapsulation within the browser without anything other than a file server.

                                                                                            JSX has much nicer syntax but I’d rather not have to deal with the overhead of launching a node server. Makes developing time quicker when working with smaller codebases.

                                                                                            • sandreas 9 months ago
                                                                                              Well, there is a project to convert react components to native ones[1]... this way you can write react and use it everywhere. I think this is the way to go, similar to svelte's approach. Write what you want but compile it to native standards.

                                                                                              1: https://github.com/bitovi/react-to-web-component

                                                                                              • wslh 9 months ago
                                                                                                > I don't want to learn a complex framework.

                                                                                                Completely agree. As a casual programmer, I just want something simple, inspired in VB6.

                                                                                                • jrochkind1 9 months ago
                                                                                                  You implied but didn't say explicitly, are you doing your front-end development with web components now personally?
                                                                                                • deliriumchn 9 months ago
                                                                                                  > I don't want to learn a complex framework. I don't want to learn magic that I don't understand without reading the documentation (useState, createSignal et al)

                                                                                                  I'm always suprised reading statements like that. No offence, but maybe you're in wrong career if you don't want to learn how most popular and important tools of today work... Not to mention that its so simple you can learn everything required to be efficient during lunch break

                                                                                                  • lelanthran 9 months ago
                                                                                                    > I'm always suprised reading statements like that. No offence, but maybe you're in wrong career if you don't want to learn how most popular and important tools of today work... Not to mention that its so simple you can learn everything required to be efficient during lunch break

                                                                                                    This is such a common comment that I am never surprised to see it pop up whenever the "front-end mess" discussion arises.

                                                                                                    No, you cannot learn React over a lunch break. You cannot learn Angular and Vue over a lunch break.

                                                                                                    I am skeptical that even you, personally, can learn just the footguns alone present in the hundreds of thousands of lines of code in a specific $FRAMEWORK over one lunch break, two lunch breaks or even a dozen lunch breaks.

                                                                                                    All those thousands of lines of code implement something, and I will wager a month of my income against a month of your income that you will not learn more than 3 or 4 concepts over a single lunch break, because they all have multiple concepts, multiple use-cases, multiple exceptions-to-the-general-rule and multiple footguns without even including the edge-cases they solve.

                                                                                                    You will spend several years of lunch breaks, unless you consider reading the wikipedia overview for each $FRAMEWORK to be "learning the $FRAMEWORK".

                                                                                                    Web components, OTOH, have less functionality than full-blow $FRAMEWORKS, but each can be individually learned over a lunch break, reused by non-JS-developers and is a knowledge base that is more or less future-proof.

                                                                                                    • watwut 9 months ago
                                                                                                      React is particularly easy to learn tho, much easier then angular.

                                                                                                      What you definitely can not learn over lunch breakis whatever local developers created as a local ad-hoc framework. Those area always more time consuming to work with, because you have no internet, stack overflow or documentation to help you.

                                                                                                  • gspencley 9 months ago
                                                                                                    > In my view the only thing we should retain from the React era is JSX (for many reasons, true type-safety, autocomplete etc)

                                                                                                    Warning: opinion incoming.

                                                                                                    JSX is one of two reasons that I never liked React at all and wish it would go away.

                                                                                                    I've been developing "web applications" since the latter half of the 90s. I've worked with everything from an in-house built dynamic template language (very similar to what PHP did in the early days) developed in C++ and served using CGI in Apache, to developing with PHP to Java Spring MVC to Django to modern frontend frameworks including both React and Angular.

                                                                                                    JSX reminds me of what PHP was like in the 90s and early 00s. People adopted it widely because the barrier to entry was extremely low. We had all of these static HTML websites and "developers" could just go in and start adding control flow to those documents in order to add dynamic functionality. It was easy ... and it quickly turned into a complete mess so big that PHP ended up with a reputation as being a toy language that "serious programmers" wouldn't be caught dead touching. That reputation was a bit unfair but also kind of earned.

                                                                                                    With the rise of PHP's popularity, the PHP "community" itself came to realize that they had a decent turing-complete programming language that they were working with, but that this idea of mixing business logic within HTML documents was a massive anti-pattern. It's ironic that what began its journey as a template language eventually realized that the best thing for the language was to stop using it as a template language, and to adopt different template languages such as Smarty in order to promote a separation of concerns between view / presentation concerns and business logic.

                                                                                                    React was never created as a "framework." There are actual frameworks that are starting to come out that use React for its view layer, such as NextJS, but React itself is just a library that allows you to create custom components and then choose your adventure when it comes to what other libraries you want to mix and match. But because people reach for React to start throwing together dynamic frontends quickly, everything is compononent-first. So it actively encourages you to put business and integration concerns in what really ought to be your view / presentation "layer."

                                                                                                    And JSX magnifies that problem by just being JavaScript. So, again, it's PHP all over again. You've got a very powerful turing-complete programming language that you intersperse with your markup and you get messes. Even in the most well-written, concern-separated React projects I still see a lot of "ugliness" that comes through with JSX.

                                                                                                    I did mention that it was one of two reasons I'm not a fan of React, the other is that - again because it was only conceived of as a component / view library - there is no inbuilt view encapsulation / scoped styles. This problem is somewhat mitigated by CSS modules these days. But view encapsulation is something that I've always seen as Angular's killer feature - the ability to just style your tags directly and create component markup that is completely devoid of class="" attributes. Angular and VueJS actually trained me to hate 99% of class="" attributes and to think of them as a type of code smell... just because it is possible to create higher-level components that don't have any at all but still styling when needed.

                                                                                                    • stickfigure 9 months ago
                                                                                                      Separating components is more important than separating presentation and business logic, and React/JSX excels at that. Old style MVC and templating frameworks that promised clean presentation/business separation ended up with two giant muddled piles of disorganized code. Components gave us a better organizational structure for complicated UIs, and that's why that form of separation won out.

                                                                                                      If you have nice clean modular components, it doesn't matter too much where the code vs template boundaries are inside. They shouldn't be so complex that it matters. This is why I like JSX - for any given component, everything is in one place.

                                                                                                      • gspencley 9 months ago
                                                                                                        > and that's why that form of separation won out.

                                                                                                        React won out because it has a low barrier to entry and is very unopinionated. That's not a bad thing. But don't pretend for a second that it won out as any kind of industry standard because it was technologically superior or was a better designed "framework" (again, it's not and never was a framework, it's a view library for creating components).

                                                                                                        There are 3 broad concerns when it comes to programming for the virtual machine that we call the web browser:

                                                                                                        - Semantic demarcation, which is what markup does: this is a paragraph, this is a header, this is card etc.

                                                                                                        - Visual decoration and styling, what CSS does. This is how a paragraph looks, this is how a card looks etc.

                                                                                                        - Interactivity and control flow: what JavaScript does. When the user clicks the button this is what happens.

                                                                                                        Those are all distinct responsibilities which the browser handles separately natively.

                                                                                                        We don't need to even start talking about MVC or OOP design patterns when talking about spearating your concerns. That's a basic engineering concept of isolating your moving parts to keep things simpler and allow you to change things in isolation without acccidentally breaking something else, which is the bane of software maintenance.

                                                                                                        The notion that diluting separation of concerns is a design innovation that makes software development and maintenance somehow easier is truly baffling.

                                                                                                      • imtringued 9 months ago
                                                                                                        Some of us need to get work done and not worry about the XSS potential that inline styles represent so we set our CSP to block all inline JavaScript and CSS.

                                                                                                        Btw I'm sorry if I misunderstood what you're trying to say, because you're mostly dissing the class attribute which I very much depend on purely to keep my websites secure.

                                                                                                        • gspencley 9 months ago
                                                                                                          Yup you misunderstood. I would be just as much opposed to inline styles as using class="" attributes.

                                                                                                          With frameworks like Angular, you can create a component and bind CSS styling to that component in a way that you can select just your HTML tags directly ... like style div {} instead of styling .my-card {} etc. And those styles are not "global", they are scoped to only those elements that are referenced in your component's markup.

                                                                                                          There are two ways that this can be implemented and frameworks often let you choose which one you want to employ: Shadow DOM or emulation. With emulation, the classes and selectors get generated for you at compile time so if you inspect the DOM you'll see tons of class="" attributes that were auto-generated ... but the developer never had to write them or think about them.

                                                                                                          The result is code that is so much nicer to read and work with.

                                                                                                      • dangsux 9 months ago
                                                                                                        [dead]
                                                                                                        • jaredklewis 9 months ago
                                                                                                          > I never had to guess what "useState" does behind the scenes.

                                                                                                          It's weird to me that React hooks are always dragged out in these arguments as some kind of bogeyman. If you understand the idea of a virtual DOM and a render loop, then it is only a tiny step from there to understand hooks. And you can understand all of these concepts in about 15 minutes: https://www.youtube.com/watch?v=1VVfMVQabx0

                                                                                                          I just don't get all the hand wringing regarding frontend frameworks. I've been using React since 2014 and in 10 years, there has been exactly one big change to the framework: hooks. When they came out, I spent 15 minutes to understand them. It didn't kill me.

                                                                                                          And React has been undisputed king the frontend frameworks hill for at least 9 years, but people still act like it's some sort of ever-changing, confusing landscape of options. If you want boring, stable front-end development, choose a super popular, well documented tool like React. Or if you don't like frameworks, use vanilla JS. It's not a crisis.

                                                                                                          • ForHackernews 9 months ago
                                                                                                            > If you understand the idea of a virtual DOM and a render loop, then it is only a tiny step from there to understand hooks

                                                                                                            Once you understand the arcana of the magisterium, it becomes obvious why the encyclicals must be unitarian!

                                                                                                            • edwinjm 9 months ago
                                                                                                              "This framework feels very natural to me" says person using the framework for ten years.
                                                                                                              • watwut 9 months ago
                                                                                                                I came back to react around a year ago, hooks were completely new to me and pretty instantly understandable. They are just not difficult to comprehend or use.
                                                                                                          • apitman 9 months ago
                                                                                                            I think part of the reason people talk past each other on this issue is because they're optimizing for different things. If you're working for a VC-backed startup with a central product that needs to move quickly and is going to require constant maintenance anyway, a framework might be a good fit for you.

                                                                                                            But I work in an academic lab. We don't have tons of money to maintain the apps that we've written. We need them to just keep working once funding has moved on to new projects.

                                                                                                            We're just finishing up a rewrite of an app from Vue to Web Components. It had dependency rotted to the point where we couldn't update anything because of dependency hell. Rather than spend hours trying to fix it, which we've done before and would have to do again until the end of time, I decided to experiment with Web Components. The experience was immediately so nice that we went all in. No regrets. We went from ~15 dependencies to ~1 (d3js).

                                                                                                            If you're curious to try the apps, old one[0] new one[1].

                                                                                                            [0]: https://bam.iobio.io/

                                                                                                            [1]: https://bam2.iobio.io/

                                                                                                            • Jcampuzano2 9 months ago
                                                                                                              Sometimes I don't understand this argument because theres nobody forcing you to always be on the latest version of a framework. You could have just stayed on the version of Vue you were using without issues. Unless theres some compelling reason you could use it into the end of time and be just fine.

                                                                                                              Thats not to say that maybe for your use case you could have not used it in the first place or that removing the dependency was a bad idea - just that if you do like Vue there doesn't seem to be anything forcing you to always be on the latest version.

                                                                                                              • Joeri 9 months ago
                                                                                                                A particular framework version usually depends on a particular version of build tools, and those are written to a particular release of an OS. When apple updates Xcode the compiled npm packages often have to update support as well, and the old versions of those packages start breaking on new OS releases. You can’t ship a web app that you can’t build.

                                                                                                                An often used hack is containerizing the dev setup to decouple from OS versions, but that comes with its own set of downsides.

                                                                                                                • WD-42 9 months ago
                                                                                                                  What happens when old versions stop receiving security updates?
                                                                                                                  • pilif 9 months ago
                                                                                                                    And not just that - also dependencies of dependencies.

                                                                                                                    You have $FRAMEWORK using $BUILD_SYSTEM and depending on $NODE_VERSION which is running on $OS_VERSION in $ARCHITECTURE.

                                                                                                                    Eventually, there will be a security flaw in $OS_VERSION which will force you do update the OS (which eventually will be a major OS update) and on which $NODE_VERSION might not run any more at which point you find out that $BUILD_SYSTEM doesn't run on newer node any more because it relied on a package that shipped some binary do do its thing and the source code of that binary doesn't compile on later GCC versions any more.

                                                                                                                    And now you're in deep-shit because of a very distant but yet super important security issue that brought your house of cards crumbling down.

                                                                                                                    This is not a theoretical issue either. I've seen this happen to applications with a JS frontend that was only as little as 5 years old. It was impossible to build any more and needed some serious changes because of underlying OS updates cascading up the stack.

                                                                                                                    The fewer dependencies you have and the smaller they are, the bigger is the chance that things keep running as you exchange parts of your stack when you're forced to and the bigger the chance that you will remember what you have to do to rebuild if disaster strikes.

                                                                                                                    I'm aware that for many people 5 years is a huge time span though and that you either start a new thing every year or two at which point none of this matters, or you're at the other extreme and run RHEL and are able to back-port security patches manually if the need arises at which point none of this matters either.

                                                                                                                    But if you're in the middle of the two extremes, then keeping up to date incrementally is super important and being able to do that quickly and easily is inversely proportional to the amount and size of dependencies.

                                                                                                                    • Jcampuzano2 9 months ago
                                                                                                                      Rarely do security issues come from directly as a result of your choice of frontend/client framework which should really only be in charge of displaying your data. Almost all issues should be handled by your backend.

                                                                                                                      Most cases where it becomes an issue is when people drop security best practices falsely believing their frontend/client validation is a security layer.

                                                                                                                      Anybody thinking updating your frontend solves your security issues has deeper problems.

                                                                                                                      • 9 months ago
                                                                                                                        • ImHereToVote 9 months ago
                                                                                                                          May God have mercy on your soul if you rely on your frontend for security. You might as well duct tape a shotgun to your scull.
                                                                                                                      • jitl 9 months ago
                                                                                                                        If you can rewrite to remove all dependencies except for d3js, why couldn’t you do the same thing, but also retain a dependency on Vue? What is it about Vue that requires the extra dependencies - is it built system things? (I’ve never used Vue)
                                                                                                                        • apitman 9 months ago
                                                                                                                          Vue itself must be updated. And if you throw out the router, Vuetify, state management, etc, what is it adding above Web Components anyway?
                                                                                                                          • haradion 9 months ago
                                                                                                                            Especially with Vue 3, most of the reactive state management you need for all but the largest and most complex of apps is built right into the core. Vuex and Pinia really aren't necessary for most users.
                                                                                                                            • athanagor2 9 months ago
                                                                                                                              As far as I know there's no simple and performant way to have the DOM be a function of the state with existing standards
                                                                                                                          • wg0 9 months ago
                                                                                                                            I'd argue that if you get the hang of it, development in Web components won't be slower than in any frameworks.

                                                                                                                            So I don't understand why VC ecosystem can't get by without frameworks.

                                                                                                                            • troupo 9 months ago
                                                                                                                              I doubt you're authoring all web components by hand. I doubt you're not using any external dependencies.
                                                                                                                              • apitman 9 months ago
                                                                                                                                We're not even using lit. Feel free to check out the code[0]. It's not the best (we're still learning web components) but it's working pretty well for us so far.

                                                                                                                                [0]: https://github.com/iobio/bam.iobio

                                                                                                                                • troupo 9 months ago
                                                                                                                                  Thanks! I'll take a look
                                                                                                                                • zelphirkalt 9 months ago
                                                                                                                                  It would be good to tell us, why you doubt the GP in that regard.
                                                                                                                                  • troupo 9 months ago
                                                                                                                                    Because authoring web components is pain.

                                                                                                                                    Because browser APIs and elements are quite limited so you're likely to pull in external deps tht provide better interfaces etc.

                                                                                                                              • mentalgear 9 months ago
                                                                                                                                One of the things I really appreciate about Svelte is its support for generating Web Components through the Custom Elements API. Since Svelte compiles down to plain JS/HTML/CSS, creating reusable components that work across any framework or vanilla JS becomes seamless. https://svelte.dev/docs/custom-elements-api
                                                                                                                              • MrThoughtful 9 months ago
                                                                                                                                I have been following the web components discussion for years now and just don't see what I can do with them that makes my life as a fullstack developer better.

                                                                                                                                All the examples I have seen use them to template some data into html. I can do that with handlebars already.

                                                                                                                                Am I missing someting?

                                                                                                                                • traverseda 9 months ago
                                                                                                                                  There are two models of the "web", where HTML is a document and where HTML is the scenegraph of a more complicated app.

                                                                                                                                  If you're using HTML as a document you can use web-components to include fancier interactive real-time feature

                                                                                                                                  * A terminal emulator web component that attaches to a websocket * A date picker web component, add features like checking if a date is already taken * Custom form elements in general, a search-box that takes a URL for auto-completion suggestions * A map, but not a full mapping application * A data table, like the jquery plugin of old * Lightweight interactivity like tab widgets * Basically any of the custom components that jquery-ui provided

                                                                                                                                  Yes you can do all of these without webcomponents, but the HTML is a lot cleaner and a lot more document like if it's a custom component. Mixing the model and scenegraph views of the web is not my favorite. It sure would be nice if there was a consistent library of web components available.

                                                                                                                                  You can actually do pretty decent live-chat with something like HTMX and server-sent-events, I think. But it's sort of a progressive-enhancement view of HTML as a document model.

                                                                                                                                  • tomxor 9 months ago
                                                                                                                                    Full native isolation. HTML, CSS, JS, the whole thing, no tricks, the browser isolates it for you. It's really nice to be able to make a web component, clearly define the JS, HTML and even CSS API in terms of variables, and then throw it into any environment without it breaking, or without creating a complex maze of CSS name spaces and framework dependencies.
                                                                                                                                    • MrThoughtful 9 months ago
                                                                                                                                      Is there really ever a use case for that?

                                                                                                                                      When do you want part of your page to have different fonts, colors, everything from the rest of the page?

                                                                                                                                      • skrebbel 9 months ago
                                                                                                                                        We ran into this too, and ended up not using the Shadow DOM at all. We want our stuff to automatically use the page's fonts, sizes, colors etc. Also we want customers to be able to customize stuff with CSS without having to use JS hacks to inject CSS into the shadow DOM (this gets especially cumbersome when you're nesting web components). Personally I feel like the shadow DOM is the most oversold part of web components, in that it's so all-or-nothing that it often creates more problems than it solves.
                                                                                                                                        • rty32 9 months ago
                                                                                                                                          It is not a choice in many situations. For a large company that has many different teams that own many different parts of a product, even though teams adhere to the same "UI standards", things get complicated quickly. For example, CSS classes that have name conflict can cause UI to break (which happens more often than you think, and strictly adhering to naming rules is just hard for humans). That's just one example. Custom elements with shadow DOM is a simple and straightforward solution to this, and it makes sense -- JavaScript code are scoped to modules and use imports/exports to define interfaces, and it is just natural to do that for UI instead of putting every class that other people don't care about in the global CSS space.
                                                                                                                                          • pradn 9 months ago
                                                                                                                                            The use-case for having isolated objects with parameters, much like classes in Java, is to be able to a) share code, b) hide internal details, and c) have object behavior be governed solely by a constrained set of inputs.

                                                                                                                                            So the point isn't to have your web component be different from the rest of the page. The point is that you can pass in parameters to make an off-the-shelf component look how you want. However, exactly how much freedom you want to give users is up to the component author. It is possible for there to be too little freedom, true.

                                                                                                                                            See here [1] for a concrete example of someone writing a reusable web component, and figuring out how to let users customize the styling.

                                                                                                                                            [1]: https://nolanlawson.com/2021/01/03/options-for-styling-web-c...

                                                                                                                                            • eyelidlessness 9 months ago
                                                                                                                                              In terms of style isolation, the answer is very much “it depends”. And it depends as much on the nature of what the component does, as the kind of isolation you want to achieve.

                                                                                                                                              - Namespace isolation. Example: you have different components in the same codebase or otherwise meant to work together; you may want assurance that a locally defined style attached to class “foo” doesn’t have unexpected effects on other components which happen to use the same class a different way. This is commonly achieved with build tooling, eg by mangling class names.

                                                                                                                                              - Cascade isolation. Example: you have an embeddable widget that you want to look consistent in any context, regardless of the styles of its parent DOM. This is achievable to some extent without custom elements, but they are a way to achieve it with confidence in a relatively straightforward way (at the expense of other limitations and complexity).

                                                                                                                                              • gedy 9 months ago
                                                                                                                                                This 100%. Web components get praised for this isolation - and it’s like the exact thing I do not want if I’m building an application. Like try to have a global CSS theme, or use bootstrap, etc. (Please don’t suggest I embed a link to global CSS in every component.)

                                                                                                                                                Like I get it if you’re sharing a component on different sites, like an embedded component or ad banner, etc. But it just gets in the way if you’re trying to do normal things that the majority of web apps need.

                                                                                                                                                • mixmastamyk 9 months ago
                                                                                                                                                  From reading the parent site the use cases seem to be large enterprise and cross site components, say a twitter embed or advertising bar.
                                                                                                                                                • SahAssar 9 months ago
                                                                                                                                                  Web components don't do any JS isolation, right? And when you say HTML isolation I think its probably important to say that any custom element registered is global, so if Web-Component-A uses Web-Component-B version 1 then Web-Component-C cant use Web-Component-B version 2 (unless Web-Component-B includes the version in its name).

                                                                                                                                                  If you want actual isolation of the whole web stack (HTML/CSS/JS) I don't think there are any alternatives to iframes.

                                                                                                                                                  • ThatMedicIsASpy 9 months ago
                                                                                                                                                    It is my personal nightmare. I want to write custom css to customize my Homeassistant. Only to find out every single thing is in a shadow root and I cannot write css to adress what I want to change. WHICH WOULD BE REALLY SIMPLE IF I CAN WRITE PLAIN OLD CSS.

                                                                                                                                                    I can't believe how extremely mad and frustraded I became when I found out - writing this out fills me with rage.

                                                                                                                                                  • deergomoo 9 months ago
                                                                                                                                                    They are very good for progressive enhancement, for example you could have a web component that wraps a <table> to add fancy features like filtering or drag-and-drop reordering. If JS is disabled or fails to load, the user just gets a plain table, but they still get the content. When this stuff was new, that was much better for the user than what would happen with a front-end framework (they would get a white page), but now server-side rendering is widely available in those frameworks it’s less of a selling point.

                                                                                                                                                    They are also good for style encapsulation, i.e. you could drop someone else’s component in your page and not worry about it affecting or being affected by your CSS. Anecdotally I feel like that is less of a common desire now than it was ~10 years ago, with the rise of both “headless” UI libraries (behaviour without dictating appearance) and the prevalence of scoped styles in front-end frameworks.

                                                                                                                                                    What does annoy me about the standard is that to use slots you must opt into the shadow DOM, which means that if you’re trying to create reusable components for your own stuff, you can’t style them just by dropping a stylesheet into the page. I’m sure there’s a technical reason why this is the case, but annoying nonetheless.

                                                                                                                                                  • jhp123 9 months ago
                                                                                                                                                    the examples probably avoid talking about the dynamic APIs because they are super ugly and very stateful. It's hard to say that Web Components are the future when your demo shows 200 lines of manual DOM reconciliation.
                                                                                                                                                    • j-krieger 9 months ago
                                                                                                                                                      I‘ve come to the same conclusion while using them pretty extensively. The idea is nice, but they are not there yet.
                                                                                                                                                      • microflash 9 months ago
                                                                                                                                                        Sure, there is some pain but after years of several Angular and a Vue migration, I'd say that pain is much less than the pain of framework migration. People often overlook the experience of a framework for a long term use.
                                                                                                                                                        • vinnymac 9 months ago
                                                                                                                                                          This could summarize every interaction I’ve had with Web Components since the beginning. Web Components are becoming the Nuclear Fusion of Web standards.
                                                                                                                                                      • skrebbel 9 months ago
                                                                                                                                                        Web Components let you use a UI component made in a different framework than yours. That's it. For most other purposes they're pretty awful.

                                                                                                                                                        Also they let you publish a UI component that works in every framework, without having to build 7 versions of it (or just exclude everyone who's not on React, or something like that)

                                                                                                                                                        • BostonFern 9 months ago
                                                                                                                                                          That’s also the conclusion I’ve drawn. This seems to be the reason Web Components exists.
                                                                                                                                                        • mejutoco 9 months ago
                                                                                                                                                          IMO the slots that allow a component to have children are the difference. You can compose indepent components that way. Also the styles are scoped to the component by default, and you can only break the scope with custom vars (css vars)
                                                                                                                                                          • Cthulhu_ 9 months ago
                                                                                                                                                            Web components are a standard and built into the browser, Handlebars is a separate library. Web components are a way to encapsulate and isolate structure (html), appearance (css) and behaviour (js) into components, extending HTML.

                                                                                                                                                            It's like jquery widgets but without dependencies.

                                                                                                                                                            • 9 months ago
                                                                                                                                                              • someothherguyy 9 months ago
                                                                                                                                                                Are you genuinely asking as a professional? Seems like a big ask for someone to go over all you are misunderstanding if you think they are equivalent to a template language.
                                                                                                                                                                • PaulHoule 9 months ago
                                                                                                                                                                  The standard, like PWA, is designed for maximum feasible misunderstanding. To the average dev it seems like a random bunch of features that don’t hang together. Five developers could look at it and be like the blind men discussing the elephant —- hung up on individual parts and not seeing the whole, if there is a whole.

                                                                                                                                                                  There are a lot of candidates for “what’s wrong with modern web standards” but this fragmentation, which comes from a rather mathematical view of programming, is one of them. Thing is, a lot of web devs never studied computer science (even CS 101) and less than 5% live in San Francisco.

                                                                                                                                                                  • Capricorn2481 9 months ago
                                                                                                                                                                    > and less than 5% live in San Francisco

                                                                                                                                                                    How will they ever understand web components.

                                                                                                                                                                  • tome 9 months ago
                                                                                                                                                                    On the other hand, if they're completely different from a template language it seems like it should be just a moments work to demonstrate why, and help a fellow professional understand what they're missing.
                                                                                                                                                                    • 9 months ago
                                                                                                                                                                      • EGreg 9 months ago
                                                                                                                                                                        Well um

                                                                                                                                                                        1) You dont have to load an external library

                                                                                                                                                                        2) Shadow DOM

                                                                                                                                                                        3) Dynamic slots

                                                                                                                                                                        That’s about it, honestly LOL.

                                                                                                                                                                        I guess the main point of most browser APIs was to let apps use browser features.

                                                                                                                                                                        This one actually tried to make a standard way for apps to use other apps. But they already had their own libraries so nyeh, thank you very much! LOL

                                                                                                                                                                      • 9 months ago
                                                                                                                                                                    • lapcat 9 months ago
                                                                                                                                                                      The worst part about web components and the shadow DOM is how they can prevent browser extensions from working correctly, or working at all.

                                                                                                                                                                      And the browser vendors aren't in a hurry to remedy this situation.

                                                                                                                                                                      • 0x1ceb00da 9 months ago
                                                                                                                                                                        This. User agent configurability is the killer feature of web.
                                                                                                                                                                      • claytongulick 9 months ago
                                                                                                                                                                        I think one of the biggest "mistakes" with web components was coupling them in people's mind with shadow dom.

                                                                                                                                                                        For app dev (not library dev) web components are a super lightweight easy option when you stick with the light dom.

                                                                                                                                                                        You can continue to use bootstrap or tailwind or whatever css thing you like, but get great functional encapsulation with near zero cost, especially if you use lit-html or something similar as a renderer.

                                                                                                                                                                        My teams have generally found working with native web components refreshing. It takes a dev coming from the framework world about a week to adjust, and then they never want to go back.

                                                                                                                                                                        Just using simple class properties and a manual call to a render function on set() gives you all the benefits of reactivity without all the hassle of frameworks.

                                                                                                                                                                        The problem most people have with getting started with WCs is that there's not much out there showing how do to it in "easy mode".

                                                                                                                                                                        Most of the getting started things throw you right into shadow dom, css parts, and all these really painful technologies that were primarily intended for use by library authors, not app devs.

                                                                                                                                                                        I've been building apps with native WCs for a long time now, I should get off my keister and write a guide on how to make your life easier with WCs, something like "The Good Parts".

                                                                                                                                                                        • nolanl 9 months ago
                                                                                                                                                                          I use shadow DOM every day, but yes, it is often the part of WCs that baffles people – probably because they don't need it.

                                                                                                                                                                          Alternative approaches that may work for your use case:

                                                                                                                                                                          - "HTML web components" [1] - light DOM only, SSR-first, good as a replacement for "jQuery sprinkles"

                                                                                                                                                                          - "Shadow gristle" [2] - use as little shadow DOM as possible. If you need styling or composition, put it in the light DOM!

                                                                                                                                                                          [1]: https://adactio.com/journal/20618

                                                                                                                                                                          [2]: https://glazkov.com/2023/03/02/shadow-gristle/

                                                                                                                                                                          • replete 9 months ago
                                                                                                                                                                            > I've been building apps with native WCs for a long time now, I should get off my keister and write a guide on how to make your life easier with WCs, something like "The Good Parts".

                                                                                                                                                                            If you consider writing about this I'd like to read it. Or listen! Do you have a blog? In the process of gathering various comments about this technology as it appears there are blessings and curses, depending on how you use it.

                                                                                                                                                                            • kolme 9 months ago
                                                                                                                                                                              In my last gig we had exactly the same stack (WC without the shadow dom part + just lit-html) and it's great.

                                                                                                                                                                              The best part is not having a dependency hell situation every other week.

                                                                                                                                                                              • meiraleal 9 months ago
                                                                                                                                                                                That's exactly it. We are just missing slots for lightDOM
                                                                                                                                                                              • webdevladder 9 months ago
                                                                                                                                                                                I think this minimizes the fact that interop - the main selling point to me as a user - comes at a performance cost where every component you use could have its own unnecessary runtime attached.[1] Using a framework like Lit with web components is the recommended way to use them.

                                                                                                                                                                                This cost will compound over time where new frameworks emerge, and components get stuck on older versions of their frameworks.

                                                                                                                                                                                I can't see this as anything but significant, and not to be minimized. Having multiple redundant libraries on a page is not the direction I would advise anyone to take, particularly not when baked into the accepted best practices. This bodes poorly in the long term.

                                                                                                                                                                                I've listened to the arguments from web component advocates in blog posts, social media, and videos for years now, and I should be in the target market. But on top of the interop tax, they're full of negatives that aren't present in the mainstream frameworks.

                                                                                                                                                                                Interop works great within each framework's ecosystem. The same dynamics that cause developers to seek interop cause them to huddle around a small number of mainstream frameworks. So we get a few vibrant ecosystems that push the state of the art together. Web components cannot keep up on the tech side of things, and introduce a ton of complexity to the web platform - ignorable to me as a dev, but not for browser implementers - in service of their early 2010s designs.

                                                                                                                                                                                [1] https://x.com/Rich_Harris/status/1840116730716119356

                                                                                                                                                                                • nolanl 9 months ago
                                                                                                                                                                                  I cover this in another post [1], but broadly:

                                                                                                                                                                                  - Not every web app is perf-sensitive to every extra kB (eCommerce is, productivity tools typically aren't)

                                                                                                                                                                                  - Plenty of frameworks have tiny runtimes, e.g. Svelte is 2.7kB [2]

                                                                                                                                                                                  - I wouldn't advocate for 100 different frameworks on the page, but let's say 5-6 would be fine IMO

                                                                                                                                                                                  No one is arguing that this is ideal, but sometimes this model can help, e.g. for gradual migrations or micro-frontends.

                                                                                                                                                                                  BTW React 17 actually introduced a feature where you could do exactly this: have multiple versions of React on the same page [3].

                                                                                                                                                                                  [1]: https://nolanlawson.com/2021/08/01/why-its-okay-for-web-comp...

                                                                                                                                                                                  [2]: https://bundlephobia.com/package/svelte@4.2.19

                                                                                                                                                                                  [3]: https://legacy.reactjs.org/blog/2020/10/20/react-v17.html

                                                                                                                                                                                  • afavour 9 months ago
                                                                                                                                                                                    While this is true I think the multiple libraries problem is a rounding error when you look at the majority of web apps created today. React and react-dom combined are over 100KB. Svelte and Lit are in the single digits. So you could embed a lot of frameworks before you get close to the bloat people use every single day without even thinking about it.
                                                                                                                                                                                    • webdevladder 9 months ago
                                                                                                                                                                                      As a Svelte user this argument rings hollow. You can't judge frontend by React and the way it's badly used.
                                                                                                                                                                                      • afavour 9 months ago
                                                                                                                                                                                        > You can't judge frontend by React and the way it's badly used.

                                                                                                                                                                                        IMO you can because it’s the vast majority of webapp usage today. I’m also a heavy Svelte user and I love it but front end web dev is practically a React monoculture so it makes sense to think about it when evaluating options.

                                                                                                                                                                                        I’m not saying it isn’t a problem inherent in web components, it is. But using it as a reason to not adopt web components runs contrary to the logic the vast majority of the industry currently uses. Perfect as the enemy of good and all that.

                                                                                                                                                                                        • azemetre 9 months ago
                                                                                                                                                                                          You absolutely can judge tools by how they are used, especially if said tool encourages poor usage.
                                                                                                                                                                                        • hajile 9 months ago
                                                                                                                                                                                          React has one up-front size for rendering code whether you use 1 component or 10,000 components.

                                                                                                                                                                                          Svelte and Lit rendering code size just keeps going up, and up, and up....

                                                                                                                                                                                          You can argue about which is better, but this kind of naive size comparison is disingenuous.

                                                                                                                                                                                          • afavour 9 months ago
                                                                                                                                                                                            While it’s true that Svelte and Lit can grow in size dependent on project there’s no world in which even large projects get close to the base level of the React runtime.
                                                                                                                                                                                            • mdhb 9 months ago
                                                                                                                                                                                              Only if you are doing it wrong. https://lit.dev/docs/tools/publishing/
                                                                                                                                                                                          • webdevladder 9 months ago
                                                                                                                                                                                            A more broad observation, I'm being pointed in the parent comment - web components need to win over framework authors. The signs are not trending well here from what I've seen consistently. That community is on X and web components are not addressing their problems and they're not used in optimal scenarios. I hope web components can win them over but they're mostly saying they've been a failure, arguably on balance bad for the web.
                                                                                                                                                                                            • skrebbel 9 months ago
                                                                                                                                                                                              I don't really understand this argument, to be frank. Most runtimes are pretty small, and there's not much of a performance overhead to both runtimes running at the same time. It's not like these are two realtime engines both purring along in the background or something like that. All modern web frameworks are reactive, and won't do anything unless something needs responding to. If one part of the page is built with React, another part is built with Lit, and a third part with Svelte, I don't see how that will have noticeably worse UX (or battery consumption) than a page made with just one framework, even when reactive triggers are frequently exchanged between them.

                                                                                                                                                                                              The tweet you quote is about whether web components are "useful primitives on which to build frameworks". I doubt many web component fans (who actually really used them) would say that they are. They're a distribution mechanism, and the only alternative I've seen from these framework authors is "just make the same library 7 times, once for React, once for Preact, once for Svelte, once for Solid, once for Vue, once for vanilla JS". This is awful.

                                                                                                                                                                                              • webdevladder 9 months ago
                                                                                                                                                                                                You're ignoring page bloat as a performance cost. That's hugely impactful for UX on the web.
                                                                                                                                                                                                • skrebbel 9 months ago
                                                                                                                                                                                                  Not entirely, I said "Most runtimes are pretty small".

                                                                                                                                                                                                  I think people got trained by React into thinking that frameworks are big. SolidJS is 7kb, Lit is 5kb, Svelte is tiny and used to have no runtime at all, etc. Only React is big. And, well, if you're writing React components and publishing them as web components, it's usually quite feasible to build them with Preact instead, which is tiny as well.

                                                                                                                                                                                                  So on a page with like some hodgepodge of 5 frameworks purring along inside various web components, there's still going to be only 20-30 kb of extra overhead. You can compress one image slightly better and save more than that.

                                                                                                                                                                                            • burcs 9 months ago
                                                                                                                                                                                              I love web components and am bullish on them breaking us out of the current frontend hellscape we have created for ourselves. I was recently able to give a short talk on the future of frontend, and it seemed like a lot of other people are hopeful for a way out as well.

                                                                                                                                                                                              As far as performance we built out a data table for our DB GUI that can load in hundreds of thousands of rows and the scrolling through is still buttery smooth.

                                                                                                                                                                                              We actually are getting ready to release our web component library, it's a bit early and rough around the edges but would love to get some more eyes on it! www.astra-ui.com

                                                                                                                                                                                              • candiddevmike 9 months ago
                                                                                                                                                                                                The only way to get out of the current front end hell IMO is if we get client side import:

                                                                                                                                                                                                https://github.com/whatwg/html/issues/2791

                                                                                                                                                                                                • arcbyte 9 months ago
                                                                                                                                                                                                  I'm aghast at the comments in that thread. They are truly asleep at the wheel.

                                                                                                                                                                                                  No wonder the front end is such a disaster with those mindsets running the show.

                                                                                                                                                                                                  • lelanthran 9 months ago
                                                                                                                                                                                                    > I'm aghast at the comments in that thread. They are truly asleep at the wheel.

                                                                                                                                                                                                    And the wheel that they're at is the one in a clown car. Which is driving off a cliff.

                                                                                                                                                                                                    Just having a custom element `<my-include-html remote-src='...'>`[1] is enough to forgo 50% of the reason for using a front-end framework with a build-step.

                                                                                                                                                                                                    [1] One that executes scripts, allows `<style>` tags, etc.

                                                                                                                                                                                                  • meiraleal 9 months ago
                                                                                                                                                                                                    That's a solved problem. You can create a custom element for that with some 5 lines of code. Or use one ready: https://github.com/justinfagnani/html-include-element
                                                                                                                                                                                                    • PaulHoule 9 months ago
                                                                                                                                                                                                      And that’s exactly what some people don’t want!
                                                                                                                                                                                                    • halfcat 9 months ago
                                                                                                                                                                                                      Would this be different from using HTMX to load an HTML partial on page load?

                                                                                                                                                                                                      Something like:

                                                                                                                                                                                                        <div hx-trigger="load" hx-get="/header.html"></div>
                                                                                                                                                                                                      • askonomm 9 months ago
                                                                                                                                                                                                        I mean <script type="module"></script> can do ECMAScript module imports.
                                                                                                                                                                                                      • jitl 9 months ago
                                                                                                                                                                                                        I looked at your docs:

                                                                                                                                                                                                        - renders very weird on my iPhone iPhone 15 Pro Max in Safari 18.0. Consider responsive design for smaller screen sizes to restyle the sidebar and set a body max-width instead of a width. You might not expect your users to develop on phones, but you might have a hard time with adoption if the docs are mobile hostile.

                                                                                                                                                                                                        - the “explore components” button at the bottom of the home page seems to link to nowhere

                                                                                                                                                                                                        - site claims “Learn from well-structured, accessible component implementations” as an advantage but I didn’t find any links to the implementation from the docs

                                                                                                                                                                                                        - site claims “No dependencies to manage or update” but isn’t astra-ui a dependency? It has a changelog (https://www.astra-ui.com/changes/). Likewise “Full control over the code and styling” I don’t understand how I can both have full control but also be taking a dependency on implementations provided by a library.

                                                                                                                                                                                                        I’m curious why you’ve decided to release this library? I’ve come to view open-sourcing internal software as useful to the company for a few specific reasons but to generally be a time-sink without much return unless it’s accomplishing a goal. Component libraries need to fight for general ecosystem adoption or there’s no audience and you might as well not publish at all.

                                                                                                                                                                                                        • burcs 9 months ago
                                                                                                                                                                                                          Really appreciate the write up here!

                                                                                                                                                                                                          Maybe rough around the edges is an understatement haha, we are actively working to make the docs here better.

                                                                                                                                                                                                          So a few things, these are very primitive components that can easily be updated and restyled.

                                                                                                                                                                                                          There’s a given that there will be a dependency when using a library, right? The thing is with this you don’t even need to npm install if you don’t want to. Just plug and play.

                                                                                                                                                                                                          As far as why… there isn’t much out there in terms of a web component driven component library and I think we’ve done some great stuff with ours. That plus we have customers embedding our components into their platform and it’s always helpful to see the source code.

                                                                                                                                                                                                          I hear you on the docs quality though we will work on that.

                                                                                                                                                                                                        • tomjen3 9 months ago
                                                                                                                                                                                                          Why would I used them over something like a Vue component?
                                                                                                                                                                                                          • burcs 9 months ago
                                                                                                                                                                                                            They are framework-agnostic, meaning you're not locked into Vue, React, Angular, or any specific framework. They work natively in the browser, which makes them reusable everywhere, now and in the future.
                                                                                                                                                                                                            • throw310822 9 months ago
                                                                                                                                                                                                              > They are framework-agnostic

                                                                                                                                                                                                              This is a selling point only if your job is producing component libraries. Otherwise, if you're an application developer, you'll be using a framework anyway.

                                                                                                                                                                                                            • throwawayha 9 months ago
                                                                                                                                                                                                              Vue is great but it's a personal preference and interpretation for you.

                                                                                                                                                                                                              It's not about better or worse for you, maybe for the average person.

                                                                                                                                                                                                            • stavros 9 months ago
                                                                                                                                                                                                              Why aren't web components there/more popular yet? They seem like a fantastic solution
                                                                                                                                                                                                              • pfraze 9 months ago
                                                                                                                                                                                                                Web Components have some nice features, some bad features, and no killer feature. Developers have mostly chosen to ignore them for other approaches (React, Vue) where there are better ergonomics and stronger network effects.
                                                                                                                                                                                                                • meiraleal 9 months ago
                                                                                                                                                                                                                  ShadowDOM should be a killer feature for people that wants to make web scrappers life a bit more difficult.
                                                                                                                                                                                                                • kansface 9 months ago
                                                                                                                                                                                                                  > They seem like a fantastic solution

                                                                                                                                                                                                                  for which problem? They don't replace the need for a framework nor do they make writing in one easier. They don't make dev ex better. What is the actual use case? If they were highly useful, they would be used.

                                                                                                                                                                                                                  • stavros 9 months ago
                                                                                                                                                                                                                    Creating self-contained components that don't rely on loading extra management code, in a standard way.

                                                                                                                                                                                                                    Maybe they aren't useful because the modern trend of web development is to not care about speed or size as much.

                                                                                                                                                                                                                  • burcs 9 months ago
                                                                                                                                                                                                                    The cynic in me wants to say it’s because they aren’t VC backed so there’s no main catalyst driving them.

                                                                                                                                                                                                                    I don’t think a lot of people know about them, or if they do they have just heard about it in passing and have never actually used them.

                                                                                                                                                                                                                    Whatever the reason is they have a marketing problem that’s for sure.

                                                                                                                                                                                                                    • throwawayha 9 months ago
                                                                                                                                                                                                                      Lots of open-source things got adopted without VC backing.

                                                                                                                                                                                                                      There's a lot more options now, it would be good to have a way to have the best stand out.

                                                                                                                                                                                                                      • stavros 9 months ago
                                                                                                                                                                                                                        Ah, well that's encouraging, if the tech itself is good, it means I can start using them more.
                                                                                                                                                                                                                      • remixff2400 9 months ago
                                                                                                                                                                                                                        Implementation has been a big part https://news.ycombinator.com/item?id=36976670 (one of many discussions if you search for previous Hacker News articles)

                                                                                                                                                                                                                        Especially earlier on, web components were implemented without incorporating some of the major feedback from developers. What resulted was a low-level tool with some really awkward warts and APIs that was more-or-less unusable. (hence, one of the reasons why when web components discussions come up, lit is always mentioned since it needs that extra layer to paper over some of the warts)

                                                                                                                                                                                                                        TL;DR: it replaces some of the bad parts of Angular/React/etc. with its own set of bad parts that become more obvious only once you get deeper in.

                                                                                                                                                                                                                        • j45 9 months ago
                                                                                                                                                                                                                          New developers follow social proof often instead of learning from first principles.

                                                                                                                                                                                                                          Web Components are seriously cool and worth looking at.

                                                                                                                                                                                                                          • evilduck 9 months ago
                                                                                                                                                                                                                            Social proof does tend to follow employment opportunities. If you're a new dev you don't have the luxury to make principled choices in technology, you're more worried about housing and food security and maybe paying back student loans. Asking new developers to trend-set the industry would be deeply unfair. If we want them to learn from first principles then entry level jobs should have first principles opportunities available.
                                                                                                                                                                                                                            • stavros 9 months ago
                                                                                                                                                                                                                              Excellent, thank you!
                                                                                                                                                                                                                          • shortrounddev2 9 months ago
                                                                                                                                                                                                                            I just rewrote my company's frontend ad code in webcomponents
                                                                                                                                                                                                                          • impostervt 9 months ago
                                                                                                                                                                                                                            A few months ago I started a job where I inherited a JS code base that is around 250,000 lines. It was one big class, with several sub classes, that did everything. Some files were 30k lines long.

                                                                                                                                                                                                                            No frameworks, no reactivity. If you click a button, you had to update everything on the screen with event listeners manually.

                                                                                                                                                                                                                            Took the guy years to write it. It's like a monk got locked in a cell for years with a basic book of javascript.

                                                                                                                                                                                                                            I started by refactoring into web components, because I had to do it piecemeal. It's been a big help, and I've cut 50k lines of code so far. But the real point was to just learn everything the old code was doing before I start a rewrite.

                                                                                                                                                                                                                            • Sammi 9 months ago
                                                                                                                                                                                                                              > I started by refactoring into web components, because I had to do it piecemeal.

                                                                                                                                                                                                                              Yes. The key to making an old and arcane code base understandable to yourself, is to refactor one small part of it at a time. That you're redoing with web components is just one way that would achieve this. I applaud you for not just throwing everything it away and starting anew.

                                                                                                                                                                                                                              On risk of this approach is that you get some way though and then move on to some other project, and someone else comes along and inherits the old project and starts refactoring in their own style, and so now you have an old arcane code base in three different styles... it still beats a rewrite of a 250.000 line code base in one go.

                                                                                                                                                                                                                            • veggieroll 9 months ago
                                                                                                                                                                                                                              One thing about web components that I've appreciated is that they can work without JS enabled (at least in theory). I've done this a few times for progressive enhancement.

                                                                                                                                                                                                                              Broadly I agree with Nolan, though. Web components have enough rough edges that they're not going to take over the world in the current state. But, they are pretty nice for certain use cases.

                                                                                                                                                                                                                              I'm not sure what he means by not playing well with server side rendering though. I've been doing that without issues.

                                                                                                                                                                                                                              • mariusor 9 months ago
                                                                                                                                                                                                                                > they can work without JS enabled (at least in theory).

                                                                                                                                                                                                                                I wonder what makes you say that. All that I've seen seems to indicate[1] that Javascript is needed in order to register the template with a specific tag.

                                                                                                                                                                                                                                [1] https://developer.mozilla.org/en-US/docs/Web/API/Web_compone...

                                                                                                                                                                                                                                • debugnik 9 months ago
                                                                                                                                                                                                                                  Allegedly, declarative shadow DOM lets you declare the template next to the prerendered slot, without JS.
                                                                                                                                                                                                                                  • mariusor 9 months ago
                                                                                                                                                                                                                                    Where is this "alleged" though? From one of the paragraphs behind my link:

                                                                                                                                                                                                                                    > This won't appear in your page until you grab a reference to it with JavaScript and then append it to the DOM

                                                                                                                                                                                                                                    • nsonha 9 months ago
                                                                                                                                                                                                                                      that's just wrong
                                                                                                                                                                                                                                    • DonHopkins 9 months ago
                                                                                                                                                                                                                                      Using HTML and CSS to make web interfaces without JavaScript is like using concrete to make garden gnomes without rebar, while the rest of the adult world is more concerned with using pre-stressed concrete with rebar to make skyscrapers and superhighways. Sure it's a marginal whimsical decorative use case, but not an important or interesting one.

                                                                                                                                                                                                                                      Most people who think turning off JavaScript is an important use case are only inflicting it upon themselves (and aggressively evangelizing that other people do it too) as performative luddites, to feed their martyr complex, so they have something to whine and complain about how the web is so unfair and out to get to them, and have exactly zero customers or products to support.

                                                                                                                                                                                                                                      • mariusor 9 months ago
                                                                                                                                                                                                                                        You seem to be quite careless about whom you offend, but I'm not a fan. Please quit it, the only one whining right now seems to be you.
                                                                                                                                                                                                                                    • charrondev 9 months ago
                                                                                                                                                                                                                                      How is this supposed to work?

                                                                                                                                                                                                                                      With reactJS I know I can server render a component or template and I’ll say JSX makes a pretty good tempting language.

                                                                                                                                                                                                                                      With web components as far as I understand there is no good templating language built in anyways (so you have to bring your own) I’m not aware of a standard mechanism in which I can take some chunk of JS for a component associated with a tag and have it render out HTML that does not require JS to run.

                                                                                                                                                                                                                                      • nolanl 9 months ago
                                                                                                                                                                                                                                        Author here. I cover this in another post [1], but basically the interop benefits you get on the client just aren't there (yet) on the server. My north star:

                                                                                                                                                                                                                                        > Maybe in the future, when you can render 3 different web component frameworks on the server, and they compose together and hydrate nicely, then I’ll consider this solved.

                                                                                                                                                                                                                                        [1]: https://nolanlawson.com/2023/08/23/use-web-components-for-wh...

                                                                                                                                                                                                                                      • superkuh 9 months ago
                                                                                                                                                                                                                                        Web components are okay as long as you only use them to progressively wrap actual HTML elements. If you're using custom-elements by themselves like a JS frontend replacement and just making entire web pages full of blank grey boxes that do nothing without JS, you're doing a bad job.

                                                                                                                                                                                                                                        See: https://blog.jim-nielsen.com/2023/html-web-components/

                                                                                                                                                                                                                                        • claytongulick 9 months ago
                                                                                                                                                                                                                                          Oh? So anyone writing applications, PWAs, healthcare software, responsive mobile web apps, or a billion other business domains where the web makes sense as a UI is doing a bad job?

                                                                                                                                                                                                                                          Guess I've been doing a bad job for a long time now.

                                                                                                                                                                                                                                          • superkuh 9 months ago
                                                                                                                                                                                                                                            Yes, https://www.gov.uk/service-manual/technology/using-progressi...

                                                                                                                                                                                                                                            “All [UK] government services must follow progressive enhancement, even if part of the service or a parent service needs JavaScript”

                                                                                                                                                                                                                                            But more seriously, it's okay to do a bad job if you're being paid/forced to do it by a for-profit entity. That's what jobs are. Being paid to do things you wouldn't do otherwise (like making a webpage entirely inaccessible to people with screen readers because there's no text in the custom-elements pre-JS execution and not caring because the visually impaired don't contribute significantly to profit). Just don't chose to do a bad job for personal stuff.

                                                                                                                                                                                                                                            • royal_ts 9 months ago
                                                                                                                                                                                                                                              While that link is great advice it's not 100% true that you need to have JS enabled to render anything in a web component - there's declarative shadow dom. Also while it's also true to depend on as little as possible JavaScript it's also required for some accessibility aspects. You can get far with only HTML and CSS but not always all the way.
                                                                                                                                                                                                                                              • DecoySalamander 9 months ago
                                                                                                                                                                                                                                                Screen readers that can't do their job on dynamically generated pages are faulty and should not be relied upon by anyone, especially for browsing the web. There is absolutely no reason to be beholden to the incompetence of the developers of such software.
                                                                                                                                                                                                                                          • mmcnl 9 months ago
                                                                                                                                                                                                                                            I don't really get this "frameworks vs. web components" discussion. They are both tools to solve different problems. Frameworks exist to render your view as function of state in a declarative way. They use web primitives to define the view layer. Web components can help there, but it doesn't solve the state management issue that frameworks aim to solve. That's a different problem that requires different solutions. In my opinion they can perfectly co-exist.
                                                                                                                                                                                                                                            • mrfinn 9 months ago
                                                                                                                                                                                                                                              How can it be possible that we are in 2024 a no one seems to be proposing the most obvious improvement to the web, which is to create a new standard designed for web applications and let the HTML alone serving it's original purpose, which was to serve documents? (H*T*ML the T goes for "TEXT"!). Instead of that, and make things complex and unmanageable to the extreme, to "improve" things now we dropped out completely the MVC philosophy and went completely ahead with an spaghetti mess of Javascript, HTML, CSS, and create-your-desired-tags-at-will everywhere, aka Components.

                                                                                                                                                                                                                                              PS. And not even mentioning Madnesscript which deserves another chapter in this story of horror.

                                                                                                                                                                                                                                              • mixmastamyk 9 months ago
                                                                                                                                                                                                                                                It's a herding cats problem. Not practical for new actors to propose one and have it adopted; current principals are no longer trusted. No one else with deep pockets cares enough to donate the resources it would take and/or do the hard coordination work. We don't see viable new Operating Systems either, for example.

                                                                                                                                                                                                                                                That leaves minor feature additions as the only way forward.

                                                                                                                                                                                                                                                • openrisk 9 months ago
                                                                                                                                                                                                                                                  There are probably many reasons. The history of technology development teaches us there are a lot of non-core factors that affect the adoption of alternative designs (influential entities and agendas, network effects, business models of those involved etc.)

                                                                                                                                                                                                                                                  But there seems to be also an interesting intrinsic reason: The versatility of the digital "Document" paradigm itself. Text in its digital incarnation (a sequence of human readable strings) is not just your usual text. While printed text on a page involves the encoding and annotation of human language sentences you can encode a lot more things in human readable HTML/SVG/XML formats (e.g. numerical data, visual geometries, declarative UI etc.).

                                                                                                                                                                                                                                                  The HTML family of documents is in this sense a sort of "super text". Its structure reflects already its huge dynamic (rich text) potential. But clearly you cannot solve everything in a declarative manner (though you should probably push it as far as possible). At some point the flexibility of code is important and the question then is what is the optimal way to do this (as in: easy, performant, versatile etc.). Alas at the moment we seem to be almost at the extreme opposite: everything as code.

                                                                                                                                                                                                                                                  Ideally one would refactor all these declarative formats that have proven their utility and resilience and rethink the role of code / frameworks, taking into account all the developments and learnings of the past decades (web assembly, mobile, pwa etc.).

                                                                                                                                                                                                                                                • gaganyaan 9 months ago
                                                                                                                                                                                                                                                  I really dislike the Shadow DOM part of Web Components. Someone didn't learn any lessons from past mistakes and went and reinvented iframes. Trying to write tests or any automation for a web page that uses shadow dom is an exercise in misery, unnecessary at that.
                                                                                                                                                                                                                                                  • addicted 9 months ago
                                                                                                                                                                                                                                                    Web components are lacking some basic functionality that makes using them in something complex difficult.

                                                                                                                                                                                                                                                    For example, one of the deal breakers we faced was the inability to unload and reload a web component. Once you load a web component you’re stuck with it until you refresh the browser.

                                                                                                                                                                                                                                                    You cannot have an SPA with one page loading 1 version of the web component and another loading another version without some ugly namespace mangling.

                                                                                                                                                                                                                                                    • drawkbox 9 months ago
                                                                                                                                                                                                                                                      I dig WebComponents because I love building on standards which promote interoperability across frameworks and have long term lifelines. Standards reduce platform + dev lock-in and reduce framework balkanization and frankly chaos in many cases. You are a better developer if you understand the root standards and core systems, which WebComponents get you closer to.

                                                                                                                                                                                                                                                      I also like the Lit Framework (https://lit.dev/) from Google which is rarely mentioned but it is quite nice for some of the simplifications and extras you might need when building them but it doesn't get in the way or try to take over your entire domain with dev-lockin.

                                                                                                                                                                                                                                                      Whether going direct to WebComponents or a higher level simplification like Lit, they really are a freedom from dev lock-in that is nice to see.

                                                                                                                                                                                                                                                      • skrebbel 9 months ago
                                                                                                                                                                                                                                                        I'm bullish on web components as a distribution mechanism. In fact, we're currently hard at work betting our entire company (https://talkjs.com - a component library + API for chat) on it.

                                                                                                                                                                                                                                                        I agree with Nolan here that the performance is fine. People keep comparing web components to React or Solid components, but the latter inherently have a tiny granularity whereas web components is primarily a way to distribute reuseable elements, not an application framework on its own. Don't make every tiny piece of your app its own little web component (or, at least, don't do it without a framework such as Lit to skip the pain). But web components are the way to build a component once and have it usable in all web frameworks (including none at all) out of the box. That's fantastic! And also unprecedented (on the web, that is).

                                                                                                                                                                                                                                                        It bothers me that so much of the discussion is still about whether web components are good primitives to build frameworks on top of. No, not really, they're pretty awful for that! But for distribution, nothing else comes close.

                                                                                                                                                                                                                                                        I'd love it for some alternative standard to emerge, without all the awful design choices of web components. And I agree with Rich (Svelte) and Ryan (Solid) that WCs being built into browsers are getting in the way of some other collective component interop design emerging. But until the framework authors stick their heads together and invent a fast, modular, non-shitty, property-only, functional-smelling standard for distributing components, I'm sticking with web components. For component authors, the only alternative is making a React version, a Preact version, a Lit version, a Svelte version, a Vue version, an Angular version, a Solid version and a vanilla JS version of the same UI component. That's awful! Web components are clunky but they're here, now!

                                                                                                                                                                                                                                                        • delusional 9 months ago
                                                                                                                                                                                                                                                          > With every programming language, you can do

                                                                                                                                                                                                                                                          There are plenty of programming languages where you can't do that. If you really need that, can't you just register it as "my-thing-1" and then register the other one as "my-thing-2"?

                                                                                                                                                                                                                                                          • skrebbel 9 months ago
                                                                                                                                                                                                                                                            Sorry, I edited my post and took that out for being too detailed.

                                                                                                                                                                                                                                                            > If you really need that, can't you just register it as "my-thing-1" and then register the other one as "my-thing-2"?

                                                                                                                                                                                                                                                            Yes you can, but it means you gotta search-replace something, whereas in every modern programming language you just do an import or an alias or something like that.

                                                                                                                                                                                                                                                            And you still can't solve hot-reloading a web component that way.

                                                                                                                                                                                                                                                        • tannhaeuser 9 months ago
                                                                                                                                                                                                                                                          Let me explain the argument to you:

                                                                                                                                                                                                                                                          > You can always add another layer of abstraction to solve a problem but removing one can be difficult.

                                                                                                                                                                                                                                                          The argument being that there's no need to add anything to the browser stack and make it even more complex when it doesn't add any essential capability. There's already JS making everything possible; and yet, they keep on piling stuff. When with custom elements specifically, you also require JS anyway (to declare them).

                                                                                                                                                                                                                                                          > Elements are not components.

                                                                                                                                                                                                                                                          Idk maybe for "web devs" the concept is difficult to grasp that HTML isn't for them. It's for text authors, and as such a markup vocabulary where low-level elements are placed next to complex custom controls nilly-willy isn't really a useful evolutionary direction.

                                                                                                                                                                                                                                                          • 9 months ago
                                                                                                                                                                                                                                                            • tomrod 9 months ago
                                                                                                                                                                                                                                                              I like seeing accessibility respected. Good post.
                                                                                                                                                                                                                                                              • thomassmith65 9 months ago
                                                                                                                                                                                                                                                                I use web components, but I often want to design classes as MVC. It isn't obvious how this should work (though I assume the Web Component spec authors discussed the topic at some point). The awkwardness is:

                                                                                                                                                                                                                                                                (a) When you instantiate your View class (ie: 'web component') from JS, you probably want your Model and View to be 'owned' by properties of the Controller (eg: con.model and con.view). However...

                                                                                                                                                                                                                                                                (b) when an HTML tag instantiates your View, the View has to create its Model and Controller. And now there's no obvious place to store a reference to the Controller.

                                                                                                                                                                                                                                                                As a result, you have either to stick the Controller in a global variable somewhere, or - more likely - end up, not just with 'con.model' and 'con.view', but also with a new property: 'view.con'

                                                                                                                                                                                                                                                                So... two paths to create everything (Controller-based, or View-based), and this ugly '.con' property stuck in the View.

                                                                                                                                                                                                                                                                But, aside from this gripe, Web Components are okay.

                                                                                                                                                                                                                                                                • mattlondon 9 months ago
                                                                                                                                                                                                                                                                  I don't think we components were intended as a complete "framework" for writing web apps, but more for the rendering of reusable UI components.

                                                                                                                                                                                                                                                                  So trying to do MVC with just web components feels a bit weird, at least to me. You'd need something extra I think

                                                                                                                                                                                                                                                                  • thomassmith65 9 months ago
                                                                                                                                                                                                                                                                    The problem is that the ShadowDOM is sort of the real View, and the CustomElement (judging it by its methods), is kind of a mix of a View and a Controller.

                                                                                                                                                                                                                                                                    Perhaps I should try making my controllers the HTMLElement subclasses, instead of my views. My gripe remains: the best approach is not obvious.

                                                                                                                                                                                                                                                                    • thomassmith65 8 months ago
                                                                                                                                                                                                                                                                      Note to whoever comes across this comment in future.

                                                                                                                                                                                                                                                                      So I have now explored using HTMLElement as the Controller, its shallow DOM as a data source for its Model class, and its ShadowRoot as a subclass.

                                                                                                                                                                                                                                                                      It is clear to me now that that design would be the most natural fit for MVC.

                                                                                                                                                                                                                                                                      However... it is also impossible. For whatever infuriating reason, they designed custom element's ShadowDOM class to not be subclass-able. You can neither give a ShadowDOM subclass a constructor, nor does HTMLElement reveal any mechanism to 'attach' a ShadowDOM subclass.

                                                                                                                                                                                                                                                                      Fantastic /s

                                                                                                                                                                                                                                                                • PaulHoule 9 months ago
                                                                                                                                                                                                                                                                  I did a project that used Shadow DOM and related tech to address the problem of embedding a widget into a partner’s web site without any risk of CSS interference. Worked great, but this was one medium-sized widget that did not interact with the rest of the page.
                                                                                                                                                                                                                                                                  • shortrounddev2 9 months ago
                                                                                                                                                                                                                                                                    I wish web components had a bit more to them

                                                                                                                                                                                                                                                                    1. I wish you could reliably parse their attributes in the constructor instead of connectedCallback, so that they play better with typescript readonly properties

                                                                                                                                                                                                                                                                    2. I wish I could declare properties in the class and have them automatically map to an attribute

                                                                                                                                                                                                                                                                    3. I wish I could construct them using html instead of manipulating domnodes manylually

                                                                                                                                                                                                                                                                    4. I wish I could construct child nodes first so that I can compose webcomponents with other webcomponents

                                                                                                                                                                                                                                                                    As it stands webcomponents provide the ability to construct a single element at a somewhat predictable moment in time, automatically. That's cool, but their interface is lackluster to me

                                                                                                                                                                                                                                                                    • dandrew5 9 months ago
                                                                                                                                                                                                                                                                      Web Components are fun. I've played around with Lit, which some people have mentioned. Anybody tried Stencil? It looks similar from the outside but wondering how it plays out mid/late-term.
                                                                                                                                                                                                                                                                      • commanderkeen08 9 months ago
                                                                                                                                                                                                                                                                        Stencil has a way better DX. Especially if you’re doing a whole library of components. You pay a slightly higher perf tax for their auto loader and light vdom. Lit is the way to go if you have opinions and want no magic
                                                                                                                                                                                                                                                                      • newhotelowner 9 months ago
                                                                                                                                                                                                                                                                        Safari is the only browser without the full support

                                                                                                                                                                                                                                                                        *Supports "Autonomous custom elements" but not "Customized built-in elements"

                                                                                                                                                                                                                                                                        • 9 months ago
                                                                                                                                                                                                                                                                        • 9 months ago
                                                                                                                                                                                                                                                                          • carlual 9 months ago
                                                                                                                                                                                                                                                                            I found a practical way to foster critical thinking skills and encourage independent thought at the end of Netflix's documentary, The Social Dilemma:

                                                                                                                                                                                                                                                                            > I follow people on Twitter that I disagree with because I want to be exposed to different points of view.

                                                                                                                                                                                                                                                                            Here is another good opportunity for it.

                                                                                                                                                                                                                                                                            • wellpast 9 months ago
                                                                                                                                                                                                                                                                              What’s missing in his point and examples about “performance isn’t everything” (aria properties, forEach, …) is that these are cases where you could optimize later when and if needed. Using forEach is a fluid coding choice at the time but if for any reason you need to optimize to a for loop you can with minimal fanfare. But buying into web components is more of a one-way door and harder to iterate optimizations, and that’s the problem.
                                                                                                                                                                                                                                                                              • jongjong 9 months ago
                                                                                                                                                                                                                                                                                Tech discussions are hard to have nowadays because people are highly biased in favor of their current tech stacks.

                                                                                                                                                                                                                                                                                The religiousness which used to be restricted to programming languages has expanded to include frameworks, databases, test runners, infrastructure, CI tooling, libraries; literally everything is a religion nowadays.

                                                                                                                                                                                                                                                                                It makes almost all technical arguments disingenuous and pointless. Like people arguing about whose religion is more correct. Observable facts don't matter so much.

                                                                                                                                                                                                                                                                                People see arguments in favor of some alternative stacks as a personal attack against their career.

                                                                                                                                                                                                                                                                                It's probably because companies themselves have become so focused on hiring based on these stacks. They have become a matter of livelihood.

                                                                                                                                                                                                                                                                                In the old days, many companies saw software engineering ability as a separate skill; now they barely even use the word 'software engineering.'

                                                                                                                                                                                                                                                                                • hu3 9 months ago
                                                                                                                                                                                                                                                                                  Thanks for sharing this view. I relate a lot.
                                                                                                                                                                                                                                                                                • renegat0x0 9 months ago
                                                                                                                                                                                                                                                                                  This might be a stupid hot take, but I am surprised that so little of web UI exist outside of the browser. I mean why bootstrap or other frameworks are not managed by browser ecosystem? Why millions of people how to download same frameworks over and over?
                                                                                                                                                                                                                                                                                • wordofx 9 months ago
                                                                                                                                                                                                                                                                                  > From my own personal experience: at Salesforce

                                                                                                                                                                                                                                                                                  lol

                                                                                                                                                                                                                                                                                  • mtn6747 9 months ago
                                                                                                                                                                                                                                                                                    [flagged]
                                                                                                                                                                                                                                                                                    • toddmorey 9 months ago
                                                                                                                                                                                                                                                                                      So just more AI comment spam, huh? It's unfortunately ruining my favorite communities.
                                                                                                                                                                                                                                                                                      • meiraleal 9 months ago
                                                                                                                                                                                                                                                                                        it is only ruining if you decide to see the dead posts and still dislike that spam is being killed.
                                                                                                                                                                                                                                                                                    • breck 9 months ago
                                                                                                                                                                                                                                                                                      We do web components better than the web. We just call them Parsers.

                                                                                                                                                                                                                                                                                      Geniuses build for The Scroll first. Retards build Web first.

                                                                                                                                                                                                                                                                                      (Don't misinterpret, I love The Web, but The Scroll is on track to be 100x better)

                                                                                                                                                                                                                                                                                      • auggierose 9 months ago
                                                                                                                                                                                                                                                                                        Web components are not OK. They are shit. I wouldn't touch them, just as I wouldn't touch shit.

                                                                                                                                                                                                                                                                                        If you find React hooks hard to understand, then I really don't need to hear your opinion about anything, including about how web components and HTMX are so great. Just learn programming.

                                                                                                                                                                                                                                                                                        • epolanski 9 months ago
                                                                                                                                                                                                                                                                                          As someone who uses all of web components, react and Vue, depending on the project I really feel like to give such aggressive and opinionated takes you should consider doing it in a mature and professional way that goes into the "why" you feel like that.
                                                                                                                                                                                                                                                                                          • auggierose 9 months ago
                                                                                                                                                                                                                                                                                            Mature and professional is what gives us shit like web components, and people like you eating it. So, no, thank you.
                                                                                                                                                                                                                                                                                            • epolanski 9 months ago
                                                                                                                                                                                                                                                                                              Have you considered that there are different tools for different problems and that web components have their own space in the wide array of problems?

                                                                                                                                                                                                                                                                                              Because they are a decent fit to a specific set of problems (e.g. authoring components you can embed on different platforms, regardless of the technology they are built with).

                                                                                                                                                                                                                                                                                              I myself, as detailed in another comment, have concerns with web components, and having worked with them extensively, I feel they fall short in several aspects (especially regarding layout control, where they aren't isolated enough due to a series of design choices) but it's manageable.

                                                                                                                                                                                                                                                                                              A problem that I had in two different companies (embedding a set of elements that had to work in very different applications and required the host to know little to nothing) after much analysis was best solved with web components and they did well at that.

                                                                                                                                                                                                                                                                                              The possibility of doing `<script type module>import "yourcomponent.js"</script> <yourcomponent foo="bar"></yourcomponent>` without for us web component authors having to worry about the wide array of different technologies the hosts used (both at compile and runtime) has been in the end the best solution for both us and the consumers.

                                                                                                                                                                                                                                                                                              As Ryan Carniato points out, most of the criticism web components get is that their usage is misunderstood, some of their behavior falls short of their goals, and their name conflates then with framework's components creating further confusion, which are something very different.

                                                                                                                                                                                                                                                                                              The problem with comments like yours is that they add nothing of value to the discussion. We don't know if, when and where did you try to use web components, what hasn't worked for you and why, or if you've ever had the kind of problems where web components would've been a good fit or not.

                                                                                                                                                                                                                                                                                              You end up giving the hopefully wrong impression of an obtuse person lacking the engineering sensibility to understand the context of problems and of their possible solutions.

                                                                                                                                                                                                                                                                                          • ForHackernews 9 months ago
                                                                                                                                                                                                                                                                                            What a weirdly aggressive comment. I could just as well say you should stop trying to (ab)use programming to make web pages and learn markup instead.

                                                                                                                                                                                                                                                                                            React is a comedy of errors and imho should not be held up as aspirational https://medium.com/@fulalas/web-crap-has-taken-control-71c45...

                                                                                                                                                                                                                                                                                            • auggierose 9 months ago
                                                                                                                                                                                                                                                                                              React, especially with the addition of hooks, is brilliant from a conceptual point of view. I don't like their new docs though, they infantilise too much, trying to hide the concepts, instead of clearly exposing them. They don't even have a page anymore about how to set up React on your page without using something shitty like NextJS.

                                                                                                                                                                                                                                                                                              Furthermore, there is really nothing to "learn" about markup. That is why it is markup.

                                                                                                                                                                                                                                                                                              • meiraleal 8 months ago
                                                                                                                                                                                                                                                                                                Having this strong opinion about webcomponents while thinking so high of a shit abstraction like react makes you sound stupid and show that you learnt how to code in a bootcamp.
                                                                                                                                                                                                                                                                                            • dominicrose 9 months ago
                                                                                                                                                                                                                                                                                              Honestly I would be fine if classes didn't exist. This means no methods, no "this". Namespaces, data structures and functions are enough to do everything.

                                                                                                                                                                                                                                                                                              I started to like React when we could write components with functions.

                                                                                                                                                                                                                                                                                              • tonis2 9 months ago
                                                                                                                                                                                                                                                                                                I disagree, I would prefer light web-components, rather that react.js + the compilers and state managers.

                                                                                                                                                                                                                                                                                                This make me into a bad programmer, I agree to disagree