<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="192186" data-post-id="192186">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="stevensonmt" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/stevensonmt/120/20503_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  stevensonmt
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Aren’t some of these concerns addressed by using css only solutions for things like drop downs and animations? JS has a clear role in web apps but it is probably overused for things that don’t really need it.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="192186" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/phoenix-liveview-vs-spa/34743/63">Post #62</a>
	                </div>
	            </div>
              <div id="likers-container-192186" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="192186"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #62"></div>
  </section>
</div>
    <div class="postbit" id="192187" data-post-id="192187">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="harmon25" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/harmon25/120/1274_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  harmon25
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I think one of the bigger arguments for something like React, is the very composable and reusable nature of the components. Attempts are being made for similar APIs in LiveView though which might open up the door to some interesting LiveView component libraries/toolkits…</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="192187" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/phoenix-liveview-vs-spa/34743/64">Post #63</a>
	                </div>
	            </div>
              <div id="likers-container-192187" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="192187"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #63"></div>
  </section>
</div>
    <div class="postbit" id="192191" data-post-id="192191">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="LostKobrakai" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/LostKobrakai/120/3072_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  LostKobrakai
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="stevensonmt" data-post="63" data-topic="34743" data-full="true">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/stevensonmt/48/20503_2.png" class="avatar"> stevensonmt:</div>
<blockquote>
<p>Aren’t some of these concerns addressed by using css only solutions for things like drop downs and animations? JS has a clear role in web apps but it is probably overused for things that don’t really need it.</p>
</blockquote>
</aside>
<p>If those things shall be properly accessible you need JS. Most of the css solutions – while working – are just hacks.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="192191" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/phoenix-liveview-vs-spa/34743/65">Post #64</a>
	                </div>
	            </div>
              <div id="likers-container-192191" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="192191"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #64"></div>
  </section>
</div>
    <div class="postbit" id="192193" data-post-id="192193">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="stevensonmt" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/stevensonmt/120/20503_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  stevensonmt
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>What do you mean by “properly accessible”?</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="192193" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/phoenix-liveview-vs-spa/34743/66">Post #65</a>
	                </div>
	            </div>
              <div id="likers-container-192193" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="192193"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #65"></div>
  </section>
</div>
    <div class="postbit" id="192194" data-post-id="192194">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="cnck1387" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  cnck1387
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="stevensonmt" data-post="66" data-topic="34743" data-full="true">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/stevensonmt/48/20503_2.png" class="avatar"> stevensonmt:</div>
<blockquote>
<p>What do you mean by “properly accessible”?</p>
</blockquote>
</aside>
<p>At the most basic level keyboard shortcuts.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="192194" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/phoenix-liveview-vs-spa/34743/67">Post #66</a>
	                </div>
	            </div>
              <div id="likers-container-192194" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="192194"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #66"></div>
  </section>
</div>
    <div class="postbit" id="192195" data-post-id="192195">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="dorgan" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/dorgan/120/22107_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  dorgan
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="harmon25" data-post="62" data-topic="34743">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/harmon25/48/1274_2.png" class="avatar"> harmon25:</div>
<blockquote>
<p>And if you think the app you are building is going to be Twitter, GitHub scale, and actually see meaningful organic growth from SEO - you are already a bit of a unicorn, imho</p>
</blockquote>
</aside>
<p>I’m already seeing real benefits from being indexed in search engines, it’s not about scale but visibility. As a content platform, SEO is crucial. It doesnt even have that much to do with scale. Not having a worldwide scale doesnt mean you shouldn’t care about your content being discoverable.</p>
<aside class="quote no-group" data-username="harmon25" data-post="62" data-topic="34743">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/harmon25/48/1274_2.png" class="avatar"> harmon25:</div>
<blockquote>
<p>I think the emphasis on SEO, and it being an argument against using an SPA is not at all universal.</p>
</blockquote>
</aside>
<p>What I’m pointing out is that SPA have their drawbacks. Business apps are also not universal. Of course you will make your desicions based on your target and use case . What I’m talking about has to do whith this kind of pain points:</p>
<aside class="quote no-group" data-username="harmon25" data-post="56" data-topic="34743">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/harmon25/48/1274_2.png" class="avatar"> harmon25:</div>
<blockquote>
<p>Yea I’m using this for React - <a href="https://github.com/revelrylabs/elixir_react_render" rel="noopener nofollow ugc">https://github.com/revelrylabs/elixir_react_render </a> - it runs some node processes in a pool on the same server as phoenix for invoking the necessary JS to render the HTML over stdio - its pretty rough - getting it all wired up and everything…and doesn’t help much reducing JS bloat, it has just about the same bloat, now on the server AND the Client <img src="https://forum.elixirforum.com/images/emoji/apple/confused.png?v=15" title=":confused:" class="emoji" alt=":confused:" loading="lazy" width="20" height="20"> And dealing with the initial render is a nightmare - like now need my API on localhost to access from within these local node processes to make the initial render worthwhile…</p>
</blockquote>
</aside>
<p>Once you need to serve content that can be indexed and be interactive to users, things get muddy. I don’t want to run a node server to do ssr or go back to being an spa just because the content I serve also has a fair degree of interactivity. And the alternative has a lot of cognitive load derived from the constant switch between Phoenix and js, which is less than ideal.</p>
<aside class="quote no-group" data-username="harmon25" data-post="62" data-topic="34743">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/harmon25/48/1274_2.png" class="avatar"> harmon25:</div>
<blockquote>
<p>client side rendering is free distributed computing…</p>
</blockquote>
</aside>
<p>If your audience has capable devices, which is not the case in many parts of the world.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="192195" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/phoenix-liveview-vs-spa/34743/68">Post #67</a>
	                </div>
	            </div>
              <div id="likers-container-192195" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="192195"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #67"></div>
  </section>
</div>
    <div class="postbit" id="192196" data-post-id="192196">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="LostKobrakai" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/LostKobrakai/120/3072_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  LostKobrakai
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Things like aria attributes and such need js to be modified.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="192196" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/phoenix-liveview-vs-spa/34743/69">Post #68</a>
	                </div>
	            </div>
              <div id="likers-container-192196" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="192196"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #68"></div>
  </section>
</div>
    <div class="postbit" id="192198" data-post-id="192198">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="harmon25" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/harmon25/120/1274_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  harmon25
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="dorgan" data-post="68" data-topic="34743">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/dorgan/48/22107_2.png" class="avatar"> dorgan:</div>
<blockquote>
<p>Business apps are also not universal.</p>
</blockquote>
</aside>
<p>Yes this is true, but we can probably agree that the vast majority of web apps are not public, and tools built for internal or business purposes with a very small userbase. And possibly sensitive data that has the exact opposite requirement…</p>
<aside class="quote no-group" data-username="dorgan" data-post="68" data-topic="34743">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/dorgan/48/22107_2.png" class="avatar"> dorgan:</div>
<blockquote>
<p>If your audience has capable devices, which is not the case in many parts of the world.</p>
</blockquote>
</aside>
<p>This is also true, and if you are in a developing country and building something for say the government, then yea it might be a disservice to your users to build an SPA. But, will the same be true 5 years from now? This depends on what grows faster, complexity/size of SPAs or availability of decent compute device’s + connectivity in the developing world</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="192198" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/phoenix-liveview-vs-spa/34743/70">Post #69</a>
	                </div>
	            </div>
              <div id="likers-container-192198" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="192198"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #69"></div>
  </section>
</div>
    <div class="postbit" id="192223" data-post-id="192223">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="AstonJ" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/AstonJ/120/15_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  AstonJ
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="dorgan" data-post="68" data-topic="34743">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/dorgan/48/22107_2.png" class="avatar"> dorgan:</div>
<blockquote>
<p>I’m already seeing real benefits from being indexed in search engines, it’s not about scale but visibility. As a content platform, SEO is crucial. It doesnt even have that much to do with scale. Not having a worldwide scale doesnt mean you shouldn’t care about your content being discoverable.</p>
</blockquote>
</aside>
<p>Something I think I am leaning towards doing is having a read-only version of the site shown to bots/non-JS users - like what Discourse does (if you turn off JS you’ll see what I mean). This isn’t something new mind, vBulletin was doing the same thing over a decade ago and out of all the forums back then they were almost always consistently ranking higher.</p>
<p>When I think about how I want to build apps moving forward, I think I want to separate, with different versions for no-js, desktop web users, mobile web users, mobile app users, desktop apps etc. It’s reached a point where these are now sufficiently different and a simple responsive site isn’t really going to do them all justice. This is why I was drawn to Dave’s Elixir course so much - you build the app in Elixir and then use Phoenix for the web layer (or even multiple layers) etc. (There was a good discussion about it <a href="https://forum.elixirforum.com/t/discussion-dont-add-a-database-layer-to-your-phoenix-application/8623" rel="nofollow">here</a>.)</p>
<aside class="quote no-group" data-username="harmon25" data-post="62" data-topic="34743">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/harmon25/48/1274_2.png" class="avatar"> harmon25:</div>
<blockquote>
<p>Also, pretty sure LiveView would not work that great for an App like Twitter, or GitHub - or at least at that scale. So say you did build the next <code>Socially Responsible Twitter</code> with LiveView - wonder how the engineering would evolve…I imagine the thought of an SPA would come up in the board room because the servers are starting to cost a bit too much. This same argument applies to the Redex library I have posted about - there is definitely a threshold of scale that likely means server side in memory state is a bad idea…</p>
</blockquote>
</aside>
<p>This is something I am thinking about more and more too.</p>
<p>I am reserving judgement for now tho. I am going to finish learning Svelte and then re-evaluate how I feel and how I am think I am personally going to build apps moving forward. Will definitely be keeping an eye on these threads in the meantime.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="192223" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/phoenix-liveview-vs-spa/34743/71">Post #70</a>
	                </div>
	            </div>
              <div id="likers-container-192223" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="192223"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #70"></div>
  </section>
</div>
    <div class="postbit" id="192225" data-post-id="192225">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="harmon25" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/harmon25/120/1274_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  harmon25
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I think you should give React another look also, its functional approach and simplicity really shines when combined with Elixir - the context switching between JSX ↔ Elixir is not bad at all. (its honestly no worse than writing eex,leex templates…)<br>
I pretty much only use map, reduce, filter and relatively simple string manipulation in JS  - all of which is immutable and feels quite a bit like piping stuff between <code>Enum</code> functions.  And event handling is just passing around simple function references, to onChange, onClick etc props…</p>
<p>As long as you use arrow functions - problems with <code>this</code> essentially disappear. I do recommend understanding why though.</p>
<p>You can get very far with just <a href="https://reactrouter.com/web/guides/quick-start" rel="noopener nofollow ugc">react-router</a>, and setting up React with phoenix is 1 additional babel <a href="https://github.com/surferseo/livedata_todomvc/blob/master/assets/.babelrc#L2" rel="noopener nofollow ugc">config</a>/<a href="https://github.com/surferseo/livedata_todomvc/blob/master/assets/package.json#L15" rel="noopener nofollow ugc">plugin</a>, do not even need to touch the webpack config.</p>
<p>Couple other recent additions to react, like <a href="https://reactjs.org/docs/hooks-intro.html" rel="noopener nofollow ugc">Hooks</a> - really changed everything.</p>
<p>Drop something like <a href="https://blueprintjs.com/docs/#core" rel="noopener nofollow ugc">Blueprint</a> in the mix - and you can have a damn near production ready prototype in a day or two…(<s>it comes with a built in hotkey API that is decent</s>) NVM it uses a decorator…<a href="https://github.com/palantir/blueprint/issues/3508" rel="noopener nofollow ugc">they need to add a hook API</a>…</p>
<p>Another package that covers all data fetching and global state concerns is <a href="https://react-query.tanstack.com/" rel="noopener nofollow ugc">react-query</a>. Have not actually used it, but am considering it for the React integration for whatever Redex/LiveData become..</p>
<p><a href="https://recoiljs.org/docs/basic-tutorial/atoms" rel="noopener nofollow ugc">recoiljs</a> also deserves an honorable mention - if you do need global UI state its a pretty nice way of achieving it, without complexity like Redux I have also not used it but came from some facebook engineers so should be OK…only problem is they use the term <code>Atom</code> - which is very much NOT the same as an erlang <code>atom</code>…</p>
<p>React performance is something that is improving with each release - it might not be as fast as Svelte - but its unlikely svelte has any room for improvement - the react team has been working on interesting things like <a href="https://reactjs.org/docs/concurrent-mode-intro.html" rel="noopener nofollow ugc">concurrent mode</a> - when that becomes stable - lots of large React apps will be faster with just a simple <code>npm update</code> This all kinda ties back to the huge amount of engineering that has gone into it - if SPAs are a naïve idea - probably would have realized by this point we were just digging ourselves into a deeper and deeper hole… OR maybe we just don’t realize it yet <img src="https://forum.elixirforum.com/images/emoji/apple/stuck_out_tongue.png?v=15" title=":stuck_out_tongue:" class="emoji" alt=":stuck_out_tongue:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="192225" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/phoenix-liveview-vs-spa/34743/72">Post #71</a>
	                </div>
	            </div>
              <div id="likers-container-192225" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="192225"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #71"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/34743/load_more?page=8">Load more posts (20 remaining)</a>
</div></template></turbo-stream>