[HN Gopher] SPAs Were a Mistake
___________________________________________________________________
SPAs Were a Mistake
Author : andrei_says_
Score : 392 points
Date : 2022-03-02 15:35 UTC (7 hours ago)
| crescentfresh wrote:
| I showed an interviewer a piece of something I built in a
| traditional page-per-view design, with some xmlhttprequest where
| appropriate, and a sprinkling of Vue where it added usability to
| some of the modal dialogs. Their only response was "why didn't
| you build it in React?".
|
| I stopped interviewing for front-end work since then. The
| landscape changes frustratingly too often.
| matchagaucho wrote:
| I'm still bullish on the potential for Web Assembly apps to
| overtake mobile binaries.
|
| And instead of _Single Page_ Apps, we 'll have just plain _Apps_
| that run in browsers.
| heurisko wrote:
| I would much rather program in any language that is compiled to
| web assembly rather than JavaScript.
| Dma54rhs wrote:
| Since I assume you know about it a bit more, what is
| realistically timeframe it could happen at best?
| matchagaucho wrote:
| No idea on timeline. But I'd speculate Apple has no incentive
| to cannibalize their AppStore ecosystem and make Safari more
| than a web browser.
|
| So Google/Chrome or Firefox are the only 2 players with
| enough incentive to make Wasm an Internet app standard.
|
| Or possibly the next Wasm-first, cross platform browser will
| come along with a Wasm AppStore?
| bluewalt wrote:
| I think one of the main reason SPAs are overused is because it's
| hard in 2022 for your users to wait after clicking on a link.
| Users are now used to instantaneous, especially since they all
| have a smartphone with apps on it. We, as web developers, try to
| give the best UX to users.
| gls2ro wrote:
| I agree with you and I think there are some good SPAs. In my
| case what makes me angry is opening a presentation website and
| seeing a loader because someone decided to make that a SPA.
| ramesh31 wrote:
| >SPA's suck! Here's my ad-hoc replacement architecture that you
| should totally just use!
|
| Really though, this is a dead horse. SPAs are just a tradeoff
| like everything else in engineering. We trade the simplicity of a
| monolith for the ability to parcel out work efficiently between
| large disparate teams of frontend/backend engineers.
| aminerman wrote:
| Anyone can choose the tech stack, patterns, or whatever that he
| likes. But developers enjoy being absolutists, and deem something
| they don't like as a MISTAKE, or would tell you that the way they
| think is the ONLY way to think.
|
| You do your app the way you want depending on the Ux you want to
| provide, on the tech you enjoy implementing, on the patterns you
| like to follow.
| commandlinefan wrote:
| > Anyone can choose the tech stack, patterns, or whatever that
| he likes
|
| Maybe for personal projects, but 99% of us have to use the tech
| stack, pattern or whatever of our employer that was decided on
| (presumedly by some consensus at some point in the past).
| Publicly pointing out the flaws in what might have made sense
| then but might not make sense now is a Good Thing so that those
| flaws might be taken into consideration in the next round of
| consensus building.
| hinkley wrote:
| I don't understand what sort of cave trolls think I get to
| decide for me. Even as a lead I am making decisions based on
| the situation on the ground and those are informed by what
| people are comfortable with and what I can help them get
| comfortable with. It's a team activity.
|
| But every conversation has someone spouting off like these
| are experiments in a Petri dish. Petri dish projects don't
| matter. Haven't for a long time.
| root_axis wrote:
| Don't work for a company running a tech stack you don't like.
| seer wrote:
| One thing that I found working in a bigger organisation is just
| how well React encapsulates Design Systems. You can have a
| dedicated team of talented frontend engineers that builds a
| really solid design system, and then other folks building the
| actual user facing bits can use them, and everything will be nice
| and consistent across all the various apps.
|
| For example look at how well this has been going for Uber.
|
| Now this is certainly possible, and even relatively easy to do in
| server side frameworks, but as others have stated, its harder to
| make sure it works nice in all the various edge cases and visual
| flair that is required for end users, and keeping it all
| consistent and upgradable across the board.
|
| React (and I'd wager other component based approaches) shine
| there - its low level enough that you can implement anything with
| it, but still allow you to build complex things fast. And then
| are free to implement the actual business logic of the backend
| with the technologies of your choice. Even better various teams
| can do that in their preferred language, without the end user
| being affected by the difference.
|
| Throw in react native to make the styles transferrable to mobile
| apps and you have the perfect sweet spot for largish tech
| companies. And since those tend to be the more vocal ones, we get
| this, in my opinion largely deserved desire to build SPAs.
|
| Smaller teams / startups of coarse don't have those incentives,
| so they will understandably not have the same cost / benefit
| analysis.
| softwarebeware wrote:
| I'm not clear why the author thinks that "media sites, really"
| are the only SPA use case. Have they never used webmail (like
| GMail), map apps (like Google Maps), or social networks (like
| Twitter)?
| gls2ro wrote:
| I give you Google Maps is a perfect example maybe for SPA.
|
| But Gmail? Why do we need SPA for that? Receiving emails
| notifications could be websockets and clicking on email should
| go to a new page displaying the email. I dont know if the
| initial gmail was SPA or not, but the current version is very
| very slow and consumes a lot of memory to display some emails
| that worked even in terminal clients, remember Pine?
|
| The same for twitter? I anyhow have to press "Load 39 new
| tweets" to load the new ones so why is it a SPA? Just for that
| notification? If you would give me a twitter client where I
| need to refresh the page to load new tweets but works faster
| and consumes less memory I will happy use that.
| freeaccount wrote:
| aminerman wrote:
| tonyedgecombe wrote:
| You keep making this ad hominem attack without presenting any
| evidence.
| hinkley wrote:
| You're really enjoying that brush today.
| vangelis wrote:
| Don't be an asshole.
| Aerroon wrote:
| SPAs are just Flash 2.0, except it's not popular to hate on them
| like it was popular to hate on Flash websites.
| sigstoat wrote:
| webapps were a mistake.
| thepra wrote:
| I guess Blazor WASM is the elephant in the room. OOP as much as
| you want, js codebase required near to 0.
| thaway2839 wrote:
| The argument appears to be that browsers give you a lot of things
| for free that SPAs need to recreate.
|
| But that's not true in practice. In practice most SPAs are
| created on top of a handful of extremely well tested
| libraries/frameworks that do all the work for you that the
| browser would do in an MPA.
|
| That's not really a good reason that SPAs are a mistake.
| ChicagoDave wrote:
| Users do stupid things regardless of the implementation. The
| extra work to implement a SPA is worth it because you can swap
| material in and out on demand without constructing a complete new
| web page.
|
| 100% disagree with OP.
| me_me_mu_mu wrote:
| I had the pleasure (aka hell mode) of building a content site as
| a SPA because some non-technical manager kept pushing it (it was
| one of those companies).
|
| It was an insane task to meet all the SEO requirements, we ended
| up doing server rendered pages, and keep in mind this was years
| ago so there was not a whole lot of support or tutorials on how
| to do it.
|
| Oh well, I got paid to learn a bunch of new stuff so I can't
| complain :D
| nhoughto wrote:
| Not the reasons I expected
|
| I don't see Navigation as a main problem and it can be solved
| quite neatly, not that much more complex than a normal site. Was
| expecting something about bundle size etc.
| themanmaran wrote:
| Agreed. The blog doesn't seem like a very thought out
| examination, and I expect most of the HN replies are just
| debating the title.
|
| For me, the biggest con of SPAs is lack of SEO.
| bluetwo wrote:
| If it makes you feel better, SPAs were a mistake when they were
| all the craze in Flash. Also way before that in Director.
|
| In those two cases, they signified (or accelerated) the end of
| the useful lifespan of those languages.
|
| SPAs, like frameworks, always make some things easier and some
| things harder. As long as you stay within the lines of what is
| easy, you are good. As soon as you stray outside those lines, you
| get punished.
| nawgz wrote:
| "SPAs were a mistake"
|
| Meanwhile essentially every major tech property develops SPAs and
| users enjoy them far more than traditional hypertext web round-
| trip-every-change pages
| jmconfuzeus wrote:
| Big tech companies love wasting money and developing a SPA is a
| good way to do that.
|
| Whether users prefers SPAs or not is debatable. Amazon, Github,
| and Aliexpress aren't SPAs because poor usability will cause
| users to move to competitors. If Hacker news turned into a SPA,
| I guarantee that it would suck big time.
|
| SPA developers seem to be living in a tiny bubble oblivious of
| simple solutions to simple problems.
| nawgz wrote:
| > Github
|
| In what world is this not an SPA? I don't see page
| transitions hardly anywhere, except when you're switching
| from marketing material to repos maybe.
|
| Additionally, the fact that GitLab (which is devops/issue
| tracking/wiki/etc.) ISN'T an SPA drives me crazy every day. I
| have to wait for so many rerenders that could just be
| seamless loads, it's actually insane to me how unoptimized of
| a user experience it is, especially when my happy path is
| super clear with respect to what content I load.
|
| > SPA developers seem to be living in a tiny bubble oblivious
| of simple solutions to simple problems
|
| I think it's hilarious who you consider to be living in a
| bubble, and what simplicity really means. Client side
| interactions need to be smooth. Web applications are
| consistently and increasingly presenting meaningful user
| workflows that can be made more resilient and responsive with
| SPAs. I develop tools for dataflow/workflow editing,
| scheduling, visualization, etc., and the idea that these
| things can be made to feel good without a dedicated client
| layer is truly an archaic attitude.
| randomsearch wrote:
| Controversial opinion: SPAs are great and also SPAs are an
| admission that Java applets were along the right lines.
| EMM_386 wrote:
| My company wouldn't know it.
|
| I'm lead on a large Angular 13 app used by tens of thousands of
| companies, it works and it's very fast.
|
| I wouldn't call SPAs a mistake. I have 2+ decades in the industry
| and come from an ASP.Net / MVC background prior to Angular.
| frabjoused wrote:
| I can't agree with this. That list of 9 complexities are well
| abstracted by the most common library or framework for SPAs.
| Having done a lot of SPA development I can say routing is not
| anywhere up on the list of trouble spots you do encounter. State
| management is another story.
| kizer wrote:
| Here's the thing: so-called "JAM stack" apps are the cheapest to
| run, right? I realized this while I was thinking about how to
| create the cheapest site possible. Mainly, you want to minimize
| bandwidth. Well, SPAs are designed to do this. The site gets
| cached on the first hit, and runs usually JSON requests in the
| background after. So I think a big motivation for building SPAs
| is because they're cheap to host/run.
| gunapologist99 wrote:
| REST API's (literally, "Representational State Transfer", ReST)
| are a very nice match with SPA's, because now the browser is the
| sole source of truth for application state (and the server only
| has to produce some JSON data instead of entire HTML pages).
|
| Literally the _entire_ point of REST is that you don 't have to
| maintain server-side sessions, and you shouldn't. This also has
| benefits for scalable applications, in that you can transfer your
| running application to a cluster of servers on the other side of
| the world, and it'll still keep working.
|
| The trust boundary between the front and back ends can be a huge
| boon to security as well, and some things are literally
| impossible to do with a multi-page app, and you can still
| maintain URL parity with new actions in your page.
|
| That's why SPAs were, and are, great!
|
| That doesn't mean everything should be an SPA! A photo, news,
| blog, or recipe website might be better laid out as a separate
| page for each individual item. However, there are tons of other
| types of real applications that can only be built as an SPA.
|
| Are they unwieldy, sometimes hard-to-code and maintain, and
| sometimes result in a poorer experience? Yes, but that can also
| be true of a multi-page app, especially if you're trying to
| shoehorn an SPA experience into a multi-page app and want to
| maintain the same user experience as a user moves around within
| the app.
|
| A multi-page "app" isn't really an app anymore; it's a server-
| side app that is producing multiple pages. A single page app
| literally is running in the browser and only sending a bit of
| data back and forth with each user interaction. It's just a
| completely different model.
| cjalmeida wrote:
| This ship has sailed. SPAs shortcomings are widely known and
| addressed by frameworks.
|
| Whatever MPA alternative you bring will need to address other
| shortcomings. There will always be something quirky due to
| building applications in a technology designed for hypertext
| documents.
| bdcravens wrote:
| Many of those shortcomings were solved 15-20 years ago. Far too
| many SPAs are little more than old school request and response,
| GET and POSTs. I've literally had to drop into the dev tools
| console just to push through a page with 7 sets of radio
| buttons because Angular broke in some spectacular way, on a
| page that is and should be boring (prescription refill page).
| [deleted]
| antihero wrote:
| This article seems to be directed at dealing with people that use
| SPAs to make more content focused websites, which quite obviously
| are better made with the browser.
|
| However, for an application with a persistent UI, I fail to see
| how constant page loads and navigation just because "the browser
| can do this" make any sense at all.
|
| Even the example is a bit silly - SPAs that should be SPAs don't
| really have "links" per say, they will mostly have buttons, which
| will have a some sort of defined action. Perhaps these buttons
| will navigate to some other screen in the application, however,
| reloading all of the client side state every time one does this
| is absurd to say the least.
|
| Finally, from a technical perspective, having a clear separation
| of concerns by having code talk to an API as opposed to HTML
| being rendered on the server, you remove a lot of complexity.
|
| It feels like the people who write these articles don't actually
| remember how utterly shit the jQuery days were.
| gowld wrote:
| jQuery days were bad?
| viggity wrote:
| there were certainly people that committed war crimes with
| jQuery. Just like every other framework in existence. I yearn
| to return, honestly.
| horsawlarway wrote:
| Yeah - I think a lot of it might be developers who don't
| understand that SPA and caching go pretty much hand in hand.
|
| I'll admit that can make your life as a developer harder
| sometimes (to be blunt - caching is hard - full stop) but an
| SPA rendering from cache is basically a rocket compared to a
| server rendered page on a bad connection.
|
| Absolutely no one enjoys waiting 2-5 seconds after clicking the
| back button to see a page they were just on, but that's the
| reality of a server rendered app on a bad connection. An SPA
| with good caching does, in fact, feel like a native app - in
| lots of good ways.
| infensus wrote:
| >no one enjoys waiting 2-5 seconds after clicking the back
| button to see a page they were just on, but that's the
| reality of a server rendered app on a bad connection
|
| Wait, what. Don't basically all browsers nowadays keep
| previous pages in memory exactly not to do this?
| charcircuit wrote:
| >Absolutely no one enjoys waiting 2-5 seconds after clicking
| the back button to see a page they were just on
|
| This doesn't happen because the browser caches the last page.
| wackget wrote:
| If you read [his next blog
| post](https://gomakethings.com/how-to-make-mpas-that-are-as-
| fast-a...) you'll see he has lots of experience with
| architecting an advanced, cache-heavy multi-page application
| which works and behaves much like you describe.
| horsawlarway wrote:
| Yeah, interesting.
|
| I think that approach is fine if you have an application
| that's light on interactivity (like school curriculum or
| tutorial, in his case).
|
| And I agree 100% on the service workers (Seriously, I'm
| right there with him - they're magic). I would also
| recommend leaning more heavily on persistent storage
| (localstorage/indexdb) but I'm also trying to handle
| offline only cases.
|
| I think some of the advice falls down when you're genuinely
| trying to create an interactive experience. I probably
| won't expound much farther, since I really try to keep
| business out of HN, but... I write applications that have
| been used for following treatment programs in education
| environments - think speech therapy or ABA for autistic
| students, where the user is inputing data frequently - as
| often as once a second - and the UI is updating in response
| to calculations done client side, that influence the
| instructors program and plan in real time.
|
| It's a lot of screens, often customized locally on the
| application, and removing JS (or even just writing pure js)
| hurts a lot. That's... hard to do with minimal js. Really,
| really hard.
| aminerman wrote:
| He was just unable to follow and understand the trend, and
| thinks that therefore the whole industry made a MISTAKE :D
| barbarbar wrote:
| `
| vgel wrote:
| > Be kind. Don't be snarky. Have curious conversation;
| don't cross-examine. Please don't fulminate. Please don't
| sneer, including at the rest of the community.
|
| https://news.ycombinator.com/newsguidelines.html
| jaywalk wrote:
| First of all, this is uncalled for. Second of all, it's not
| even an SPA. Maybe do the slightest bit of research before
| slinging shit at someone?
| wackget wrote:
| >> He was just unable to follow and understand the trend, and
| thinks that therefore the whole industry made a MISTAKE :D
|
| That's not true, though. If you read [his next blog
| post](https://gomakethings.com/how-to-make-mpas-that-are-as-
| fast-a...) you'll see he has lots of experience with
| architecting an advanced multi-page application which works
| and behaves much like an SPA.
|
| It makes his anti-SPA post kind of redundant and a bit
| hypocritical, but he clearly knows roughly what he's doing.
| amackera wrote:
| I think it's just regular old click bait.
| antihero wrote:
| It does feel like the tiring contrarianism type of heading as
| opposed to a particularly well thought out article.
|
| In the same way I feel lesser able coders seem to dwell on
| shit-slinging against tech that is proven, works, and has
| solved innumerable problems when they bang on about how
| things were so much nicer with vanilla JS and how frameworks
| are lazy and slow or something, in order to cultivate a sense
| of superiority.
|
| Any well made tech has it's place, skill and experience are
| about knowing which tech should be used where.
| jdrc wrote:
| > However, for an application with a persistent UI, I fail to
| see how constant page loads and navigation just because "the
| browser can do this" make any sense at all.
|
| in the same way how re-rendering the screen in a 3D game for
| every frame does it. Or how you buy a new pair of jeans instead
| of meticulously learning how to patch the old ones. It solves a
| lot of problems even if it sounds suboptimal. It was the
| standard practice when computers and networks were much much
| much slower, therefore it cannot be that bad.
|
| I think SPA and their entire ecosystem give some sense of
| optimality to purists which is probably shortsighted and wrong.
| pictur wrote:
| I have always wondered how people gain this self-confidence.
| beardedman wrote:
| AtNightWeCode wrote:
| ANY modern site uses something like nextjs or any other static
| site generator. The q is then if you make the site isomorphic or
| not and how the need for dynamic content looks.
|
| There are no other viable options today for large professional
| sites.
|
| If you have the problems described in the article you probably
| are not using a web framework.
| mi100hael wrote:
| I think people have forgotten how easy it is to set up a
| traditional server-rendered site with Spring Boot or Django or
| whatever framework. These days I see people adding a SPA as the
| default starting approach, which adds an entirely separate
| additional tech stack & deployable to the mix when it's not
| usually clear why.
| TedDoesntTalk wrote:
| If you don't start with an SPA, you are looked at funny. Like
| maybe if you were to choose COBOL for the backend code.
| stevebmark wrote:
| Don't limit this to SPAs, include the Jamstack, which has all the
| same problems, and the false promise that if you can statically
| render a few pages or parts of pages and put them on a CDN,
| everything will be fast. It won't, because to load dynamic
| content, you still have to do a lot of work and talk to a (gasp)
| centralized API over the internet.
|
| SPAs and Jamstack favor developer convenience over end user
| experience. Let's have fewer loading spinners, and more SSR-by-
| default for pages with dynamic content.
| Graffur wrote:
| > developer convenience
|
| This is really, really important though.
| kizer wrote:
| But there's a cost savings, right? JSON requests for just the
| data necessary vs. sending the whole HTML page each time.
|
| Personally I'd prefer to develop a website the old-fashioned
| way, but I see that the bandwidth savings is a major point for
| SPAs and if you're running a business...
| stevebmark wrote:
| SSR by default, and then if you want, client side hydration
| and navigation so subsequent page loads happen in the client.
| However, the size difference between an HTML response and a
| JSON response is negligible, and HTML responses don't have to
| wait for Javascript to download, parse, execute, kick off off
| a request over the internet, get the data back, execute the
| result, and update the DOM. Browsers have literally decades
| of optimization to show HTML to users as fast as possible,
| and doing this in Javascript is fundamentally slower.
| simonw wrote:
| It's been so frustrating watch this play out over the past
| decade.
|
| I keep seeing projects that could have been written as a
| traditional multi-page application pick an SPA architecture
| instead, with the result that they take 2-5 times longer to build
| and produce an end-result that's far slower to load and much more
| prone to bugs.
|
| Inevitably none of these projects end up taking advantage of the
| supposed benefits of SPAs: there are no snazzy animations between
| states, and the "interactivity" mainly consists of form
| submissions that don't trigger a full page - which could have
| been done for a fraction of the cost (in development time and
| performance) using a 2009-era jQuery plugin!
|
| And most of them don't spend the time to implement HTML5 history
| properly, so they break the URLs - which means you can't bookmark
| or deep link into them and they break the back/forward buttons.
|
| I started out thinking "surely there are benefits to this
| approach that I've not understood yet - there's no way the entire
| industry would swing in this direction if it didn't have good
| reasons to do so".
|
| I've run out of patience now. Not only do we not seem to be
| learning from our mistakes, but we've now trained up an entire
| new generation of web developers who don't even know HOW to build
| interactive web products without going the SPA route!
|
| My recommendation remains the same: default to not writing an
| SPA, unless your project has specific, well understood
| requirements (e.g. you're building Figma) that make the SPA route
| a better fit.
|
| Don't default to building an SPA.
| rektide wrote:
| > _It 's been so frustrating watch this play out over the past
| decade.
|
| > _I keep seeing projects that could have been written as a
| traditional multi-page application pick a SPA architecture
| instead, with the result that they take 2-5 times longer to
| build and produce an end-result that's far slower to load and
| much more prone to bugs.*
|
| Its been frustrating seeing the webplatform _not_ play out,
| seeing so little growing in to SPAs, so little maturing.
|
| Url-based routing is heavily under-represented, tackes on only
| by the one or two blokes who happened to have some memory of
| web architecture. This clairifies the architecture both
| internally & externally.
|
| As bad a problem, single page apps being stuck, forever, at
| single-bundle apps is phenomenally sad. Splitting bundles into
| chunks as a manual development task is so hard, so bad. The
| goal of having web based modules almost made sense, almost
| happened, but we rafically underinvested in transport
| technology, cache-digest going undelivered. I continue to think
| js modules, with import maps- the key tech to making modules
| modular- is worth it, would help make our architecture so much
| better. There is mild extra time to first load, but worth
| it/small, & cached after.
|
| Again we're damned though. Years too late to try & see how
| excellent it would be to have something like react cached & AOT
| compiled as from a cdn. Because now privacy concern freak-outs
| mean this huge advantage of only needing to pull & potentially
| compile a js module once are gone: site-partitioning rules. We
| could have had better architecture, been using the language not
| absurd bundlers, and enjoyed high cache bit rates for common
| libraries. SPAs just didnt care, never tried at all, we all
| (almost all) did a horrible job & took way way too long (over a
| decade) to make modules modular g usable. There was so much
| hope g promise & such abaurd non-delivery, on the module front,
| on app archtiecture.
|
| HTTP3 and early-hints still have some promising hopes for
| accelerating our transports, making "just modules" a
| possibility & fast, without careful hand optimization. We could
| still do more to optimize bundles, have automated tools that
| analyze up front versus on-demand dependency bundles, build
| http bundles of these. But i hope eventually itcs mostly not
| super necessary to build webpackage (nor far worse, webpack)
| bundles.
|
| SPAs still have great potential. More so, now that we finally
| have some support tech for modules forming.
| rapind wrote:
| It's all about state management IMO. There are legitimate
| reasons to keep UI specific complex temporary state on the
| client that would be more complex (and slower) if the server
| needed to hold it. So an SPA or at least partial SPA in some
| situations does makes sense.
|
| But it does tend to become a hammer for every screw over
| time...
| polished85 wrote:
| I initially thought part of the appeal was offloading the
| workload to the front end, where your processing power scales
| infinitely with each user's device. Maybe the benefit turned
| out to be negligible, I'm not really sure. Can server costs be
| reduced by offloading the work to the front end?
| gnlrtntv wrote:
| They absolutely can, if your workload is ideal for this
| situation, but unfortunately, the most "expensive" (in terms
| of time, money, computing power, you name it) part of giving
| a user information is typically the filtering and collation
| of that information from a much larger pool of information --
| almost always a pool of information that is far too big and
| too private to just send to the client to sort through
| locally.
|
| Even in the most simple scenarios, you quickly find your
| limits. If you get data back, but it's paginated (and it
| almost always has to be, for basic reliability reasons as
| much as anything else), you can't be guaranteed to have the
| complete set of data in a given circumstance, so you can't
| perform operations like filtering, pivoting, or sorting that
| data locally. You have to ask the server to do this for you
| and wait for the response, just like we've had to in the
| past.
| somishere wrote:
| Dynamic loading of content is a feature of SPAs, but it's
| not a defining feature, nor unique. In fact, one defining
| feature of SPAs is the offline capabilities (service
| workers, caching, etc.), which sits at a bit of a tangent
| to database considerations like this.
| freedomben wrote:
| This was one of the appeals initially, and would certainly
| still be true if you were doing something very processor
| intensive that could securely be done on the client.
|
| Languages/runtimes have gotten faster and more optimized,
| while hardware has continued to move forward. It's also far
| easier now to add more backend instances using orchestrators
| like k8s, so it's less of a big deal to have to add replicas.
| somishere wrote:
| > Can server costs be reduced by offloading the work to the
| front end?
|
| I would say yes. One significant benefit of SPAs is that you
| can produce fairly complex applications without any server
| logic, only static hosting. The workload is essentially
| offloaded to the build process and the front-end. You still
| need to carefully consider the effect on e.g low powered and
| js-disabled devices ... but these are straightforward
| considerations.
| [deleted]
| finniananderson wrote:
| Totally agree.
|
| We built a product in ~5 months with real-time collaboration,
| extensive interactivity, Oauth, Stripe and Gmail integrations
| with a standard Ruby on Rails stack.
|
| It's rock-solid, performant, dead-simple and extremely
| productive to work with.
|
| Why're we throwing away years of learning to build unstable,
| complex and inaccessible applications?
| rapind wrote:
| One could argue rails is just doing a decent job of hiding a
| monstrous amount of unnecessary complexity from you for basic
| CRUD stuff. It's good at this... until it isn't. In the the
| whole ORM abstraction (not just in rails) is questionable.
|
| The way most of us would handle authorization in something
| like rails is a leaky abstraction, especially when we're
| usually backing onto postgresql which has very mature roles
| and permissions.
| whatshisface wrote:
| > _Why 're we throwing away years of learning to build
| unstable, complex and inaccessible applications? _
|
| 1. Smart people seek out difficult problems.
|
| 2. Difficult problems drive the creation of complex, niche
| tools, that bear cultural associations with the smart people
| who made and use them.
|
| 3. People who want to be smart seek out complex, niche tools.
| delusional wrote:
| I think you're somewhat right, but it's not the whole
| story. There's another pipeline that goes something like:
|
| 1. Technical software problems are more fun than difficult
| product problems
|
| 2. Programmers would rather solve fun problems
|
| 3. Programmers end up creating technically elaborate
| machines to solve simple (buy annoying) product problems
| fossuser wrote:
| I think it might be simpler?
|
| The more complex products are the only ones that typically
| have any documentation or up to date learning resources.
|
| You want to learn how to build a thing and this is the only
| thing that really exists, is up to date, and works.
|
| It may not be the right tool, but for someone new it's
| impossible to tell what the right tool is and people online
| are stereotypically obtuse and about anything tool related.
| heyitsanewacco wrote:
| lmao yeah pretty much. I'm moving from a low code shop to
| Node/Vue because I can't keep people. They all want to pad
| their resume, so I'm going to build at 2x the cost just so
| I can keep the projects going.
| whatshisface wrote:
| The level of Node/Vue isn't padding your resume in this
| industry, it's having a resume. Padding your resume would
| be... I don't know, Elm?
| diordiderot wrote:
| I think this is a midwit[0] take.
|
| Low: simple good
|
| Mid: optimized good
|
| High: simple good
|
| 0: https://knowyourmeme.com/memes/iq-bell-curve-midwit
| com2kid wrote:
| > And most of them don't spend the time to implement HTML5
| history properly, so they break the URLs - which means you
| can't bookmark or deep link into them and they break the
| back/forward buttons.
|
| The majority of routers for React, and other SPA frameworks, do
| this out of the box. This has been a solved problem for half a
| decade at least. A website has to go out of its way to mess
| this up.
|
| That aside,
|
| SPAs are great for a number of reasons:
|
| 1. You aren't mixing state across server and client. Single
| Source of Truth is a thing for a good reason. If you have a
| stateful backend, and your front end naturally has the state of
| whatever the user has input, you now have to work to keep those
| two in sync.
|
| 2. You need a beefier backend. A SPA backed by REST APIs is
| super easy to scale. nginx can serve up static resources (the
| JS bundle of the site) LOLWTF fast, and stateless REST apis are
| easy peasy to scale up to whatever load you want. Now you just
| have to worry about backend DB, which you have to worry about
| with non SPAs anyway.
|
| 3. Less languages to deal with. If you are making a modern site
| you likely have JS on the front end, so with SPA you have JS +
| HTML. With another backend framework you now have
| JS+HTML+(Ruby|Python|PHP|C#|...), and that back end code now
| needs to generate HTML+JS. That is just all around more work.
|
| I agree some sites shouldn't be a SPA, a site that is mostly
| text content consumption, please no. A blog doesn't need to be
| a SPA. Many forums, such as HN, don't need to be a SPA.
|
| But if a site is behaving like an actual application, just
| delivered through a web browser, then SPAs make a ton of sense.
| the_gipsy wrote:
| > The majority of routers for React, and other SPA
| frameworks, do this out of the box. This has been a solved
| problem for half a decade at least. A website has to go out
| of its way to mess this up.
|
| 99% of SPAs break history related features in some way.
| ozim wrote:
| 99% of people don't FRICKING care.
|
| Most of the users I have to deal with still have problems
| with double clicking.
|
| They don't understand basic browser features.
|
| They don't understand that they can set preferred language
| in their browser.
|
| History related features are not an argument in any way.
| freedomben wrote:
| I agree with all your points, but I think it's worth pointing
| out that those benefits you mentioned are largely _for the
| developers_. As a consumer I love a well-written SPA when the
| problem set calls for it, but most of the SPAs I have to use
| are garbage. I don 't fault the tech for that, although I
| suspect that a lot of those SPAs were created by "me too"
| people that just wanted to build a SPA. When React was in the
| pre 1.0 days, I did that, and several people on my team as
| well (so I'm not casting any stones here, just trying to
| state facts).
|
| Last time I bootstrapped a React SPA I don't think cra
| includes a router ootb.
| simonw wrote:
| "A website has to go out of its way to mess this up."
|
| I know it's supposed to be easier, but I keep seeing teams
| mess this up.
| WhitneyLand wrote:
| All of your benefits seem to come from using only rest APIs
| to drive to site. That alone can be done with any site, but
| SPA usually implies more.
| krisrm wrote:
| I always thought of the benefits of SPAs more as a separation-
| of-concerns thing. You can pretty effectively build a
| functional front-end web application and mock a set of back-end
| REST apis, while another team builds out a the back-end. There
| are absolutely tradeoffs, and being a good software engineer is
| about understanding where and when those tradeoffs apply.
| ar_lan wrote:
| That's not really unique to SPAs, right?
|
| I don't know much about front-end development but I imagine
| you can create a front-end that is both not an SPA, and not
| server-rendered.
| krisrm wrote:
| It's not about being unique, or what you can/can't do. You
| certainly can mock a front end with a ssr app, but it gets
| messy when you are building a rich client app and need to
| start sharing state back and forth.
| simonw wrote:
| That's definitely true at the organizational level, and it's
| an argument with some merits.
|
| In practice though, I've seen this backfire. You end up with
| the frontend team blocked because the API they need isn't
| available yet, and then the backend team gets blocked because
| they shipped the API but they can't use it to deliver value
| because the frontend team don't have the capacity to build
| the interface for it!
|
| My preference is to work on mixed-skll teams that can ship a
| feature independently of any other team. I really like the
| way Basecamp describe this in their handbook:
| https://github.com/basecamp/handbook/blob/master/how-we-
| work... - "In self-sufficient, independent teams".
| ngcazz wrote:
| that sounds like a mismatch between the architecture and
| how work is getting planned no? if the backend is in the
| critical path to delivering the user value of a feature
| then the backend and frontend engineers need to be
| developing (and testing) the feature together
| lazide wrote:
| They ALWAYS need to be building and developing the
| feature together or this happens. Decent API design
| without deep understanding of Client implementation or
| performance needs is nearly impossible.
|
| They generally should all be in the same team, but that
| often doesn't scale.
|
| Not having them in the same team pretty much never works
| well though either.
| evanweaver wrote:
| I know people for whom the traditional way of building a web
| app is completely foreign. I am curious how you would describe
| the concept and tools to someone who has never encountered them
| before outside an SPA architecture.
| craigkerstiens wrote:
| Hi Simon, why'd you pull me in ;)
|
| We recently went a rewrite of our frontend for
| https://www.crunchybridge.com from SPA to more "basic" request
| response app and couldn't be happier. Previously was SPA with
| React and we rebuilt from scratch with request/response using
| Node. In places we still leverage react components for re-
| usable frontend bits, but no more SPA and state management.
|
| As you've mentioned in some of your other threads on this, the
| state management and sync between the API team and the front
| end team just caused velocity to slow down. It took longer to
| ship even the most basic things. While we want a clean and
| polished experience, the SPA approach didn't really accomplish
| any of that for us.
|
| The rewrite was under 8 weeks of an app that had been built up
| over a couple years and we quickly recouped all that time in
| our new found velocity.
| Graffur wrote:
| That just sounds like poor performing developers to me. You
| don't need snazzy animations between states. Just not reloading
| the full page is a benefit.
| wooque wrote:
| I, as a user, hate them with passion.
|
| I regularly stumble upon stale data in SPAs, even in big names'
| like Linkedin, Jira, Github, etc. I wonder how the hell
| corporations with thousands of engineers, lot of them being
| brightest engineers in the world, can't make proper SPA.
|
| Can we just go back to server side rendered pages, with a bit of
| JS sprinkled in, please.
| Jcampuzano2 wrote:
| Interesting that you use Github as an example, when Github is
| not an SPA. So basically just admitting these problems aren't
| necessarily inherent to SPA's, but to the developers/teams
| building them. They may just be a bit harder to get right in
| SPA's.
| tmcw wrote:
| Github is not an SPA. They use the middle road of dynamically
| loading HTML snippets, using webcomponents, and lightweight
| JavaScript. Any problems you see with most of Github's
| interface should be chalked up to server-rendered pages with
| sprinkled JS.
| deergomoo wrote:
| > Github
|
| GitHub is a great example of a site that would benefit from
| actually being an SPA, imo. It _is_ server rendered pages with
| JS sprinkled in, and you can easily end up in the situation
| where parts that live update fall out of sync with parts that
| don 't. For example, being able to see that an issue is closed
| while the badge on the Issues tab still says you have one open.
|
| I share your general sentiment over the state of them though.
| It's not actually that hard to avoid breaking navigation
| buttons, having links open in new tabs correctly etc, so I
| don't know how it gets screwed up so much.
| jdrc wrote:
| the frustrating thing is that i rarely find a page that doesnt
| take at least 20 seconds to load, even if i only want to see an
| 100x100 image. This happens no matter how fast computer i use and
| it 's despairing
|
| The term "server-side rendering" gives me giggles every time
| shroompasta wrote:
| It's posts like these where I can feel the age of HN.
|
| For many developers, especially in startups, SPAs are all they've
| ever known.
|
| Now, I'm relatively young, but I'm old enough to know monolithic
| django before moving onto angular then onto react, and it is
| quite staggering what I'm capable of doing in SPAs as opposed to
| traditional web pages.
|
| You mentioned Soundcloud and Youtube, but you'd be lying to
| yourself if you think the list comes even close to even stopping
| there.
|
| How about fantasy drafts in DraftKings, Sleeper, or FanDuel?
|
| How about chess like chess.com or lichess?
|
| How about collab tools like Trello, Monday, or Asana?
|
| I wouldn't even dream of building these types of applications in
| a traditional web app
|
| The level of interactivity that is capable within SPAs makes
| applications like these seamless and snappy, and overall feel-
| good for the user.
| mattlondon wrote:
| Most of that navigation stuff is long-solved - e.g. Angular's
| router will do a lot of that.
|
| If you want to do a SPA without a modern library, then yes you
| will need to reimplement a bunch of stuff. But who would start
| from scratch? Unless you are doing something incredibly niche or
| tiny-tiny-tiny, just use Angular or React or whatever and don't
| worry about the minutiae.
|
| Of course there will now be people screaming at their screen
| about how this attitude is everything that is wrong with the
| modern web etc. I am sure they'll get over it one day, or just go
| use gopher/Gemini if not.
| teilo wrote:
| Use them where they make sense, and don't get religious about it.
|
| I recently wrote a site to track Apple-silicon-native audio
| software. It works great as an MPA. It's fast, organized, and
| easy to use.
|
| And the first thing someone offered as a suggestion was: "Why
| don't you use https://www.sanity.io/ for the content and nextjs
| or gatsbyjs for the front end?"
|
| I can't even.
| winslett wrote:
| SPA's #1 draw back is that you have to rebuild browser
| functionality inside of the browser.
|
| The browser natively handles internet connectivity, back /
| forward buttons, refresh buttons, URL management. Additionally,
| users have been trained to understand the responses, hit the
| refresh button, and use the back button. Browsers have gotten
| better at distinguishing between your internet being down and the
| website being down.
|
| Good SPAs have to rebuild all of that functionality.
| Zaskoda wrote:
| In my humble opinion, SPAs are not the fundamental mistakes. SPAs
| are applications. There's nothing wrong with having applications.
| The mistake was not maintaining a distinction between
| applications and content. The difference between a static
| document, a collection of hypertext documents, and a web
| application is very blurry. If it were less blurry, there would
| have been things we would have been able to do that we are not
| currently able to do.
| gherkinnn wrote:
| Most major frameworks do that. Barring some devs who navigate
| using onClick over a link despite having that option.
|
| Outside of some lasting mistakes made a decade ago, is this still
| an issue?
|
| On top of that, "SPA" is a misnomer, as many frameworks give you
| a hybrid anyway.
| udbhavs wrote:
| I don't know why routing is the sole focus of the article. In
| all my SPAs it has been a set up once and forget about it deal.
| No one is constantly reinventing the wheel there, the churn is
| in other areas like reactivity and state management.
| barrenko wrote:
| Zanfa wrote:
| I think one of the unsolved problems of client-side interactivity
| on websites is how difficult it is to add it just _a little bit_
| of extra client-side functionality to a traditional server
| rendered website. For example, recently I had to deal with photo
| uploads on a Rails app, which works fine out of the box at first,
| until you want to show progress bars and uploaded previews etc.
| Then you add a couple of client-side Stimulus controllers, maybe
| a Turbo frame here and there and it works, but then you get to
| browser navigation and you 're screwed, because none of this
| works if somebody were to submit the form, then navigate back.
| Now you have to implement lifecycle handling to account for
| navigation and once you're done, you've basically implemented a
| SPA, except it's broken into a mix of tightly-coupled Javascript,
| Ruby and ERB templates.
| beaconstudios wrote:
| Progressive enhancement was largely solved before SPAs became a
| thing. Its quite easy to enhance the client side incrementally,
| but SPAs started out as useful for full on Web apps and now
| everybody uses them by default for some reason.
| garyrob wrote:
| "I think one of the unsolved problems of client-side
| interactivity on websites is how difficult it is to add it just
| a little bit of extra client-side functionality to a
| traditional server rendered website. " I've started using
| django-unicorn lately and I'm hopeful that it may solve that
| problem for many use-cases.
| kaba0 wrote:
| It was probably never too beautiful of a technique, but JSF
| does solve this problem splendidly. You basically have a view-
| flow besides the usual ones and it can act in many of the ways
| SPAs can.
| CPLX wrote:
| Yeah can someone fix this please. I'm experiencing the same
| thing with a rails app I'm currently building.
|
| In all seriousness it feels like there must be an elegant way
| to do more responsive modern functions while keeping the core
| server rendering concept. It's 2022 after all. But no I don't
| know a good solution either.
| ysavir wrote:
| > Then you add a couple of client-side Stimulus controllers,
| maybe a Turbo frame here and there and it works fine, but then
| you get to browser navigation and you're screwed, because none
| of this works out of the box if somebody were to submit the
| form, then navigate back. Now you have to implement lifecycle
| handling to account for navigation and once you're done, you've
| basically implemented a SPA, except it's broken into a mix of
| tightly-coupled Javascript, Ruby and ERB templates.
|
| Where in this process did you need to start adding navigation
| via JS? Did that functionality _really_ require JS, or was it
| implemented that way just because other parts are JS, and the
| trend was continued? Could you have used Stimulus controllers
| to manage functionality on the page itself, but when it came
| time to navigate to a new page, just done a basic browser
| redirect?
|
| Saying that SPAs is a mistake doesn't mean that a strong
| dependence on JS or frameworks in a mistake. It just means that
| trying to make an entire site fit into a single page load
| introduces more costs than savings. You can still have pages
| controlled via React or Vue or Stimulus, but forgoing the
| router functionality.
|
| In my own apps, I use Vue and VueX to control page behaviors,
| but each URL is its own Rails page. For example, I have a
| search page that uses Vue and VueX to asynchronously load,
| filter, and display search results. Clicking on a result is a
| basic browser redirect, taking you to the result's page, doing
| a full Rails page load, and again using Vue and VueX to manage
| any dynamic state (any static content is rendered via ERB
| files).
|
| This has created a very clear and simple structure that allows
| each page to have any dynamic functionality it needs, but no
| complications from having to maintain navigation or browser
| history via JS. The browser already does that natively, and I
| get to spend my time working only on actual features--not
| recreating the browser's built-in functionality, or debugging
| my own take on it.
| Zanfa wrote:
| > Where in this process did you need to start adding
| navigation via JS? Did that functionality really require JS,
| or was it implemented that way just because other parts are
| JS, and the trend was continued? Could you have used Stimulus
| controllers to manage functionality on the page itself, but
| when it came time to navigate to a new page, just done a
| basic browser redirect?
|
| In my specific example, the navigation itself didn't happen
| through JS, but you need to hook into navigation APIs to
| handle backing into a partially-filled form after submitting
| to rebuild the UI to reflect the state before the user hit
| submit. To make things even more fun, Turbo/Stimulus
| (sometimes?) breaks bfcache in Safari & Firefox so they
| behave different from Chrome.
|
| Personally, I detest the vast majority of SPAs, especially
| the ones from Google, Facebook and Linkedin. Not even sure
| what they do to make them so horribly slow to use.
| ysavir wrote:
| Thanks for sharing! That helps me understand things better.
|
| > you need to hook into navigation APIs to handle backing
| into a partially-filled form after submitting to rebuild
| the UI to reflect the state before the user hit submit
|
| Was this a hard requirement for the feature or just a nice-
| to-have? I understand why you'd want that behavior ideally,
| but it also seems the sort of thing that adds much
| additional complexity for a problem that isn't (at least in
| my eyes) severe. Having people re-fill things isn't too
| much of an ask, I think, and if it's something crucial, it
| might be better served with a preview page that allows
| additional changes. Or a "Make changes" link that redirects
| to a page that can load from the submitted state. There are
| easier ways to handle it than manually controlling
| navigation.
|
| But yeah. If the behavior is a hard requirement from the
| business/product side of things, then using an SPA is no
| longer an architectural decision made for technological
| purposes, but is a feature requirement from beyond. And
| that's a whole different matter.
| Zanfa wrote:
| A little bit of both probably. Supporting it when
| navigating back is probably a nice-to-have, but
| persisting file upload previews etc through a form submit
| that might fail due to some unrelated ActiveRecord
| validation (maybe a blank field) is a must.
| timr wrote:
| > In my specific example, the navigation itself didn't
| happen through JS, but you need to hook into navigation
| APIs to handle backing into a partially-filled form after
| submitting to rebuild the UI to reflect the state before
| the user hit submit.
|
| I'm not sure I understand. The "conventional" solution to
| this is not to do it -- the reason browsers don't re-fill
| submitted forms is to prevent duplication. Give users the
| ability to post-backclick-repost and your DB will rapidly
| fill up with duplicate rows.
|
| If you do need to back-navigate to a page that has been
| submitted (say, to edit the submission w/o requiring an
| edit-specific URL), you have the server re-render the form
| with the filled values.
|
| If _that_ isn 't sufficient, you can always push your form
| state on the history stack using the history API, so even
| though this is a bad idea (IMO), you can still do it pretty
| easily without needing to resort to re-writing nav.
|
| I hate to say it, but I feel like a lot of this stuff had
| server-side solutions that _worked fine_ circa 2010, but
| have been almost completely forgotten.
| fuzzy2 wrote:
| But browsers absolutely do keep the form filled unless
| your HTML or JS says otherwise. Pressing back after
| submitting on a vanilla HTML form keeps all values in
| place. As it should.
| timr wrote:
| Not after a post. If you change the form method to get, I
| believe this is the behavior.
|
| There are tons of good reasons to prefer this behavior,
| aside from just avoiding duplicates. Think of login
| forms.
| fuzzy2 wrote:
| Yes, even after POST. Why not try it, right here, on
| Hacker News. The comment form uses POST. I post this
| comment and go back and my text is still in the input
| box.
|
| In fact, browsers even have re-submit built-in: Just
| press F5 on a page that was retrieved using POST. That's
| why so many sites use a redirect after POST.
| [deleted]
| timr wrote:
| Redirect after POST was a pattern created to bypass the
| warnings that (most) browsers emit on back-navigating
| after form submit, while still preventing double-submit
| (by redirecting to the GET):
|
| https://www.theserverside.com/news/1365146/Redirect-
| After-Po...
|
| It sounds like this warn-on-double-submit behavior is
| convention and not required, so maybe it has become more
| common for browsers to stop doing it.
|
| > Why not try it, right here, on Hacker News.
|
| OK, I did. HN does a 302 redirect on comment POST to the
| comment GET. When you back nav, you are seeing the
| response to a GET request to /reply?id=X
|
| (In other words, the form is re-rendered.)
|
| Edit: oddly, however, submitting on form rendered by GET
| /reply?id=X ends up creating a _new_ comment, so that 's
| just weird server logic. It might explain why you
| occasionally see duplicate comments on HN.
|
| Edit 2: _on backnav to a comment edit_ , the redirect is
| to GET /edit?id=X, which is a re-render of the edit form,
| the process I described in my OP. Not sure what's going
| on with the back-after-post...maybe a bug?
| fuzzy2 wrote:
| > When you back nav, you are seeing the response to a GET
| request to /reply?id=BLAH
|
| With the text you previously entered, which the browser
| restored. If it did not for you, you have non-standard
| settings like disabled caching. I can assure you that it
| behaves the same on Firefox for Linux, Windows, macOS and
| Safari on iOS: go back, form content is restored.
|
| In fact, the entire internet is full of people trying to
| get rid of this behavior.
| rk06 wrote:
| for simple cases, you can use alpine.js, petite-vue etc.
| However, if you are considering "routing", then it is no longer
| a "little bit".
| hombre_fatal wrote:
| Exactly. I've been in the position various times where I'm
| embedding a JS app on a page to help the user do something
| highly interactive, usually creating/editing content. And then
| as it's expanding to integrate with other things on the site, I
| start to wish more of the site was in the JS-app side of
| things.
|
| Sometimes I realize a SPA would have simply served the user
| better, and it doesn't necessarily take much to be in that
| predicament.
|
| Too many people hate on SPAs by, presumably, just imagining
| static read-only content like blogs and news. Though I'm also a
| bit tired of "SPAs suck amirite, HN?"
|
| Put the user first, consider the trade-offs that work towards
| that goal, and see what shakes out.
| michaelchisari wrote:
| Setting limits for future features to keep the code base
| clean and manageable is something developers could be more
| vocal about.
|
| Acquiescing to every demand product designers and management
| throw into the mix is what turns beautiful, easily-maintained
| codebases into nightmares.
|
| What people are talking about here is writing web apps as a
| series of small, tightly-coupled spas who manage state within
| very specific parameters. And that's a great way to build
| software. Until someone comes in and asks you to draw in the
| state from one section into two other sections. You have the
| choice to say a) no and explain why, to b) create a clever
| "glue" that will be hard to maintain and difficult to
| explain, or to c) take the time to refactor the code into
| something more general and complex to allow for the feature
| on a more abstract level.
|
| Guess which one almost always gets chosen.
|
| The upshot is this: The solution to front-end complexity may
| not be a technical one, it may not require a new framework or
| library. It may be a shift in what we expect out of the web.
| We could always temper our expectations in order to keep our
| code clean.
| themanmaran wrote:
| The end goal of writing code isn't always a "clean and
| manageable" codebase.
|
| Likewise the solution to SPAs isn't "say no to features".
| michaelchisari wrote:
| I'm aware, but the discussion about the failures of spas
| always center around their failures in maintainable code.
| So if one's issues with SPAs are codebases becoming
| unmanageable, the solution won't be technical, it's going
| to be managerial.
|
| A start would be devs communicating to product & design
| what the technical limits are to the current approach so
| that it informs their decisions.
| 9wzYQbTYsAIc wrote:
| > Exactly. I've been in the position various times
|
| This is why React is such a popular JavaScript framework of
| libraries.
| Closi wrote:
| I think the fundamental issue with SPAs is that it's building
| on multiple levels of technology that fundamentally weren't
| designed to support being a single page application.
|
| The browser <-> multiple pages paradigm is pretty much how
| the web evolved, so SPA's just end up being one giant hack to
| get everything working.
|
| UWP/WPF/any other desktop app framework demonstrates how easy
| developing a 'single page application' can be without all the
| cruft you have to add to make a SPA work because it's
| actually a sort-of-massive-workaround.
| hombre_fatal wrote:
| Well, the browser has certainly evolved past the point of
| SPAs being nothing but a hack. The browser has evolved into
| a heavily generalized application environment, as much as
| we may want to bemoan that. A good web client can surely
| demonstrate this.
|
| It's certainly true that you don't get to lean on built-in
| features like history support, but that's why you can now
| drive history with Javascript. And all sorts of other
| things. And if you're smart, you're using a solution that
| handles these things for you.
|
| Rich client development is always hard--on any platform--,
| and you always make concessions for the platform you're on.
| I certainly have to when I'm building iOS apps. But I see
| no reason for this to dissuade you if you can push a better
| UX to the user.
|
| As tried-and-true as server-rendered architecture might be,
| there are all sorts of things it will never be able to do
| no matter how much of a hack you think web client
| development might be. Software is a hack. And at the end of
| the day, your users may remain unconvinced when you preach
| about what the browser was "meant to do" when they begin
| coveting a richer experience.
|
| That's something that's often left by the wayside when we
| discuss these things. We talk about technical superiority
| and become prescriptive about what we think technology is
| for. While fun thought exercises as craftspeople, we too
| seldom talk about delivering value. If leaning into the
| historical nature of the browser supporting HTML pages over
| the wire helps you build a better experience, that's great.
| But that's not the only option you have today.
| kitsunesoba wrote:
| > Rich client development is always hard--on any
| platform--, and you always make concessions for the
| platform you're on. I certainly have to when I'm building
| iOS apps. But I see no reason for this to dissuade you if
| you can push a better UX to the user.
|
| I think the difference is how much you as a developer
| have to "fight" the platform. Having to implement history
| management yourself very much qualifies as "fighting" to
| some extent in my eyes... continuing with native
| platforms as an example, that sort of thing just isn't
| necessary in most cases - like with iOS, 99% of your
| "history" management comes for free with some combination
| of UINavigationController and view controller
| presentation, assuming the use of UIKit.
| somishere wrote:
| History management in handled by the browser in SPAs /
| javascript land too. Apologies if I misread the
| insinuation here.
| [deleted]
| emteycz wrote:
| At least since HTML5 and CSS3 and ES6 (so many years
| already) these technologies _are made_ for SPAs. There aren
| 't many better UI frameworks, and WPF isn't that by a long
| shot.
| sitzkrieg wrote:
| ok dont look up how long grid layout has existed in wpf
| emteycz wrote:
| Who cares? (I know btw I used to be a C# engineer in my
| previous life - I actually first used WPF when it was
| still beta)
|
| Here and now, WPF is much worse. Even Microsoft itself
| now invests into React Native.
| mananaysiempre wrote:
| I mean, grid layout has existed in Tk (the one with the
| Motif look) since the earliest version I can quickly find
| documentation for, 8.2 from August 1999; Wikipedia tells
| me that 'table', apparently an early version of 'grid',
| was introduced in July 1993, that is to say around the
| time Windows NT (and with it Win32) was officially
| released. (And of course plain Win32 never got it,
| seemingly because Microsoft decided they weren't in the
| business of selling toolkits despite USER being one.)
|
| The hard idea from the programmer's point of view is
| automatic layout, not grids; my impression was that Tk
| originated it (it certainly brought it to light), but now
| that I'm looking I'm not sure it wasn't already in Motif
| to some extent, so the roots of the idea might go down
| into the primordial soup of Project Athena and similar
| places.
| efdee wrote:
| In my opinion, UWP/WPF/aodaf makes it easy because it just
| doesn't implement the things a user is used to in a browser
| (bookmarkability, back button, ...).
|
| If you ignore those things in your SPA, much of the "cruft"
| is negligible.
| kaba0 wrote:
| This is pretty in line with grandparent's comment in that
| the browser was simply not made for this - aka SPAs are
| sort of a hack on the traditional page-based approach.
| mike_hearn wrote:
| Many desktop apps have back buttons, and of course mobile
| apps always have them. They're also more reliable; there
| is no desktop/mobile equivalent of the "warning: need to
| re-POST this form" problem.
|
| As for bookmarks, that's semi-right, but the web platform
| conflates the back button with bookmark-ability in ways
| that are quite confusing. If you want the back button to
| get the user out of your settings screen, then you must
| push a new URL onto the history stack using JavaScript,
| but then if the user bookmarks your site they'll bookmark
| the settings screen specifically even though that's very
| unlikely to be what they wanted. Non-web apps that have
| enough content to need something like bookmarks often
| implement a similar mechanism that's more predictable,
| albeit less general.
|
| The OPs article is really a common lament amongst web
| developers - they're (ab)using a tool that was never
| meant for what they're using it for. It's a real and very
| serious problem in our industry.
|
| The whole SPA vs multi-page dichotomy really emerges
| because the web doesn't have sufficiently rich, modular
| or low level APIs. If you look at non-web frameworks like
| iOS or Java then you get a huge number of APIs (usually
| classes) tackling the low levels of a problem, then more
| classes building on the lower levels to give you higher
| level solutions. Those classes can usually be customized
| in many different ways, so the amount of control a
| developer has is enormous. If you start with a high level
| helper class and find you can't customize it to meet your
| needs, you can reimplement it using the lower level
| building blocks.
|
| The web isn't like this. Web APIs are an absolute pigs
| ear of very high level function calls and classes
| designed in more or less random ways to quickly hack
| together a solution to whatever need a browser maker had
| at the time. HTML5 supports peer-to-peer video streaming
| and augmented reality but not a virtualized table view.
| In many cases it's obvious that little or no thought went
| into the APIs, e.g. XMLHTTPRequest has nothing to do with
| XML, you can open a URL for a custom URL handler but not
| detect if that URL will work ahead of time, nor even if
| opening that URL worked once you try it, and so on.
| Instead of starting with low level APIs and composing
| them into high level APIs, browsers start with high level
| APIs and then introduce entirely orthogonal low level
| APIs decades later, or never.
|
| These sorts of problems just don't occur when writing
| desktop apps with professionally designed frameworks -
| even in the rare cases that you hit some limit of the
| framework, you can (these days) just patch it directly
| and ship a fixed version with your app. If you hit a
| problem in the browser you're just SOL and have to hack
| around it.
|
| Our industry needs to reinvigorate desktop apps.
| Attempting to convert browsers into Qt/Java/.NET
| competitors has:
|
| a. Made HTML5 unimplementable, even by Microsoft. It's
| not so much a spec anymore as a guide to whatever Chrome
| happens to do on the day you read it (hopefully).
|
| b. Created tons of security holes.
|
| c. Yielded an atrocious and steadily decaying developer
| experience.
| vlunkr wrote:
| The other thing people who hate SPAs need to think about is
| that rendering blogs/news/static sites isn't a problem that
| developers really work on anymore. Businesses will just pick
| from the huge pile of existing CMSs or hosted solutions
| because it's easier and cheaper. So if you're wondering why
| all these developers are building SPAs, it's because we're
| building custom applications, not blogs.
| mattwad wrote:
| I feel like most people that hate SPAs never have to deal with
| this type of thing, or even only have to work on the backend.
| They just don't get it. Of course, if you're using a SPA for a
| static website, you're also doing it wrong but that doesn't
| mean SPA itself is a bad thing.
| simonw wrote:
| "They just don't get it"
|
| Believe me, I get it.
|
| I dealt with building these kinds of features for a full
| decade before SPAs became fashionable.
|
| Now I'm stuck here watching in frustration as people go all-
| in on SPAs because they didn't know how to solve these
| problems without them.
| rosenjcb wrote:
| I agree. These people hating on SPAs are mostly not frontend
| developers. They're backend devs that think returning an HTML
| page is all you need to do. Modern websites are very complex.
| WillPostForFood wrote:
| Or users who hate watching a whole application load to
| display some text.
| rosenjcb wrote:
| If the only purpose of your site is to load some text or
| an image, go use a framework with SSG like NextJS. Then
| you get fast websites without having to pretend that
| writing stateful updates (e.g. jQuery) to the DOM is fun.
| zippergz wrote:
| I'm living proof that it is possible to simultaneously hate
| SPAs and understand why they are popular. I've built and
| worked on a number of them, I don't have a better alternative
| to recommend, and yet I still hate them because I think they
| are a clunky solution to the problem. We need something
| better, but I'm not smart enough to come up with what that
| should be.
| kitsunesoba wrote:
| I don't think I'm any more smart when it comes to this
| particular issue, but my thought is that the answer
| probably has something to do with more primitives that are
| suited for web applications being provided by web browsers,
| so it's both easier to build a web app without some huge
| gangly framework and so frameworks have more to build on
| top of and less manual footwork introducing room for error.
| [deleted]
| embwbam wrote:
| I agree. I've been thinking about this lately, and have
| implemented something I think is interesting in Haskell.
|
| https://github.com/seanhess/juniper
|
| It's an implementation of Elm (imagine React if you're a JS
| dev), but all logic is executed on the server. State is passed
| back to the server whenever you choose to listen to an event.
| The view is then re-rendered and virtual dom diffed on the
| client. Non-interactive pages are just views. If you want them
| to be interactive, you add a Message an update function.
|
| I used it on a client project and it was pretty delightful.
|
| It probably isn't documented well enough yet to make total
| sense, but I think it's a step in the right direction.
| simonw wrote:
| This is what jQuery solved. It made it ridiculously easy
| (compared to not using jQuery at that time) to add a little
| sprinkle of progressively enhanced JavaScript to a page. It
| still works today (and you don't even need jQuery now, as
| browser standards have mostly caught up), but everyone seems to
| have forgotten how to do it!
| MourningWood wrote:
| teach me :)
| adfm wrote:
| HTMX lets you update the url with hx-push-url="true"
| jmconfuzeus wrote:
| Progress bars and previews are simply a matter of attaching an
| events to the http request and file input respectively.
|
| When someone submits a form and navigates back, don't you just
| re-display the empty form?
|
| If it needs to be a form bounded with the uploaded file (maybe
| as part of a wizard), then why not ask the server for it
| instead of storing client side state?
|
| Maybe using Javascript without a SPA looks hard because you're
| trying to avoid storing state on the server as well as bypass
| native browser features.
| pvorb wrote:
| Did you have a look at https://htmx.org/ ? I think it solves
| the "just a tiny bit of interactivity on an MPA" kind of thing.
| thr0wawayf00 wrote:
| This is my biggest gripe with the direction of Rails.
|
| I completely understand the historic reasons for wanting to
| keep JS to a minimum and stay within ERB/Ruby, but the JS
| component-driven UI pattern feels like the correct front end
| architecture for most commercial projects these days,
| especially now with better JS tools like Svelte, which feels
| like rails for the front end to me.
|
| I started playing around with InertiaJS recently and I
| absolutely fell in love with it. I was surprised to see how
| niche it still is because it's pretty much what I've dreamed
| what writing JS with Rails could be for the last 5 years.
| xwdv wrote:
| This problem you described is exactly why SPAs will continue to
| dominate over the traditional server rendered websites.
|
| Often when I see people arguing against SPAs, they are peddling
| trivial toy websites that don't do much and don't change much.
|
| When you need to build a serious application on the web with
| quickly growing feature sets and complex state management, just
| use a SPA. It's 2022.
| jmconfuzeus wrote:
| The Basecamp guys created Hey which is a mail app not
| implemented as a SPA. It's probably the fastest mail app I've
| ever seen while delivering around 40kb of javascript.
|
| If Hey is a toy app you then you must be working on some
| truly alien projects from the future or something.
| mdoms wrote:
| At the risk of a pile on, this is what jQuery was brilliant
| for. And frankly the native browser APIs have caught up enough
| that scenarios like what you want to achieve are simple to
| implement with just a script tag and a sprinkling of JS. I
| don't know what "Stimulus controllers" or "Turbo frames" are
| but they don't sound necessary.
| specialp wrote:
| Yes. Nobody should have to make a SPA to accomplish what
| JQuery did with sprinklings of JavaScript. JQuery was
| maligned because many people used it to make all XHR requests
| all over the place resulting in non-deterministic async
| behavior. JQuery was made to make adding small bits of JS
| easy and work in almost all browsers.
|
| Bringing in React and turning that non-deterministic events
| firing all over the place greatly improved that situation,
| but this has become if someone needs JS, bring in SPA
| framework. This is in spite of the browser world getting much
| better. So just as JQuery was used to make SPAs to bad
| effect, SPA frameworks have been used to do minimal JS
| actions in a bad way.
| te_chris wrote:
| Phoenix LiveView really does solve a lot of these problems.
| ordinaryradical wrote:
| I was just going to say this sounds like a great example of
| something that Elixir, LiveView, plus maybe a little
| Alpine.js could handle...
| myfavoritedog wrote:
| alskdjflaskjdhf wrote:
| Inertia [1] is an interesting project in this space that might
| solve some of your problems. I haven't used it, but I believe
| the general goal is to make it easy to "plug in" client-side
| frameworks (React, Vue, Svelte) into server-side views.
|
| [1] https://inertiajs.com/
| amelius wrote:
| Yes. The fitness of an architecture can be partially measured
| by looking at the cost of feature updates.
| dlisboa wrote:
| The problem is the mixing and matching of state management. In
| a traditional web app all of the state is in the back end, in a
| SPA all of the state is in the front end. When we share state
| in between the two it's often messy.
|
| To me the answer feels like it should be "traditional web app
| for most things, components-as-first-intended for some things".
| The simplest React example is just one component that abstracts
| presentation and logic. The only state is its own. It does not
| handle an entire web app as a SPA, no Redux, prop drilling,
| it's just the idea of a reusable component as an HTML tag. Same
| with VueJS and all. If we restrict ourselves to that we're in
| the good path.
|
| If there was already an HTML tag for your own specific problem,
| wouldn't you just use it in your traditional server-rendered
| app? A `` tag that does exactly
| what you want. Or a `` tag.
| We should create just those components, either in
| React/VueJS/Whatever or in vanilla JS Web Components, and live
| with the rest as we used to.
|
| We're basically saying that some parts of our apps are too
| difficult to mix and match state management, and we should
| offload all of the state to one of the two sides. In some rare
| apps indeed all of the state should be on the front end, but
| the use cases for that are just not as big as they're made out
| to be.
| ithrow wrote:
| Agree, we just add React components here and there to server-
| side rendered HTML and it works great for us. The issue is
| most companies want separate teams for front-end and back-end
| and each team wants clear separation of boundaries and
| responsibilities between them.
| beebeepka wrote:
| Adding components here and there sounds like a simple app.
| Nothing wrong with that, if course.
|
| Different teams exist for a reason. I've deeply regretted
| working in "we have real Devs that can do it all"
| environments.
|
| It's not so much about boundaries as it is about
| competence. Or lack of it with
| [deleted]
| jkcxn wrote:
| Yes this is exactly right. What I've done in the past is use
| Django to return HTML with JSX mixed in, and have a super
| lightweight SPA frontend that just hydrates the react
| components on each load. You can also use form state to
| communicate back and forth with the server, where sending a
| response doesn't refresh the entire page, just a react render
| diff. With this you get the best of both worlds where your
| backend can do the heavy lifting where everything it needs to
| decide on the view is all in one place, and your frontend
| just comprises of really really generic JS components.
|
| I have a library I've been playing around with for 2 years
| now, I should package it up
| prmph wrote:
| Exactly, the best approach seems to be where the app is
| composed of traditional pages with server navigation between
| them, but each page is implemented as an SPA.
|
| This approach eliminates the need for a client-side router,
| keeps any centralized page state small, and improves the SEO
| and bookmarkability of the app.
|
| I have implemented this architecture in several projects, and
| it's effective
| trevex wrote:
| Isn't this basically what NextJS and NuxtJS provide, if you
| only leverage their static rendering?
| [deleted]
| hughrr wrote:
| The correct answer for this stuff, and it absolutely kills
| me saying this, is probably something like asp.net web
| forms.
| manigandham wrote:
| Why does it kill you to say that? It's the better and
| more productive option.
| hughrr wrote:
| Because I abandoned it thinking it was terrible. Then I
| spent a decade finding out how bad everything else was.
| chrisweekly wrote:
| Please, go learn about Remix (https://remix.run), it is
| the actual correct answer for this stuff.
| pphysch wrote:
| I don't understand why they choose an example -- a simple
| user dashboard -- that could be easily implemented as a
| traditional MPA. It seems like Remix is mainly for the "I
| learned to program with SPAs" audience.
| mattmanser wrote:
| Asp.net web forms absolutely sucked. They fundamentally
| misunderstood HTML and how the internet even worked.
|
| Modern Razor's pretty good (not Razor Pages, they also
| suck) which is probably what you mean.
|
| But it's not that much different from Rails, Laravel,
| Django, etc.
| hughrr wrote:
| Yes I mean the original version of it.
|
| I'd love to watch people attempt to implement some of the
| stuff I pulled off with that back in the day now.
| Occasionally, very complex data driven page flows are
| required and you could nail that entire problem domain
| trivially with them.
|
| There is a very large and well known company with a
| front-facing product used by millions of people which
| took 5 years pissing around with three different front
| end technologies to reimplement what we did in 3 months
| with that and it was slower and heavier and basically
| reimplemented web forms in python in the end.
|
| It broke the the www intentionally because it sucked. And
| it still does.
| manigandham wrote:
| What's wrong with razor pages? They're fantastically
| simple and productive.
|
| And WebForms wasn't a misunderstanding. It was a
| deliberate and brilliant design that brought WinForm
| developers and their experience to the web and allowed
| them to build complex web apps two decades ago that still
| work to this day.
| zerkten wrote:
| It's contextual. For me, WebForms fell down because it
| let the average web developer impose too many "costs" on
| internet-facing projects. A WinForms developer is a very
| specific kind of developer with a high focus on
| development of internal, or line-of-business (LOB) apps.
| WebForms also excelled at this, but brought more reach as
| people moved away from a preference for desktop apps.
|
| The height of WebForms coincided with an embrace of web
| standards and accessibility which flows into the Web 2.0
| era. You had to jump through a lot of hoops to achieve
| what was needed WebForms to get it to behave in a web-
| friendly way. The underlying .NET framework and base of
| ASP.NET (HttpHandler and HttpModule) was outstanding
| though.
|
| (I still build/maintain WinForms, ASP.NET, and WPF apps.)
| UglyToad wrote:
| Yeah, as much pain as it has caused me in the past I
| think the crucial realization Microsoft made with
| Webforms and maybe Blazor is that the stateless model of
| web is fairly crap if you are doing anything beyond
| displaying static text.
|
| For its time it was some cool tech.
| dlisboa wrote:
| I disagree with that. There's no real reason for each page
| to be a separate SPA, most likely only a small part of that
| page will be interactive, and most of it will be cacheable.
| Extracting only the interactive parts of a page into
| components is what I'm talking about. In some cases that'll
| be all of the page, but there are very few apps that meet
| that criteria.
| prmph wrote:
| Of course if only a small part of your app is
| interactive, then SPAs don't come into the picture in the
| first place.
|
| My point is that for very interactive web apps, this is a
| significantly better architecture that a huge monolithic
| SPA
| LAC-Tech wrote:
| I mean in this model, if each page is an SPA, then the
| line between an SPA and an interactive page is very
| blurry.
| LAC-Tech wrote:
| I've had this thought experiment before, but where I get
| stuck is - what happens when you want to share state
| between the pages? URL params, storing to indexedDB,
| sticking them in global variables - all viable solutions
| but all with their own issues.
|
| I'd be very interested to hear how you solve this, or if
| it's less of an issue than people might think.
| SinParadise wrote:
| >app is composed of traditional pages with server
| navigation between them, but each page is implemented as an
| SPA.
|
| I agree with this because you affirm my bias.
|
| Also because I've also had success implementing this
| structure. This makes sure that state of each page doesn't
| leak everywhere, which simplifies the state management.
|
| It also loads faster than a big SPA because you don't have
| to worry about bundle splitting!
| WillPostForFood wrote:
| Do you lose performance because each page has to load the
| SPA?
| unfocussed_mike wrote:
| Not if the SPA subsequently takes over, (internally)
| routing links it recognises. (Nuxt does this)
| prmph wrote:
| Not much, if you use dynamic loading for heavy
| functionality that may not be used.
| khimaros wrote:
| this seems to be approximately what https://htmx.org/ is
| trying to accomplish.
| dlisboa wrote:
| HTMX goes about it in the wrong way, in my opinion. HTML
| code should not carry state and logic. The moment you need
| something a bit more complicated than the common examples
| you're in HTML-attribute soup trying to use a real
| programming language.
|
| It's better to just write that as a component in React or
| Svelte or whatever. It's more testable, easier to
| understand, can carry state and logic just fine. It does
| mean you have to communicate in JSON for a small part of
| your app, but that is reserved to a few well known
| endpoints and components like a complex form.
|
| The penalty is loading React or some other lib just for
| that, but if used in this way the extra dependency isn't
| really a big deal as it's not your whole app. Just use
| React as a library for components the browser doesn't
| already provide.
|
| And by components here I should really clarify as
| "affordances". A "primary" button isn't an affordance, the
| browser already gives you a button element and CSS classes
| (or HTML attribute) for that. It doesn't give you a "multi
| page wizard with immediate validation" affordance, however,
| so that's a good candidate for a component.
| pier25 wrote:
| I think the best solution for this is just doing fullstack dev
| with SSR + partial hydration.
|
| The issue is that, so far, we haven't figured out how to have a
| good fullstack DX.
|
| Remix is probably one of the best attempts so far, but it still
| leans heavily towards being a very sophisticated renderer for
| the front end. The proof is you probably would not use Remix to
| create a 100% backend project with no front end. Same with
| SvelteKit or Next.
|
| Until fullstack frameworks get more serious about the backend,
| we will be in this weird limbo.
|
| In my current project I use Fastify as my main backend
| framework, and then use Svelte for SSR + hydration. I loose a
| lot of the frontend sophistication that SvelteKit brings to the
| table, but OTOH I have an amazing backend framework and total
| control and flexibility.
| camjw wrote:
| I feel like react-rails (https://github.com/reactjs/react-
| rails) is basically perfect for this. You just make the photo
| upload its own react component and render it as normal from
| your rails view. You basically encapsulate the small bit of
| complex state into a component and it doesn't infect the rest
| of your app with SPA.
| cdelsolar wrote:
| no they weren't, stop with these clickbait bad takes
| clivestaples wrote:
| I think SPAs were the best solution we had at the time and I
| enjoyed trying to build good UX with them. Yes, React started
| fresh and ended up driving me back to Rails because I'm just not
| smart enough. That said, I am really excited about Django w/HTMX,
| Rails w/ Hotwire, and Next and Remix with React. Particularly
| Remix.
| hinkley wrote:
| I can get good at a lot of things, but most of them (including
| half the ones I'm good at) really just aren't worth my time and
| energy.
|
| Ain't nobody got time for that is more often closer to the
| mark. But anything that requires hypervigilance is eventually
| going to make you look dumb. Just don't let them put "human
| error" on the RCA. Yes, You screwed up, but We put you there in
| the first place.
| Jenk wrote:
| It should be obvious why SPA/PWA frameworks were developed by the
| likes of facebook and Google: Offloading their content rendering
| to the client.
|
| Instead of Google/Facebook CPU cycles being spent on rendering
| their content, it's now the client devices, while the
| Google/Facebook infrastructure is "just" serving the data.
| salt-thrower wrote:
| I'm sure the data that FB and Google are delivering is far more
| expensive than rendering HTML would be. I am skeptical that
| server side rendering was a big enough bottleneck for them for
| that to be their primary motivation. I'm also skeptical that
| SPA frameworks would have been widely adopted by developers all
| over the world if they were just some conspiratorial plot by
| tech companies to save on CPU cycles.
| jtsiskin wrote:
| This is completely inaccurate. Every millisecond of load time
| affects conversion so much that they would trade huge amounts
| of CPU to speed up a page load.
| hinkley wrote:
| First lead dev offered me advice for the rest of my career.
|
| Most of what you are going to see people argue about are
| cyclical fads. A pendulum. We try A and it doesn't work. So we
| try !A. And when people forget why we stopped doing A someone
| tries it again over and over.
|
| How are things different this time should be your second
| question. Your first question is what is the middle ground?
| Boolean logic falls on its face in the real world. If 1 is bad
| that doesn't mean 200 is better. If 200 was bad the solution is
| not 1. The best answer is probably three.
| pkilgore wrote:
| So I ran across a shit ton of your comments in this thread,
| like how you think, you should hit me up if you're ever
| hiring.
| AtlasBarfed wrote:
| The issue is you need some of both for an "optimal" solution.
|
| Unfortunately, Javascript and the basic "controller" capabilities
| of a web browser just aren't up to the task.
|
| Here are your "controller" options:
|
| 1) the server is the controller
|
| 2) the web page is the controller of itself (which sucks)
|
| When what is probably needed is:
|
| 3) a controller that lives as an extension of the browser.
|
| Frames, for all their issues, basically enabled #3. A controller
| frame could manipulate the view frames, and those frames were
| scoped/contained web page "processes". There were issues of
| course, if you hard-refreshed the overall page (and the
| "controller" frame) it would lose state, so I don't want to say
| that frames were a complete solution.
|
| Client storage is half of the equation, and that was added. Good
| caching infrastructure, multiple asset delivery, connection
| multiplexing, that seems to be working so you don't need a "big
| bertha" first page. Standardized DOM capabilities and the like
| seem to be fairly well solved, and maybe the "Javascript problem"
| will be solved once ... crap the thing where you have an IR
| bytecode so you can code in anything in a browser... well that
| will be solved.
|
| Frankly this needs to be solved. Apps and app stores are a pox
| upon the land, and the web browser can still save us from that.
| todd3834 wrote:
| To me one of the biggest distinctions here is the overuse of the
| term "App". I agree that a lot of websites written as an SPA were
| the wrong tool for the job. There are tons of examples besides
| the mentioned media websites where SPA is the way to go. Most,
| but not all, of the applications I work on feel like desktop
| class applications and the traditional server side rendered
| approach simply would not work. This includes when I was on the
| iCloud Web team working on the iCloud Drive App, the Mail App and
| some others behind icloud.com.
|
| I think a lot of companies that default to SPA would benefit from
| a very quick traditional website. However, some of the
| applications that I've been fortunate enough to work on would
| never be possible.
| karaterobot wrote:
| When I was a FE developer building single page apps, I would hear
| these arguments and say "you just don't get it, man, SPAs are the
| future". Now that I don't get paid to work on SPAs, these and
| other downsides come into very stark relief, and it's the
| advantages which seem more dubious to me. I doubt I'll ever touch
| an SPA again, and I'm not mad about that.
|
| Indeed: "It is difficult to get a man to understand something
| when his salary depends upon his not understanding it"
| donatj wrote:
| I have in my life used a couple of SPAs where I thought "Man,
| this works _really_ smoothly and quickly! " Like there have
| seriously been _a couple_ really good ones.
|
| They absolutely can be done _right_ , I've built _one_ I think is
| done right. I 've built a couple. I don't think the average team
| has it in them to build a good SPA.
|
| The majority of SPAs are user hostile hot garbage.
|
| The 95% of other SPAs were full of minor frustrations that could
| have been easily avoided by not being an SPA including
| 1. Completely unhandled errors with no indication anything is
| wrong. - This is a majority of SPAs. Any request error
| on flakey internet? Don't bother tell the user, just break.
| - The sheer number of times I've needed to open inspector to see
| that something has gone wrong... At least an actual non-SPA
| request that fails will show you an error page. 2.
| Broken... native... everything - 2.1 Especially "broken
| open link in new tab"/middle click - see next. 3. Inability
| to run the site in multiple tabs. - State is entirely
| local so state gets broken *easily*. - Some just outright
| refuse and warn you. 4. Adding everything I do to the
| browser history api - Makes it even worse than the back-
| button-not-working of old. Have to hit back a thousand times.
| - Scrolling SHOULD NEVER add things to my back button. NEVER.
| 5. High CPU usage on a site doing seemingly nothing -
| Looking at you, Medium. 6. Generally being way slower to
| use than the previous non-SPA website - Looking at you,
| Wells Fargo. 7. LOSING MY POSITION ON HITTING BACK
| - The sheer number of times I've been scrolling down an infinite
| list for like 30-45 seconds, click on something, nope not what I
| wanted, hit back, returned to the top of the list is entirely
| unacceptable as a society. - This is very often combined
| with 2.1 and 3 to make for a truly infuriating experience
|
| Like don't get me wrong, you can do a lot of this junk in a non-
| SPA but the failure state is almost always better.
| com2kid wrote:
| > Inability to run the site in multiple tabs. State is entirely
| local so state gets broken _easily_.
|
| I have seen this more for sites where a TON of state is stored
| in the backend, the site expects the user to have 1 tab that is
| kept in sync with what the server thinks that user session is
| doing.
|
| Heck I have seen sites that throw up errors asking me not to
| open multiple tabs.
|
| I have also seen sites where if I have Tab 1 on Page A, and I
| open Tab 2 to Page B, then go back to Tab 1 and navigate to
| Page C, if I go to tab 2 and try to navigate anywhere, it just
| goes to Page C.
|
| Fun times when the server has too much state.
| blunte wrote:
| I don't disagree with most points here, but I did chuckle at this
| one:
|
| > YouTube is a great example. Being able to keep a video playing
| while you explore other videos is fantastic.
|
| I hate that (mis)feature. When I click something else, my
| attention is on the new thing. Having to go find the little
| still-playing video window to close it is a hassle.
| onemoresoop wrote:
| Some like it some hate it. I hate it too but generally I like
| simpler things. I wish we could opt out of some features so
| everybody would be happy.
| [deleted]
| remram wrote:
| And if you don't, you're probably going to open in a new tab.
| Too many webapps are designed with complete disregards to the
| fact that browsers have tabs.
| colejohnson66 wrote:
| As a counter: I love it. It allows me to add videos to a queue
| without having to build a playlist beforehand. And halfway
| through the queue, I can add more without having to navigate
| away.
| stjohnswarts wrote:
| Yeah I like it as well, but there should probably be an
| option to disable for those who don't like it.
| jdrc wrote:
| agreed. i dont think youtube needs to be an SPA and simple
| pages work better. For comparison: porn sites.
| kizer wrote:
| Also, more SPA framework logic needs to become part of the web
| platform; APIs beyond pushState, service workers, etc. You have
| to integrate it into the browser to really remove the confusion
| and the boilerplate.
| k__ wrote:
| While Web2 is moving to SSR, I think SPAs will be a huge part of
| Web3.
|
| SPAs are perfect for decentralized infrastructure like IPFS and
| friends. Same goes for mobile apps.
| gls2ro wrote:
| What exactly from SPA is making them good for decentralized?
| lambda_dn wrote:
| SPAs were a good solution when page load/rendering times were
| longer. However with todays internet speeds, edge caching,
| HTTP3/Quic as well as todays chips and browser implementations
| page reloads are barely noticeable so you get all the goodness
| the browser gives you out of the box creating MPAs.
|
| There are still some examples were SPAs are useful such as
| replacing complex desktop applications but 95% of web apps don't
| need it.
| hinkley wrote:
| It was a big day for me when I realized the CSS perf tool had
| been removed from my browser because the clock resolution was
| no longer sufficient to make it work. Everything was <1ms.
|
| Bloom filters for CSS were a huge deal, and the CSS load and
| apply times are one of several things SPAs were trying to
| amortize.
| blablabla123 wrote:
| I think SPAs are awesome, there are just so many cases that SPAs
| can handle easily and more gracefully. From non-redundant input
| checks over interactive elements to optimizations for spotty
| networks or even offline usage.
|
| Anyway, it's painful when a page won't load or it takes 10
| seconds to load for no apparent reason. That's why profilers need
| to be used, loading indicators within the elements and also
| there's the trend towards frameworks with small footprints or
| even to go framework-less.
| mithr wrote:
| If the choice was between building a traditional app from
| scratch, or building an SPA from scratch, then I think the
| article would have a solid leg to stand on: building an SPA from
| scratch _does_ involve finding ways around things that browsers
| provide out-of-the-box.
|
| However, pretty much no one writes SPAs from scratch, and there
| exist many very popular frameworks that handle the vast majority
| of the common SPA tradeoffs out-of-the-box, so that in reality,
| you don't really have to think about e.g. whether links are
| internal or external.
|
| That's not to say that SPAs are always a good idea, or that they
| do everything well -- the author's point about scrolling to the
| right place, especially when navigating backwards and forwards,
| is one thing that many SPAs don't get right, for example. And the
| rise of next.js and the like have shown that there are other
| benefits to hybrid approaches, as well, and there isn't a one-
| size-fits-all solution.
|
| As for _why_ SPAs have become so popular, I think this can be
| summed up pretty neatly: everything is code. There 's something
| appealing to a software engineer about being able to control
| everything about how your app behaves, control when and how it
| loads or preloads data, how navigation works, etc. This comes
| with tradeoffs, you have to be careful about breaking user
| expectations and making things accessible, and if you go too far
| you can end up with a big mess ("just because you _can_ make
| everything custom doesn 't mean you _should_ "), but that
| underlying freedom to make those choices is appealing.
| thex10 wrote:
| My dev was asserting that a modest change to how a certain form
| control works would be "easier in React" (and this is on a piece
| of our application that's not even in any SPA right now). I
| marvel over the eagerness with which developers reach for React
| and friends nowadays.
| synergy20 wrote:
| Unless you already have a SSR in place(or you're familiar with
| it, e.g. Django, Laravel, Rails,etc), I feel SPA(or MPA) is
| actually a decent choice albeit the learning curve. Separation of
| concerns is always good. With SPA frontend developers can develop
| the UI using restful or some web APIs provided by the backend,
| while backend engineers can advance the server side and keep the
| API consistent.
| root_axis wrote:
| SPAs are ideal for web applications where users are manipulating
| application state in real time. There are many situations where
| this is applicable, you can't build something like e.g. Office on
| the web without an SPA, calling SPAs a mistake is trendy, but
| betrays an ignorance of the practical tradeoffs of an SPA.
| fmakunbound wrote:
| Seaside on Squeak (now Pharo), is still my happy place for web
| application development.
| a_chris wrote:
| The problem with SPAs is that they have been misused and
| overused, at least in Italy. Tons of projects built with SPA in
| which we have to re-implement basic browser features like the
| back button, just because project manager has no idea of how this
| technology works. I've worked on at least 4 projects which could
| be written in Nextjs in half of the time
| aminerman wrote:
| They don't know about frameworks in Italy?
| tofuahdude wrote:
| Hate to break it to you but Nextjs is for building SPAs.
| Toine wrote:
| This is way oversimplified. You can build a completely static
| website with NextJS. What I love about it is that you can do
| everything : SSR by default, SSG as an option, and awesome
| features like ISR etc.
|
| However, the way NextJS implements SSR is really weird right
| now : if you use their component, the pages props are
| actually fetched with an XHR request, then the page is
| rendered. I don't know why. It does feel like an SPA in the
| end.
| midiguy wrote:
| I was going to say.... ironically NextJS is just an
| additional layer for creating static-rendered sites over an
| SPA framework. We have come full circle.
| deltaonefour wrote:
| All of software engineering is a flat circle. All of it. On
| the backend side it's microservices vs. monoliths.
| sinker wrote:
| Next.js recommends delivering static assets by default and is
| geared towards that.
|
| > _We recommend using Static Generation (with and without
| data) whenever possible because your page can be built once
| and served by CDN, which makes it much faster than having a
| server render the page on every request._
|
| If you need dynamic content, they recommend server-side
| rendering, and lastly client-side rendering only if the page
| is unaffected by SEO and requires a lot of in-page updates.
|
| https://nextjs.org/learn/basics/data-fetching/two-forms
| osrec wrote:
| It is annoying to see titles such as this, since SPAs are most
| certainly not a mistake (the article itself points out that the
| Youtube SPA is not a mistake).
|
| The truth is most devs struggle to implement SPAs well. To
| implement an SPA well, you need to understand browser APIs
| _extremely_ well (such as the History API), and in my experience,
| most devs don 't, hence the broken back buttons etc.
|
| To me, there is nothing nicer than a well made SPA, and often,
| the best SPAs are faster and lighter than the desktop apps they
| replace. I believe they are the best way to deliver software in
| the current age, and the sandbox that the browser offers actually
| provides users with a more secure execution environment than
| traditional software delivery mechanisms.
|
| I personally LOVE SPAs.
| andix wrote:
| A SPA is an Application and not a Web Site. With a SPA you can
| replace classical desktop or mobile applications, for example
| Gmail, Spotify or maybe Dropbox.
|
| SPAs are good for that, because you just have to develop it once,
| instead of 5 or 10 times for all platforms.
|
| SPAs are bad for traditional websites that deliver content.
| rado wrote:
| Anyone else encountered NG routing locking up upon return to the
| web app with Safari back button?
| wrnr wrote:
| At this point most articles like this or tools addressing the
| problem discussed here replace one local optima with another, I'm
| holding out for something radically different, maybe something
| like makepad or bevy like ECS with good support for UI.
| hunterb123 wrote:
| This opinion gets reiterated over and over and it's still wrong
| no matter how many times you say it. SPAs are just apps.
|
| I'm sorry people can't tell the difference of when you need a
| site and when you need an app. That doesn't make web apps a
| mistake.
| Jensson wrote:
| But it is so strange, most SPA's are basically just power point
| presentations. Why did it go like that? It isn't like people
| look for programmers to replace their power point presentations
| or PDF's, but for some reason that is exactly what they do on
| the web.
| coding123 wrote:
| SPAs were not a mistake, SPAs were an attempt to make the front
| end work like front ends have ALWAYS worked.
|
| Back before the web people made C++ and VB user interfaces that
| interact directly with the data source. SPAs are an attempt to
| make the web closer to that well known paradigm. POST REDIRECT
| REFRESH cycle was an insane programming paradigm that wasn't
| found in any previous edition of programming.
| commandlinefan wrote:
| > POST REDIRECT REFRESH cycle was an insane programming
| paradigm that wasn't found in any previous edition of
| programming
|
| Actually I'm old enough to remember old mainframe CICS
| programming that was a lot closer to the form-based HTML
| server-side programming of old. When "the web" came out in the
| mid-90's, it was actually a "blast from the past".
| wrs wrote:
| Not so. IBM mainframe systems (3270 terminal based) that ran
| most of commerce for a long time are basically the same
| paradigm as a web browser. Send a form to the smart terminal
| (GET), wait for the response with the field values (POST), send
| another form.
|
| In fact there are adapters that literally turn these
| applications into websites by translating the forms into HTML.
| Commonly seen when you need to do something like change the
| beneficiaries on your health insurance.
|
| "Client-server" paradigm came out in the 90s when PCs became
| powerful enough to run a "thick client" application, and was
| considered revolutionary.
|
| In other words, the eternal cycle continues... :)
| dboreham wrote:
| GUI application patterns predate the 90s (Mac, X11, Apollo
| Domain, Xerox Star, etc)
| wrs wrote:
| Of course yes, GUIs go all the way back to Sketchpad in
| 1963. The PARC work was more about putting files on a
| server than putting the application logic on a server. X11
| put _all_ of the application on a server (or as X11 calls
| it, a client...). Based on my bookshelf, the "client-
| server" paradigm of putting the UI part and a substantial
| portion of the related logic on the client, but with most
| of the business logic on the server, reached mainstream
| adoption in the 90s.
| ramesh31 wrote:
| >Back before the web people made C++ and VB user interfaces
| that interact directly with the data source. SPAs are an
| attempt to make the web closer to that well known paradigm.
|
| I wish more web developers were aware of just how damn good UI
| tooling was for native systems. Stuff like WinForms/WPF/Visual
| Studio and Cocoa/UIkit/Xcode on OSX. Perhaps we could get away
| from the insanity of rebuilding a select component for every
| new project.
| bdcravens wrote:
| Most SPAs don't interact directly with the datasource, but
| interact with a middle service. Also many older architecture do
| draw entire "pages" on the screen at once, rather than
| manipulating only individual components. (at least not on every
| interaction)
| coding123 wrote:
| Clearly, we can't have an SPA front end performing an SQL
| query directly. The HTTP/GQL/REST services are the SPA
| equivalent of that data source (they are still a data
| source). The C++ and VB apps written back in the day were
| single user programs so yes that's a difference but not by
| much architecturally.
|
| "Pages" are similarly in SPAs too. We usually have a router
| that helps the app decide what main "page" is on the screen.
| eloff wrote:
| I hate SPAs. I would never do another SPA again if it were up to
| me. It just adds too much mental context switching and overhead.
| I can develop fully server-side apps that are lighter, run
| faster, and at least 20% less development effort (I actually
| compared that for the same task: https://medium.com/@mustwin/is-
| react-fast-enough-bca6bef89a6). So why would I ever do an SPA
| again if it were up to me? I would use
| https://github.com/jfyne/live which is inspired by Phoenix
| LiveViews. This is my professional opinion, having many years of
| experience in both kinds of web apps.
| rosenjcb wrote:
| Template based UI programming is like going back to the year
| 2007. Your views should be reactive. Elm, Flutter, React, Et
| Cetera understand this. Having a function that takes data and
| returns a view is much better.
| ColonelPhantom wrote:
| Isn't a template essentially a "function" that takes data and
| returns a view? I don't have much experience with UI
| programming but I don't really see the conceptual difference.
| rosenjcb wrote:
| No, the template is usually a static file that is read into
| memory and served over HTTP or locally if it's a JS only
| site. But before being served, it's being picked at via
| imperative operations. And if it's really bad, then when a
| user presses a button it triggers some event that actually
| statefully changes the view itself.
| remram wrote:
| That is a usual way this is done but not what it _means_.
| In fact, HTML recently got a ` ` tag which is
| definitely not a separate file or served separately.
| Vue.js also refers to the HTML-ish portion of a component
| as "template".
| ColonelPhantom wrote:
| I don't see template operations as imperative, rather I
| see them as declarative: you write the HTML and declare
| lists/placeholders inside the HTML. You also don't
| generally do much with the data except insert it into
| HTML; the rest of the backend is responsible for
| fetching/etc the data.
| rosenjcb wrote:
| Yeah, but the function itself doesn't return that view.
| The framework you're working in essentially composes the
| view based on the associated code and template. This is
| fundamentally different from just returning the view
| itself in the function. These are all declarative
| approaches, but leaving your view in code is a lot
| better.
|
| Every template-based framework I've seen has involved a
| lot of magic, syntax and DSL. That's not to say that JSX
| isn't a DSL as well but you can return regular
| React.Elements just as easily. You shouldn't need to
| remember a unique expression system just to be able to
| conditionally render. The premise that you're just not
| doing much with the data except dumping it into HTML is
| less true the more complex your site becomes. Think of
| the loads of conditions and evaluations that happen when
| you go to your Facebook wall or friends list.
| bcrosby95 wrote:
| It's okay because despite JSX being a DSL you don't have
| to use it even though everyone does?
|
| Your line of thought is a large part of why I prefer
| ClojureScript to Javascript for SPAs. With reagent your
| components just work like the language, with nothing
| particularly special to remember.
| eloff wrote:
| We can debate syntax but a Go or Python based template
| language is not conceptually any different to JSX based
| syntax. Both are essentially functions that take some input
| data and return the data formatted in HTML.
| aminerman wrote:
| Let me translate this comment fo you guys: "I'm incapable of
| making an SPA, therefore I'm questioning the whole pattern and
| I'm trying to find some convoluted reasoning to justify my
| position".
| dimgl wrote:
| I kind of have to agree here. There are very few times I've
| ever worked on a SPA and felt like throwing it all away and
| using the alternative.
|
| The last time I thought about this, which admittedly was many
| years ago, the alternatives that I knew about were: server-
| side frameworks like ASP.NET MVC Razor, PHP, RoR templates,
| Node.js EJS, Jade (now Pug), and static HTML.
|
| Nowadays, you can create extremely elegant and performant
| SPAs with tools like Next.js and Remix, so I really couldn't
| agree less to the OP.
| lp0_on_fire wrote:
| Instead why don't you let us know why you think that position
| is incorrect rather than resorting to reddit-tier insults?
| hinkley wrote:
| Harsh. Dude ported liveview, this isn't amateur level work.
|
| It's a useful brush but you can't use it to paint everything.
| eloff wrote:
| I just want to clarify, I didn't create the LiveView port,
| but I think it's excellent work.
| freedomben wrote:
| wow you must be incredibly smart and discerning, being able
| to confidently make assumptions and judgments about people's
| lives and background based on one or two HN comments, and
| then dismiss them as an ignorant and incapable fool.
| eloff wrote:
| You're being very rude and dismissive. I may well have more
| SPA experience than you do. Don't make assumptions about
| people and then use that to dismiss something they say -
| we're better than that here on HN.
| salt-thrower wrote:
| This reads like a Reddit comment. Let's try to be better than
| that here.
| diordiderot wrote:
| This is rude
| gowld wrote:
| Sure, if you implement a trivial single-task app (one tiny
| feature of a Calendar app) with an unfriendly UI, you don't
| need an SPA. That doesn't prove anything.
| eloff wrote:
| It doesn't "prove" anything, but it's a data point, and quite
| a lot more thorough than your dismissive comment. If you want
| to make a well supported counter-argument, please be my
| guest. It's easy to criticize, it's harder to make a
| thoughtful argument.
| pacifika wrote:
| When I was reimplementing "reset state" for a logo click I knew
| it should have been serverside rendering.
| phendrenad2 wrote:
| Luckily we don't have to use them. Go ahead and do a full page
| reload when the user navigates to another page. Go ahead and
| implement interactive elements using jQuery. It all still works
| just as well as it did in 2012.
| onion2k wrote:
| SPAs are a pattern that's been applied too broadly IMO, but it's
| going a bit far to call them a mistake. The aims of an SPA are
| pretty noble - the idea of essentially removing the network round
| trip when a user clicks on something is not a bad one. It means
| things are faster, they work if your connection is flaky, they
| can do things like offline support. Those are _good_ features.
|
| They might not be actual _requirements_ for a blog or a brochure
| site but it 's not totally unreasonable for someone to want their
| website to work that way. The question is not whether or not an
| SPA is a good or a bad thing, but whether or not the cost (more
| code, more complexity, potentially a series of background
| requests after the initial page load) is worth paying in order to
| get the benefits.
|
| When either an SPA or a multi-page site is done well most users
| can't tell which sort of site they're looking at. _That_ should
| be the goal. Make stuff where the user forgets about the tech.
| Make a website that just works, that 's fast enough for users not
| to think 'this is a bit slow', and that's coded in a way you can
| maintain and work on for a long time. If you get those things
| right then no one can reasonably criticise what you've made no
| matter how you've made it.
| RHSeeger wrote:
| > When either an SPA or a multi-page site is done well most
| users can't tell which sort of site they're looking at.
|
| And therein lies the problem. In the _vast_ majority of SPA
| sites I've been to, they are not "well done" by this
| definition. It is commonplace for things to break, like the
| back button as the quintessential example, because the
| developer(s) didn't spend the time to make sure things work
| correctly. With a non-SPA site, you generally have to go out of
| your way _to_ break those same things.
|
| I like SPAs for some things (gmail being a good example), but
| they should not be the default implementation; there should be
| a _very_ strong argument before the SPA architecture is used.
| gowld wrote:
| You're just saying that bad software is bad. That's
| tautological.
|
| Without SPA you have horrific 10page forms and the challenge
| of maintaining state as you go back and forth to make edits.
|
| The hard part is managing state, and there is no way to avoid
| it if your product is not purely readonly. SPA is one
| strategy, and a pretty good one.
| acdha wrote:
| If one style of writing applications is far more prone to
| having "bad software", consider that this is a valuable
| signal about the difficulty of using that style
| effectively. SPAs require you to take on ownership of more
| hard to debug challenges and that's an important factor to
| consider when selecting tools.
| onaworkcomputer wrote:
| The GP was not saying "bad software is bad"; they pointed
| out a lot of footguns that are introduced by going the SPA
| route. "More code -> more (opportunities for) bugs" is the
| truism at play here.
| zozbot234 wrote:
| > the idea of essentially removing the network round trip when
| a user clicks on something is not a bad one.
|
| Practical SPA's have many _more_ network roundtrips than the
| equivalent server-rendered web interface. Every AJAX request is
| an extra roundtrip, unless it can be handled in parallel with
| others in which case you 're still dependent on the slowest
| request to complete. With SSR, you can take care of everything
| with a single GET and a single POST no matter what. Images load
| in parallel of course, but those are non-critical.
| horsawlarway wrote:
| I pretty strongly disagree with this.
|
| The distinct advantage of an SPA is that, done correctly,
| cached data lets you render pages instantly.
|
| Who CARES if the SPA had to make 3xRTT in the background, if
| it can serve the next page up instantly because that data is
| already present and cached, it's a huge win.
|
| The server rendered app will _ALWAYS_ have to wait at least
| 1xRTT for every new render. The SPA does not.
|
| Still doesn't make an SPA the right fit for everything, but
| on bad networks, we get incredibly improvements in
| performance by rendering from cache, and occasionally
| handling cache updates in the background. User's fucking love
| it compared to waiting 2-5 seconds for every page load, even
| if they were JUST on the page a second ago.
| freedomben wrote:
| Have you tried to use a heavily SPAed site from a slow,
| distant (high latency), or metered connection? A SPA that
| works and feels great from a big city quickly becomes
| unbearable when internet access isn't as ideal. There are
| ways to handle this nicely, but maybe 5% of devs actually
| think about and test that, and no PM will allocate sprint
| time for it.
| efdee wrote:
| In case of slow internet, SPAs are much easier to make
| responsive than an SSR application.
| freedomben wrote:
| Sure, _if_ that 's your goal. It won't happen by
| accident, and the "default" method of SPAs make it really
| easy to fire off lots of different requests, often on
| demand.
| blablabla123 wrote:
| It's not that SPAs cannot handle that but it's rarely a
| requirement.
|
| I've once launched a product on (early days) Google App
| Engine and it was unusable as purely server-side rendered
| website because sometimes it would take ages to load or
| worse an error would come up eventually. With AJAX it
| could be solved and failing requests could be repeated.
| It's a pity that this is rarely done but it is of course
| possible.
| 8note wrote:
| Using the web at all is your problem there.
|
| If that's your targeted usecase, send an exe on a thumb
| drive, and get them to call you back over the phone
| freedomben wrote:
| I know this is/was not your intention, but to be honest,
| I find that attitude insulting and frankly
| discriminatory.
|
| The internet has become essential to modern life, and
| many people have no choice but to use it. Most of my
| monthly bills don't have any alternative to paying
| online. (Some will take a payment by phone but they'll
| charge a $20 "phone fee" or similar).
|
| There are certainly sites/apps that just can't work
| without requiring a big and short pipe, but it's
| extremely defeatist to suggest that it's hopeless and we
| shouldn't even try.
|
| You're certainly not alone with your opinion. I suspect
| that attitude is a big part of why this is such a problem
| nowadays.
| horsawlarway wrote:
| Yes - that's literally exactly what I talked about.
|
| I can tell you - My app renders immediately in these
| cases, precisely because I lean heavily on a cache.
|
| I preload basically all the data a user might need at
| startup (prioritizing the current page) and then
| optimistically render from cache.
|
| I'm very familiar with these kind of situations (I have
| developed software designed explicitly to handle offline-
| only cases, and I'm very familiar with how bad a
| connection might be in rural Appalachian schools.)
| onaworkcomputer wrote:
| > I preload basically all the data a user might need at
| startup
|
| This can be a great strategy when you're dealing with
| bounded data that's not sensitive, but it's important to
| recognize that this approach is often inappropriate. A
| web app may be allowing users to wander around terabytes
| of data, or it may need to make highly consistent
| authorization determinations before allowing a user to
| see specific data, or you may need to keep a highly
| detailed audit log of who requested what when (e.g., if
| the app targets healthcare or government users), which
| aggressive preloading would render useless.
| horsawlarway wrote:
| > Still doesn't make an SPA the right fit for everything
| mrtranscendence wrote:
| It's still worth pointing out.
| freedomben wrote:
| Awesome, thank you for doing that! I wish more people
| did. I've had several people tell me that "in a web app
| you only want to load the data you need, at the time you
| need it" and I die inside a little.
| gowld wrote:
| Have you tried to use a site that reloads all the data on
| every click, from a slow, distant (high latency), or
| metered connection? Same problem.
| freedomben wrote:
| Of course, and it's usually not as big of a problem
| because everything you need comes in the page render.
| With SPAs it's not uncommon to have to click 5 or
| buttons/menus and then wait for data to load, then click
| again, and more data.
|
| That said there are plenty of SSR sites that are terrible
| too. It's not the technology that's at fault, but SPAs
| and common dev patterns in the community definitely
| enable and encourage making lots of small requests.
| tomnipotent wrote:
| > have to click 5 or buttons/menus and then wait for data
| to load, then click again, and more data.
|
| How is that any different from SSR? Waiting for a full
| page reload is fine, but incremental loading is not?
| giantrobot wrote:
| > Who CARES if the SPA had to make 3xRTT in the background,
| if it can serve the next page up instantly because that
| data is already present and cached, it's a huge win.
|
| The data is never in the cache. It is for a developer
| because they forget to clear their caches when testing. For
| most users the data will not be cached unless they're
| sitting on the SPA all day.
|
| So when the user _doesn 't_ have data cached that 3xRTT on
| their spotty 4G signal the SPA pattern is of no help. Not
| everyone is sitting still on great WiFi. Someone's cellular
| reception can go from great to unusable just walking down
| the street.
| horsawlarway wrote:
| >The data is never in the cache.
|
| Then you have a shitty app.
|
| Between localstorage and indexdb - unless you're
| literally out of disk and having storage being evicted,
| then if you've loaded my app once (and I mean _once_ ,
| not once this browser session) then I have data in cache.
|
| Basically - don't blame SPAs, blame developers for
| assuming that the same "request the data every page view"
| paradigm is still in play.
|
| It's not, and storage is insanely cheap.
| acdha wrote:
| > Then you have a shitty app.
|
| This feels a lot like you're making a "No True Scotsman"
| argument. The behaviour you're saying doesn't / shouldn't
| happen has been the defining characteristic of SPAs since
| the beginning and it's still immediately visible on most
| of them as soon as you have a less than perfect high-
| speed internet connection. If statistically nobody except
| the Wordle developer can make something which handles
| crappy WiFi the problem requires more than just saying
| someone is a bad developer.
| hinkley wrote:
| Unless their cache is cold and then they navigate back
| before your first render completes. Often we are not the
| sole source of a piece of information and first load time
| counts.
| horsawlarway wrote:
| > Unless their cache is cold and then they navigate back
| before your first render completes.
|
| This doesn't matter. It's an SPA - my js context hasn't
| been wiped because I'm not letting the back button eat
| the whole thing and start over. I just complete the
| request and store in cache either way, and next time they
| hit it, it will be there.
|
| > Often we are not the sole source of a piece of
| information and first load time counts.
|
| Sure - caching is hard (full stop - it's really hard).
| But I think if you actually consider most applications,
| there's not really much difference between an SPA
| rendering from cache and a server-side page that a user
| hasn't refreshed in a bit.
|
| Basically - it's not going to solve all your problems,
| but in my experience developers really underestimate how
| much usage is "read only" and a cache works fine.
| hinkley wrote:
| It doesn't matter!?
|
| SPAS push giant gobs of logic and CSS ahead of the Time
| To Interaction and cross their fingers that nobody will
| notice because it's not supposed to happen the next time
| due to magical cache thinking.
|
| People have been ignoring actual research on caches for
| the entire time SPAs have been around. First time
| visitors have this as their first time visit. Occasional
| visitors show up after the last deploy, or like and
| enthusiastic web users get evicted between loads. And
| then don't convert because your site is "always slow".
|
| P95 statistics don't tell you if 5% of your users are
| having a bad experience. Or if new users are massively
| over represented in the P95 time. You are flying blind
| and shouting for other people to follow you.
| zozbot234 wrote:
| To be fair, there are SPA frameworks that try to minimize
| the amount of logic that's shipped to the client, Svelte
| is an example, which should be as lean and efficient as
| any hand-coded JS. It's more of a side effect of what
| frameworks you use than SPA per se.
| hinkley wrote:
| It's still a specialty sub-discipline though. Getting the
| base size down is a wonderful goal for a framework. But
| for the behavior the company is adding, there are both
| diminishing returns and a lot of surface area for bugs.
| horsawlarway wrote:
| Look - I understand that I'm making a tradeoff here, and
| I'm very clear that not all sites are the right fit for
| an SPA.
|
| But yes - I explicitly handle offline-only use cases, and
| god-damned terrible connections (think <1kb/s). In these
| situations, users are going to wait a long time for the
| first load either way.
|
| They call in excited as all get out when they realize
| they only have to wait _once_ with my application, and
| not once every page load. It 's the difference between
| having a chance to grab a coffee at the start of the day,
| vs pulling your fucking hair out all day long.
| NoGravitas wrote:
| Your application seems to be a magical unicorn (not being
| sarcastic!). Most SPA websites I use on a regular basis
| end up having to reload all of their page components
| every visit, and frequently on every 'back'.
| horsawlarway wrote:
| I'll be really honest here - it helps that it was a
| direct requirement from day one, and we have financial
| incentives aligned with handling the offline-only case.
|
| If you handle offline up front - you mostly get bad
| connection speed wins by default.
|
| It also helps that our app really isn't intended for
| casual use - ex: we have very few users who just load a
| page or two and then leave. Mostly they'll be interacting
| with the page for a duration of between 30 minutes and 2
| hours (sometimes as often as once a second).
|
| So yes - very much not a "blog" or "news" or "social
| media" site, and I think the value proposition for most
| companies might be harder to sell.
|
| But I personally find it very, very nifty that we can do
| this at all in a browser. 10 years ago it would have
| required an installed application, or a port to each
| mobile platform. Which is sadly still a hard sell in some
| of the particularly poor school districts we worked with
| (mostly computers from the early 2000s, if you're lucky a
| really cheap tablet - like a kindle - floating around)
| kevinmcconnell wrote:
| > The server rendered app will ALWAYS have to wait at least
| 1xRTT for every new render. The SPA does not.
|
| Not necessarily. I think you're conflating caching/fetching
| and rendering here. You can cache rendered views in the
| same way you'd cache the data for those views.
|
| Turbo does this, for example. When you navigate to a cached
| page it will display the page from the cache first, then
| make a request to update the cache in the background. So
| it's similar to what you describe, but with server-rendered
| content.
| horsawlarway wrote:
| Turbo is making your site an SPA, and hiding the
| implementation details from you
|
| That's not what the article was about (it was very
| clearly advocating for the standard browser flow)
| tomnipotent wrote:
| > You can cache rendered views
|
| Sort of. There's been no shortage of vulnerabilities
| where user data has been exposed when an authenticated
| users request was cached and re-used for subsequent
| users. It's been my experience that most SSR apps disable
| caching for authenticated users, or rely on more explicit
| control of components for partial caching where possible.
| onaworkcomputer wrote:
| > The distinct advantage of an SPA is that, done correctly,
| cached data lets you render pages instantly.
|
| Yeah, but full page caching is a thing, and in my
| experience, teams writing traditional server-rendered pages
| are much more aggressive in their use of response caching
| than are teams writing JSON APIs. Honestly, a
| Rails/Django/Laravel app with smart caching headers and a
| Varnish instance in front feels more reliably instantaneous
| than the bespoke caching solutions each SPA seems to invent
| for itself.
| zozbot234 wrote:
| Preloading is a browser-native feature, you don't need a
| SPA for that. And just as often you can't know in advance
| what data will be requested by the user.
| horsawlarway wrote:
| > And just as often you can't know in advance what data
| will be requested by the user.
|
| This is a cop-out. Storage is insanely cheap, and
| abundantly available on most machines. Plus the browsers
| will usually give it to you.
|
| Can I know precisely what series of pages this user might
| hit? Nope. Can I load _ALL_ the data this user might need
| to read? Probably.
| onaworkcomputer wrote:
| > Can I load ALL the data this user might need to read?
| Probably.
|
| You can do that with HTTP/2 server push on a multi-page
| app, too. The main difference is that with an SPA, you
| get to reinvent it all yourself.
| horsawlarway wrote:
| Yeah - there's a trade off here.
|
| Server push gets you closer with a traditional app, but
| it doesn't really solve the problem (or rather - yes, you
| get to reinvent it yourself, but you can do it better,
| with the specific context of your app)
|
| Basically - My argument is that developers tend to treat
| SPAs the same as "the website" but with a bigger js
| framework. And that's the wrong mindset.
|
| Instead, you should think of the first load as an install
| of a native application. You want to push absolutely
| everything, not just the next couple of resources you
| might need (like imgs/css). Ideally you push the current
| page first, and do the rest in the background while the
| user can interact with the current page, since you're
| almost never CPU bound on terrible connections anyways.
|
| You'll get one additional load at login (because now I'm
| pushing all relevant user data), but after that...
| basically everything is rendered from cache (including
| optimistic cache updates based on what the user might be
| adding/updating).
|
| After that... unless you log out or have cache evicted,
| you're going to see immediate response times, even while
| offline.
|
| ---
|
| This isn't easy, and most teams don't bother, so if the
| comment is "If you're treating an SPA like a traditional
| page - don't bother" then I tend to agree.
|
| but an SPA genuinely opens up options for bad connections
| that otherwise just don't exist (or are so bad people
| won't use them)
| giantrobot wrote:
| Storage is cheap but _bandwidth_ is not guaranteed.
| Getting content from your server to my device is not
| necessarily fast. Making wrong assumptions about my
| device 's environment makes for a poor experience for me.
| horsawlarway wrote:
| if you cache well - you will absolutely use less
| bandwidth with an SPA.
|
| Sure - that first load is going to be bigger, but
| literally every subsequent request will use less data.
|
| I try to reward consistent and current customers - and
| I'm not selling a news article or a social media site...
|
| Now - if you do things like attempt to refresh _all_ of
| the cache often, then sure, you have some problems to
| deal with.
|
| > Making wrong assumptions about my device's environment
| makes for a poor experience for me.
|
| Tough shit? I go way out of my way to make sure that
| loads on bad lines (or no lines) don't interfere with my
| users. You could just as easily say "I'm on gigabit why
| is this app using my disk space? Making assumptions makes
| for a poor experience. WAAAH".
| giantrobot wrote:
| hinkley wrote:
| People generally have a very bad estimate of just how engaged
| users are with their sites.
|
| These people have lives and other shit to do besides spend
| all day in my web app. There's a lot more accidental and
| exploratory clicks than you think and all of the background
| requests run even though the user is only on that page for
| half a second.
| bastawhiz wrote:
| > Practical SPA's have many more network roundtrips than the
| equivalent server-rendered web interface. Every AJAX request
| is an extra roundtrip, unless it can be handled in parallel
| with others in which case you're still dependent on the
| slowest request to complete.
|
| This is largely solved with innovations like GraphQL (which
| you don't need a SPA to use). Pages that require multiple API
| calls can show their UIs progressively with appropriate
| loading indicators. For SPAs that have ~long sessions, it's
| arguably a good thing to have multiple API calls, because
| each can be cached individually: the fastest API call is the
| one you've already cached the response for. This is stuff we
| were doing at Mozilla in 2012, it's nothing new.
|
| There's also nothing stopping you from making purpose-built
| endpoints that return all the information you need, too. Your
| proposed solution (SSR) is literally just that, but it
| returns HTML instead of structured data.
| candiodari wrote:
| What they're meaning is that the _total_ time is longer for
| the SPA if you don 't go all out (and nobody does).
|
| SPA: 1. get html from server (1
| roundtrip) 2. get resources
| (js/jpg/movies/gifs/favicon/...) from server (1 roundtrip)
| 3. get ajax calls from server (1 roundtrip) 4.
| process answer from server + update page (not a roundtrip,
| but not zero)
|
| Vs traditional: 1. get html from server
| (1 roundtrip) 2. get resources from server (1
| roundtrip)
|
| Also if there are sequential ajax calls required to build
| the page (like a list -> detail view), it goes up a lot
| without speed oriented (very bad code style) API design.
| For instance you need a separate
| "GetListOfUsersAndDetailsOfFirstUser()" (or more general
| "getEverythingForPageX" calls). You can't do
| "GetListOfUsers()" and "GetUserDetail()" separately.
|
| So to match traditional webpage total load time you cannot
| do any ajax calls in your SPA until after the first user
| action. And even then, you only match traditional website
| performance, you don't exceed it.
|
| Time until the first thing is on screen however, is faster
| in SPA's. So it's easy to present "a faster website" in
| management/client meetings, despite the SPA version
| actually being slower.
|
| You _can_ make SPAs faster than traditional websites ...
| but, for example, you cannot use javascript build tools.
| Since you need to do the first calls server-side and have
| javascript process them, and only send the result of the
| preprocessing, and the resulting dom to the client, after
| optimization and compression. _After_ that you need to then
| do image inlining, style inlining, etc. I know react _can_
| do it, but does anyone other than facebook actually do
| that?
| abemassry wrote:
| I wrote a post very similar to this comment that you
| might be interested in reading. I broke down what takes
| time to load, how fast the browser determines something
| has loaded, and how fast the user can perceive the page
| loading. I ended up having to take a high speed video and
| measure frame by frame the time it took to load for user
| perception.
|
| https://www.ireadthisweek.com/author/ireadthisweek/post/2
| 022...
|
| The TLDR is it takes longer than reported.
| 3np wrote:
| The more something behaves like an actual _application_
| and the higher the number of user interactions per visit,
| the more sense the SPA approach makes IMO. This is
| because the initial load overhead of an SPA gets
| amortized over subsequent interactions.
|
| Blog or corporate/news website on one end and an
| interactive game or video editor in the other, with a
| site like FB somewhere in the middle.
|
| It's not a hard rule and I can already think of counter-
| examples but this line of thinking is useful when
| architecting a new project.
| bgirard wrote:
| You eliminate #3 by having data preloaders inline it into
| the html response and move it into #1. But without SSR
| your rendering still starts after #2 instead of #1.
|
| I think your point is still correct. SPA by default are a
| huge regression and you have to build and maintain
| sophisticated web infra to reclaim it.
| Scarblac wrote:
| Yes, but most of the time (getting the HTML and all the
| Javascript etc) is only at startup time. Let it take a
| second or two. From then on the user is in the
| application, and everything is much faster than it used
| to be with getting entire new pages from a backend every
| other click.
| bastawhiz wrote:
| > For instance you need a separate
| "GetListOfUsersAndDetailsOfFirstUser()" (or more general
| "getEverythingForPageX" calls). You can't do
| "GetListOfUsers()" and "GetUserDetail()" separately.
|
| This is literally a core use case of GraphQL. But you
| probably also want to fan out to preload all of the other
| user data in one API call: that's the whole point of
| doing it on the client. If you are trimming the handful
| of kilobytes on the first request, you're paying the
| price for that on each subsequent load.
|
| > I know react can do it, but does anyone other than
| facebook actually do that?
|
| Yes. Every job I've worked at professionally since 2016
| (when this became mainstream) has done this. I do it in
| my side hustle. It's really not that hard.
|
| > 2. get resources (js/jpg/movies/gifs/favicon/...) from
| server (1 roundtrip)
|
| This doesn't go away with traditional sites.
| candiodari wrote:
| > Yes. Every job I've worked at professionally since 2016
| (when this became mainstream) has done this. I do it in
| my side hustle. It's really not that hard.
|
| Can you link to a tutorial for this? I'd be most
| interested.
| [deleted]
| tiborsaas wrote:
| SSR isn't a one-size-fits-all solution. Blogs? Sure.
| Corporate marketing site? Absolutely. Wikipedia? What else.
|
| A webapp where state can exist in various components is a
| perfect fit for SPA-s. Clicking a button in a widget and
| submitting the page with every other state, updating them and
| refreshing the page makes no sense.
|
| SPA-s also help with separating frontend and backend
| development, they are different beasts. I know many backend
| devs who wouldn't touch frontend with a 10m pole and not
| because of JavaScript, but because they don't like design and
| UX in general.
| nwsm wrote:
| > Every AJAX request is an extra roundtrip
|
| But not every AJAX request is blocking or necessary for the
| site to be usable.
| efdee wrote:
| If you can do it in a single GET/POST in an SSR, you can do
| it in a single XHR call in an SPA. There's no reason it has
| to be split up in separate XHR calls.
|
| You just have to want to do it.
| tonyedgecombe wrote:
| >It means things are faster, they work if your connection is
| flaky, they can do things like offline support. Those are good
| features.
|
| Yet the reality seems to be the opposite. If my connection is
| flaky (which it often is) then SPA's seem to fail more often
| and it isn't obvious what is going wrong. They don't seem to be
| faster either, long pauses between pages is common.
| zozbot234 wrote:
| Right. The typical SPA doesn't recover at all from network
| failures, and you end up poking random buttons hoping that it
| will reach some sort of consistent state. Then you find that
| doesn't help and you need to refresh anyway, which is a
| reboot for the whole 'app'. So much for saving page loads.
| uhoh-itsmaciek wrote:
| I think it's exciting to see frameworks like https://remix.run/
| trying to temper the disadvantages of SPAs by relying on web
| standards and server-side rendering. It's pretty cool that this
| is a JavaScript framework that can work without any (client-
| side) JavaScript.
| freedomben wrote:
| Honest question: why is remix the primary example for this
| now? Next.js has been doing this for years and is really
| amazing. It seems like a ton of people had no idea this was
| even a problem they had until remix came along, and now remix
| is the savior.
|
| Am I missing something with remix? Is there anything really
| novel that it does/introduces?
| pl0x wrote:
| Yet another javascript framework to learn, no thanks.
| uhoh-itsmaciek wrote:
| I don't know. I'm not very familiar with Next.js (I'd heard
| about it but never really looked into it much). Your
| response inspired me to investigate, and I found an article
| by a Remix founder about the differences [1]. It's
| obviously biased, but maybe still interesting. It looks
| like there was an HN submission and a bit of discussion,
| too.
|
| There's a bunch of other comparisons out there, too.
|
| [1]: https://remix.run/blog/remix-vs-next [2]:
| https://news.ycombinator.com/item?id=29983950
| eithed wrote:
| Those are very good points - I wonder how the author would see,
| for example, Google Sheets implemented as not a SPA
| [deleted]
| aelzeiny wrote:
| SPAs exist for a reason. Same with SSR. Developer ergonomics play
| a bigger role than you think. And if you think that the choice is
| either SPA or SSR then you haven't been paying attention to
| recent developments in the frontend world.
|
| Websockets+SSR (PhoenixJS) attempts to store state on the server
| rather than the client; in that way you can still have stateful
| interactions with minimal JS. NextJS does an amazing job patching
| the bridge between SPA+SSR by having the same codebase run on the
| backend and the frontend. What I would like to see more of from
| this industry is less "grass is greener on the other side" and
| the unification of a single tool that allows for the cross-
| collaboration of SPA + SSR without having two distinct codebases
| that one has to context-switch between.
| MaxMoney wrote:
| [deleted]
| goodpoint wrote:
| The web is a mistake.
| ravenstine wrote:
| Nah, they weren't a mistake, at least not in isolation. Much of
| modern software development is a mistake, generally speaking.
| When you look at it that way, SPAs only failed in the sense that
| Object-oriented Programming failed, as well as the failure of
| various design patterns, microservices, write-once-run-anywhere,
| test-driven development, decentralization... I can go on and on
| with the number of engineering and computer-sciencey crap that
| never really lived up to its promises.
|
| SPAs only suck as much as _we_ suck. Just admit that SPAs are
| like any other tool, and if we 're going to swing back to
| apologizing for goto-statements (something I don't necessarily
| disagree with) then we can't at the same time act like SPAs are a
| mistake in and of themselves. We collectively continue making
| mistakes and instead of owning up to our collective lack of
| craftsmanship, we are blaming the tool.
|
| Only when we shed the mindset that informs us that computer
| "science" is actual science might we then be in enough touch with
| reality that we seriously impose some standards upon ourselves to
| address our clumsiness.
| laerus wrote:
| why do you think TDD failed :(
|
| Doesn't every other science field work pretty much the same way
| though? We make mistakes, we iterate, we make new and better
| mistakes. It may be too obvious in software cause it's easy to
| create stuff and iterate very fast cause there aren't so many
| natural constraints. Someone may even argue that this is what
| makes software also an art.
| ravenstine wrote:
| TDD, or rather the effort behind TDD, failed because its
| proponents couldn't help but preach it as a cornucopia of
| solutions with the insistence that it's appropriate for every
| circumstance. When you are familiar with the domain of a
| problem, TDD makes a lot of sense. For the project I'm
| working on now where I'm effectively _learning_ at just about
| every step of the way, and said project is intended for very
| few users, it 's highly questionable if I could have
| benefited from TDD. Even when I'm not doing something
| unusual, TDD doesn't always make sense.
|
| Any research that currently exists around TDD is of poor
| quality and proves little, but TDD fanatics (not sure how
| many of them exist anymore though) speak like there's
| objective evidence in their favor. And some call this sort of
| thing "science"?
|
| By the way, when I mentioned science, I was specifically
| referring to the concept of "computer science", of which
| there has been very little actual use of the scientific
| method in our lifetimes. Computer science is of course a
| legitimate area of study; if our heads are still so in the
| clouds that we are still calling it a "science" then it's no
| surprise that we're continually losing touch with the very
| technologies we create.
|
| TDD also shot itself in the foot with this (IMO toxic)
| insistence that the tests _are_ the documentation, which is a
| nice principle to keep in mind, but I 've never seen it come
| close to replacing actual documentation. A simple comment
| block describing the _why_ of a function is always better
| than scrolling through tests and reconciling inconsistencies
| with the mocks that were used. And yeah, I know that TDDing
| isn 't really about "mocking", but let's face it [...].
|
| Perhaps the worst thing of all is that TDD is founded on a
| somewhat dishonest implicit premise, which is that if you
| _aren 't_ TDD'ing then one must be either not writing enough
| tests or are writing inferior code because one is writing
| tests _after_ development. TDD fanatics, in particular those
| freshly inducted into the cult, often think it 's either TDD
| or nothing, and if you're not TDD'ing one particular part of
| an app then you're not following "standards". Maybe TDD is
| fine as a form of guard rails when you're a junior developer,
| but by the time you're a high mid-level and in touch with
| reality then you're going to intuit whether a unit of work
| will actually benefit from TDD.
|
| TDD isn't bad at all in terms of its mechanics. It's a great
| idea, and I've used it many times. In fact I even TDD'd an
| entire web app that handled payment processing from start to
| finish. The part about TDD that "failed" was this belief that
| it is actually a generalized solution that needs to be
| applied everywhere, which lead to it both being misapplied as
| well as _dismissed_ when it becomes apparent that those
| promises of better and easier code /process/readability often
| don't magically manifest.
|
| This is really the story behind just about every failed idea
| related to our field, not just TDD. SPAs were supposed to
| make pages snappier because it meant server responses to
| different user actions would require fewer bytes and no page
| refreshes. Instead of viewing SPAs as a tool with a purpose,
| people had to treat SPAs as the end-all-be-all of frontend
| development and a way to do everything, and now the world is
| stuck with many SPAs that are likely worse than if they were
| done as regular webpages.
| mrvenkman wrote:
| The article does give good examples of where SPA works.
| vinceguidry wrote:
| They were necessary from a perspective of "we need a way to
| develop a company's web presence in a way we can send kids to
| code camp to get the gist of." Of course they weren't a wonderful
| thing in terms of actually building sustainable infrastructure,
| but what's that to stand in the way of business's need to go to
| market yesterday?
|
| Code camps don't have time or resources to educate their students
| so we got the reinvent-the-world half-solution that is the SPA.
| SPA frameworks won't ever go away but you'll get the chance
| eventually to go work on something better-architected than your
| run-of-the-mill NodeJS shitshow.
| toqy wrote:
| I don't think that's accurate. SPA's arise from the desire to
| put something like Slack in a web page. If bootcamps are
| responsible for that, I don't see how. Isn't it more likely
| that they meet the demand rather than create it? And bootcamps
| taught Rails long before they taught React.
|
| And let's be honest, making a server rendered site with some
| traditional Python framework is in many ways just as easy or
| easier than making a SPA.
| i_have_an_idea wrote:
| No shit, Sherlock. Of course, all of this was obvious to any of
| us with more than 5 minutes of industry experience, alas this
| field seems super prone to reinventing the same things over and
| over again, making the same mistakes and never learning from the
| past.
|
| Also, this article does not even mention the fact that SPAs are
| terrible for SEO. Of course, that's not an issue for YouTube, but
| it might be a huge issue for your clients, unless it's ok to not
| have any search traffic.
| randomsearch wrote:
| SEO for SPAs is a solved problem
| i_have_an_idea wrote:
| It is definitely not solved for the vast majority of SPAs out
| there. Where it is solved, it is not solved for free or
| cheaply, as it would've been if these apps used server-
| rendering tech.
| elchief wrote:
| Lame opinion, but I miss the (pre-license-change) ExtJS days
|
| Unified library of tools. An actual GUI designer to design
| layouts in.
|
| Now everything's just a mess
| austincheney wrote:
| > Browsers give you a ton of stuff for free
|
| True, but irrelevant. I have written an OS GUI, including full
| file system support, in the browser that performs faster than
| native OS GUIs. My biggest learning from this is talking about
| performance in a job interview is the fastest way to kill the
| interview. Performance, like security, requires trade offs that
| deviate from comfort. If the common developer is insecure comfort
| is the only thing that matters.
|
| JS hiring expects the following: React components, 2-6 weeks of
| JS practice, the ability to use map/filter on arrays, and CSS. If
| you overshoot that you begin to enter unknown territory that
| intimidates other developers. The better you are the less
| employable you become as the further from the bell curve you
| drift.
|
| If you are wondering why this is or how we got here the answer is
| _trust_ , or the lack thereof. In software there is a long
| standing bias: if you can see it visually its worth less. I have
| been doing this work for more than 20 years and that bias
| predates my work, so its been around for a while. Bias is
| continuously reinforced by the lack of standards in software
| hiring and the inability of employers to train their employees.
|
| This lack of trust means that employers do not trust their
| employees to perform original work and likewise the developers
| don't trust each other. This is why absolutely everything, I mean
| this literally, is a downloaded NPM package, because the
| developers will trust an anonymous stranger to write original
| code before they trust anyone they know. There is all kinds of
| excuses to qualify this, of which some are bizarre and nearly all
| lack any kind of merit.
|
| This is why its irrelevant what the browsers provide. Its baked
| into the framework, an NPM package, or ignored.
| midiguy wrote:
| Every week someone posts some half-baked blog ramble about how
| SPAs are bad (except for media sites!).
|
| How about this - I am just as or more efficient working with SPA
| frameworks such as React as working with server-side-rendering. I
| have invested in a skill and toolset that can deliver any sort of
| website or web application from blogs to Youtube to Figma. I
| don't see any reason I would invest in learning an MPA framework
| that is only good for a subset of that.
|
| If you are delivering content-only website with simple forms you
| might as well just use a CMS and call it a day.
| hinkley wrote:
| Why are wood shops loaded to the rafters with tools? Because
| there is no Golden Hammer, only people who think they've found
| one.
|
| You're saying you're doubling down on a single solution, which
| is probably not actually true, but you are surrounded by
| younger developers who will copy what you seem to be doing
| rather than what you're actually doing.
|
| All of these unresolved arguments are about team dynamics, not
| technology, which is why they never get resolved. Because we
| talk about our experiences or "objective" things like logic.
| midiguy wrote:
| > All of these unresolved arguments are about team dynamics,
| not technology
|
| No, it's definitely about technology. Let me simplify this
| for you. Technology A can do thing 1 very well, and thing 2
| decently. Technology B can do thing 2 well, but can't do
| thing 1 at all.
|
| In reality, people who only do technology B claim technology
| B is necessary to do thing 2 and go to great extents to write
| blog posts claiming such, while people who only do technology
| A get on with doing things 1 and 2 without feeling the need
| to rant.
| dec0dedab0de wrote:
| I've been thinking about this a lot, and the one thing I love
| about SPAs is that everything the user can do from the front end.
| They can do from the API. The trend has essentially tricked tons
| of corporate apps into opening up APIs to their users. My screen
| scraping skills are starting to get rusty, but it's worth it.
|
| I sometimes daydream about a framework that allows me to build a
| spa and a server side app at the same time using the same url
| scheme.
___________________________________________________________________
(page generated 2022-03-02 23:00 UTC)