<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mike Stelzer</title>
    <description>The latest articles on DEV Community by Mike Stelzer (@mstelz).</description>
    <link>https://dev.to/mstelz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F241541%2Fad49f83f-2d21-49c8-a7c2-8cb8460a2f08.jpeg</url>
      <title>DEV Community: Mike Stelzer</title>
      <link>https://dev.to/mstelz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mstelz"/>
    <language>en</language>
    <item>
      <title>Staying Hydrated with JavaScript</title>
      <dc:creator>Mike Stelzer</dc:creator>
      <pubDate>Fri, 21 Apr 2023 17:17:29 +0000</pubDate>
      <link>https://dev.to/mstelz/staying-hydrated-with-javascript-30gm</link>
      <guid>https://dev.to/mstelz/staying-hydrated-with-javascript-30gm</guid>
      <description>&lt;p&gt;If you are like me, your web journey began when everything was much simpler. Create an HTML page and some CSS, throw it up on an Apache server, and you were well on your way to a website. Flash forward (pun intended) to what you see on the web today: You must choose between a slew of different web libraries and frameworks that all attempt to solve problems in different ways. &lt;/p&gt;

&lt;p&gt;In this post, I dive into some of the various methods JavaScript projects are trying to solve for the age-old problem of performance. Specifically, two metrics seem to surface frequently when evaluating web vitals: Time To Load (TTL) and Time To Interactive (TTI). &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Time to Load (TTL)&lt;/em&gt; is the amount of time it takes for a page or application to load and display its content in the users' browser. This means all HTML, CSS, JavaScript, images, and other assets that are required to render the page have been downloaded. The measurement is usually taken from when the page is requested to when the final asset is downloaded, and the page is completely rendered. &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Time to Interactive (TTI)&lt;/em&gt; is the time it takes for a web page or application to be "interactive", meaning the user can begin interacting with elements on the page. This is measured from the moment the page is requested to the point in which the page is fully rendered and the JavaScript code has finished executing, allowing for page interactivity.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;How a site is rendered--whether at the client or at the server side--directly affects TTL and TTI. For example, with a server rendered page you may see the content sooner but it may take additional time for that page to become interactive. &lt;/p&gt;

&lt;p&gt;To better understand why that is, I think it is important to understand the difference between client-rendered and server-rendered applications when it comes to React. When a user makes a request for a page on a client-rendered application, the server returns an HTML document that includes a JavaScript bundle (in the script tags, which also then need to be downloaded), this bundle is then responsible for rendering the UI on the client's machine. &lt;/p&gt;

&lt;p&gt;With a server-rendered application, the initial rendering of the UI takes place on the server-side. When a user makes a request for a page, the server generates an HTML document built from React components and returns that document to the user. This page is visible and users can interact with it right away, but until the JavaScript bundle is downloaded, the React components will not be entirely interactive.&lt;/p&gt;

&lt;p&gt;Each approach has its pros and cons. While SSR (server-side rendering) can result in better initial load times, SEO benefits, and improved accessibility, it can result in higher server loads and less initial interactivity. CSR (client-side rendering) can result in faster page transitions and interactivity, while sacrificing initial load times, SEO, and accessibility benefits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Accessibility and rendering techniques
&lt;/h3&gt;

&lt;p&gt;As mentioned above, the rendering technique that is used affects accessibility. Why is that? A few reasons you may see a degraded accessibility experience when using client-side rendering (CSR) include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increased initial load times.&lt;/li&gt;
&lt;li&gt;CSR relies more heavily on JavaScript for rendering and interactivity. So, a user with JavaScript disabled will be more impacted than a website rendered on the server-side.&lt;/li&gt;
&lt;li&gt;Client-side rendered applications often manipulate dynamic elements or interactions with JavaScript on the client-side. Assistive technologies such as screen readers may not be able to properly convey this element or changes. Whereas, many SSR approaches generate HTML with proper markup and accessibility attributes on initial render.&lt;/li&gt;
&lt;li&gt;CSR approaches generally update or change content after the initial page load, which may pose challenges for assistive technologies in detecting or announcing updates.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hydration
&lt;/h2&gt;

&lt;p&gt;In React, and with many other JavaScript frameworks, a process called &lt;em&gt;hydration&lt;/em&gt; takes place. What is hydration? Both client-side rendered and server-side rendered applications produce HTML from React components. This HTML may require event listeners or other behaviors such as animations, interactivity, form validation, etc, to truly be interactive. This is where hydration comes in. Hydration is the process of attaching event listeners or other behaviors to the HTML produced by the client or the server. For example, the image below depicts what a typical server rendered lifecycle may look like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Ff_auto%2Cq_100%2Cw_1600%2Fv1671640463%2Fnextjs-docs%2Fdarkmode%2Fssr-chart.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Ff_auto%2Cq_100%2Cw_1600%2Fv1671640463%2Fnextjs-docs%2Fdarkmode%2Fssr-chart.png" alt="typical SSR lifecycle"&gt;&lt;/a&gt;&lt;br&gt;
Image courtesy of &lt;a href="https://beta.nextjs.org/docs/data-fetching/streaming-and-suspense" rel="noopener noreferrer"&gt;Next.js Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This process can result in slow initial load times when working with large applications. But there are some options depending on your use case to speed this process up. A common approach is to split the JavaScript bundle into smaller, more manageable chunks and load them asynchronously after the initial HTML has rendered. Another approach would be to use SSR to reduce the number of operations the hydration process requires because the initial HTML page already contains the behavior and event listeners. &lt;/p&gt;

&lt;h3&gt;
  
  
  Partial or Selective Hydration
&lt;/h3&gt;

&lt;p&gt;You may have also come across the term &lt;em&gt;partial hydration&lt;/em&gt;. This is when the hydration process only hydrates small parts of the page that require updating. &lt;a href="https://docs.astro.build/en/concepts/islands" rel="noopener noreferrer"&gt;Astro Islands&lt;/a&gt; and React 18's selective hydration come to mind in different implementations of this concept. A nice feature with React's selective hydration is that it prioritizes what it is hydrated based on interactions within the page, such as a button click.&lt;/p&gt;

&lt;p&gt;While these two implementations are similar in concept, they are different because React's selective hydration is only available within React itself, whereas Astro's partial hydration is part of the Astro framework which accommodates multiple frameworks.&lt;/p&gt;

&lt;p&gt;React's selective hydration would be effective when dealing with large, complex components that may require a lot of client-side processing. Astro's partial hydration would be best suited when dealing with small, modular components that can be loaded on an as-needed basis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Streaming HTML
&lt;/h2&gt;

&lt;p&gt;A new feature in React 18 is the ability to stream HTML. This allows the rendering of a React component to begin on the server and incrementally send the HTML back to the client as it is generated. This will produce a faster initial load and a more responsive user experience because the user can begin interacting with the application as soon as the initial content is downloaded, while still asynchronously loading additional suspended chunks.&lt;/p&gt;

&lt;p&gt;A perfect example of this would be an article that has comments below. You can load the critical piece of the page—the article—without waiting for the comments to load. Using suspense, you could instead display a spinner until the comments are ready. The following image shows this scenario:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Ff_auto%2Cq_100%2Cw_1600%2Fv1671640286%2Fnextjs-docs%2Fdarkmode%2Fserver-rendering-with-streaming-chart.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Ff_auto%2Cq_100%2Cw_1600%2Fv1671640286%2Fnextjs-docs%2Fdarkmode%2Fserver-rendering-with-streaming-chart.png" alt="Streaming SSR"&gt;&lt;/a&gt;&lt;br&gt;
Image courtesy of &lt;a href="https://beta.nextjs.org/docs/data-fetching/streaming-and-suspense" rel="noopener noreferrer"&gt;Next.js Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While React's streaming of HTML may bring a lot of benefits, it's also important to note some potential downsides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Streaming HTML requires a server that supports HTTP/2 or newer and client-side browsers to support it as well. Older browsers or devices may not support this functionality. &lt;/li&gt;
&lt;li&gt;An application using streaming HTML may be more complex than one without and pose a steeper learning curve for a team not familiar with the different techniques being used.&lt;/li&gt;
&lt;li&gt;Streaming HTML can improve the initial load time, but it may require careful consideration of caching and performance strategies. These strategies may include managing server-side caching and rendering strategies to prevent server overload due to frequent streaming requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qwik's Resumable Rendering
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://qwik.builder.io/" rel="noopener noreferrer"&gt;Qwik&lt;/a&gt; is another front-end framework that aims to improve the performance of applications by providing a unique server-side rendering solution. Qwik calls this unique solution &lt;em&gt;resumable rendering&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The first thing to note is that Qwik is not React, nor does it use React. It does use JSX as its template syntax, which means components may look similar to ones created in React. But, you can also use React within Qwik with &lt;a href="https://qwik.builder.io/docs/integrations/react/" rel="noopener noreferrer"&gt;Qwik React&lt;/a&gt; to make transitions easier if you choose to do so.&lt;/p&gt;

&lt;p&gt;Qwik avoids the need to hydrate the HTML returned by the server by serializing all the required information as part of the HTML during the SSR process. It also uses a global event handler that relies on event bubbling to intercept all events. This global event handler means Qwik doesn't need to register handlers on individual DOM elements. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.builder.io%2Fapi%2Fv1%2Fimage%2Fassets%252FYJIGb4i01jvw0SRdL5Bt%252F04681212764f4025b2b5f5c6a258ad6e%3Fformat%3Dwebp%26width%3D2000" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.builder.io%2Fapi%2Fv1%2Fimage%2Fassets%252FYJIGb4i01jvw0SRdL5Bt%252F04681212764f4025b2b5f5c6a258ad6e%3Fformat%3Dwebp%26width%3D2000" alt="Qwik's resumeable lifecycle"&gt;&lt;/a&gt; &lt;br&gt;
Image courtesy of &lt;a href="https://www.builder.io/blog/hydration-is-pure-overhead" rel="noopener noreferrer"&gt;builder.io docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With hydration, all event handlers are created and attached before the event is triggered (eagerly). Whereas with Qwik, the creation of the event handler happens after the event is triggered on an as-needed basis (lazily). This is done by deserializing the event handler from the HTML which prevents duplication of the work already done by the server.&lt;/p&gt;

&lt;p&gt;Qwik is definitely a tool to watch. With it being a relatively newer platform, it may be lacking from a community standpoint or ecosystem of tooling when compared with other frameworks. And because Qwik serializes its handlers as part of its HTML, it requires those to be eligible for serialization which may prove difficult for certain edge cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;There are many front-end technologies available today, each with a slightly different approach for improving performance and user experience. When choosing which technique or combination of techniques best fits your needs, the answer unfortunately is "it depends". Each and every use case is different, but choosing a familiar technique whose capabilities and limitations you understand is generally a good solution.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>qwik</category>
    </item>
    <item>
      <title>How are you building React applications? It's time to move on from Create React App</title>
      <dc:creator>Mike Stelzer</dc:creator>
      <pubDate>Tue, 11 Apr 2023 19:07:08 +0000</pubDate>
      <link>https://dev.to/mstelz/how-are-you-building-react-applications-its-time-to-move-on-from-create-react-app-48fk</link>
      <guid>https://dev.to/mstelz/how-are-you-building-react-applications-its-time-to-move-on-from-create-react-app-48fk</guid>
      <description>&lt;p&gt;"How are you building React applications?" This is a question that often comes up with application engineers when they are starting new projects. People tend to gravitate towards what they know, but is that the correct choice? And, with so many options today, how do you know what the right choice is? &lt;/p&gt;

&lt;p&gt;While many of us started our React journeys by using the Create React App tool, it's best days are behind it. It's time to evaluate new tools. This blog post covers why it's time to move beyond Create React App and introduces you to new tools, including Next.js and Vite, that can help you build React applications better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations of Create React App
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://create-react-app.dev"&gt;Create React App&lt;/a&gt; was designed with one purpose in mind: To provide an accessible way for anyone with a terminal to create a React application. The open-source tool was ideal for learning or becoming familiar with React.&lt;/p&gt;

&lt;p&gt;The benefit to this tool was that developers could begin developing straight away without the need to learn complex build tooling such as webpack or set up a slew of tools such as Babel, ESlint, or TypeScript. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"[Create React App] was intentionally minimal and limited in scope (no configuration, no plugin system) for two reasons. One reason was that, the more feature-rich it is, the harder upgrades will be. The other reason was, I knew that React itself will take a vast majority of our time, and I won't be able to dedicate more than a few weeks sporadically to CRA every now and then."&lt;/p&gt;

&lt;p&gt;~ Create React App Co-Creator&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Due to this unnecessary need to learn tooling, developers skipped learning the underlying tools their applications were so heavily built upon, causing them to become reliant on this no-configuration style approach. This issue becomes apparent once teams need to break out of the safety net CRA provides. &lt;/p&gt;

&lt;p&gt;The CRA developers knew developers would eventually need to enable features beyond the feature set provided, so they created an &lt;a href="https://create-react-app.dev/docs/available-scripts/#npm-run-eject"&gt;eject&lt;/a&gt; button for teams. The eject feature removed the dependency on &lt;code&gt;react-scripts&lt;/code&gt; and copied a snapshot, in-time version of the configuration files used in the project. The snapshot version of these complex configuration files coupled with a lack of individual knowledge about the tooling caused projects to either stop their upgrades or introduce messy updates when needed. CRA even suggests forking &lt;code&gt;react-scripts&lt;/code&gt; instead of ejecting for somewhat easier updates, but this also can be a daunting task depending on your use case or familiarity with the tooling.&lt;/p&gt;

&lt;p&gt;So, instead of entirely managing these configuration files, teams took to utilizing tools such as &lt;a href="https://github.com/dilanx/craco"&gt;Craco&lt;/a&gt; to override configurations. These tools also come with their limitations: they were not updated as quickly as CRA, so there was always a lag in implementing new features, and they added an extra layer of complexity to existing tools through overrides and additional tools.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Realistically, CRA is inherently very limited. It does not follow best practices for performance because it produces client-side only apps. This means it doesn't benefit from optimizations that are commonplace today with other frameworks, such as static generation or server-side rendering. Unless there is a drastic redesign, it won't benefit from future-facing features like Server Components. So if you care about delivering the best user experience, I don't think CRA is the right tool in the first place. It has its use cases, but many other tools now exist that do this job better. CRA still works great for the getting started use case, but you shouldn't see it as the best React app setup. It's not, and isn't meant to be."&lt;br&gt;
~ Create React App Co-Creator&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Still not convinced to move on from Create React App? Even the &lt;a href="https://react.dev/learn/start-a-new-react-project"&gt;React Docs&lt;/a&gt; no longer recommend Create React App for bootstrapping a new project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next.js as an alternative to Create React App
&lt;/h2&gt;

&lt;p&gt;Next.js, much like Create React App, is a no/low configuration framework to quickly get a project up and running with React. Next.js does offer a greater feature set and the ability to natively override build tool configurations based on your needs. &lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits of Next.js
&lt;/h3&gt;

&lt;p&gt;React natively renders content in the browser through client-side rendering. This means the end user downloads all the assets and code necessary for the browser itself to convert the React code to a native DOM output for the browser to display. Next.js, on the other hand, allows the use of both client-side rendering as well as server-side rendering, which means the server interprets the code and produces the DOM elements required for the browser to display. &lt;/p&gt;

&lt;p&gt;By using server-side rendering (SSR), the server is able to optimize the delivery of JavaScript, CSS, and other asset chunks in preparation for the browser to display results in a faster initial load time. I won't spend time diving into the nuances of this as many other individuals have already done so. If you are interested, check out this article showcasing the &lt;a href="https://blog.logrocket.com/create-react-app-vs-next-js-performance-differences/"&gt;comparison of CRA vs Next.js performance differences&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In additional to SSR, Next.js provides additional options for data fetching, providing alternative options for rendering based on the application's use case.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vRpWxbgl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://technology.discover.com/assets/images/content/posts/react-alternatives/nextjs.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vRpWxbgl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://technology.discover.com/assets/images/content/posts/react-alternatives/nextjs.webp" alt="Next.js Rendering capabilities" width="800" height="258"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Next.js provides native &lt;a href="https://www.typescriptlang.org/"&gt;TypeScript&lt;/a&gt; support requiring a zero-configuration approach to using TypeScript in your projects. Next.js also includes a &lt;a href="https://nextjs.org/docs/routing/introduction"&gt;built in router&lt;/a&gt; without the need to include additional libraries such as &lt;a href="https://reactrouter.com/"&gt;React Router&lt;/a&gt;. All-in-all, there is a long list of features provided by Next.js such as: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;image and font optimization&lt;/li&gt;
&lt;li&gt;built-in CSS support&lt;/li&gt;
&lt;li&gt;build caching&lt;/li&gt;
&lt;li&gt;linter setup&lt;/li&gt;
&lt;li&gt;page and layout support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Be sure to check out the &lt;a href="https://nextjs.org/docs/basic-features/pages"&gt;Next.js documentation page&lt;/a&gt; to read more.&lt;/p&gt;

&lt;p&gt;Now, you may be thinking to yourself: "Next.js doesn't seem to solve the problem of the development team not learning the toolchain the application is built on." And, you are correct. &lt;/p&gt;

&lt;p&gt;Even though Next.js provides additional configuration options and the ability to override most of the tooling it uses, it still masks the complexity of the underlying toolchain. In many cases, this is acceptable because you can access tools to modify, if necessary, while not recreating the wheel every time you want to do something relatively basic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Downsides of Next.js
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Next.js has a relatively poor plugin ecosystem&lt;/li&gt;
&lt;li&gt;Customizing routing can be cumbersome&lt;/li&gt;
&lt;li&gt;Extremely opinionated (could also be a benefit)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Roll your own with Vite
&lt;/h2&gt;

&lt;p&gt;What about rolling your own? Most people that have only ever used CRA, Next.js, or similar tools will think that seems like a lot of work. In the past, it usually did require quite a bit of knowledge about webpack, so you aren't wrong. But tooling has come a long way, and tools like &lt;a href="https://parceljs.org/"&gt;Parcel&lt;/a&gt;, &lt;a href="https://nx.dev/react"&gt;NX&lt;/a&gt;, and &lt;a href="https://github.com/jaredpalmer/razzle"&gt;Razzle&lt;/a&gt; have simplified the process. Even more recently, &lt;a href="https://vitejs.dev/"&gt;Vite&lt;/a&gt; has gained an ever-increasing market share. &lt;/p&gt;

&lt;p&gt;"Why?" you might ask. Vite is built on top of &lt;a href="https://esbuild.github.io/"&gt;esbuild&lt;/a&gt;, a Go-based bundler for the web that is 10-100x faster than other bundlers such as webpack. Vite is also platform-agnostic, so you can learn the tool and use it for many applications. &lt;/p&gt;

&lt;p&gt;Vite has a great plugin ecosystem because it leverages the same plugin interface as &lt;a href="https://rollupjs.org/"&gt;Rollup&lt;/a&gt;, meaning most Rollup plugins are also compatible with Vite. The Vite &lt;a href="https://vitejs.dev/guide/why.html"&gt;guide&lt;/a&gt; offers more reasons for why you might want to check out Vite.&lt;/p&gt;

&lt;p&gt;It also has a nice tool &lt;a href="https://github.com/vitejs/vite/tree/main/packages/create-vite"&gt;create-vite&lt;/a&gt; which aids in the creation of a a project using a set of predefined templates much like CRA does. As of this writing, currently supported templates are: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vanilla&lt;/li&gt;
&lt;li&gt;vanilla-ts&lt;/li&gt;
&lt;li&gt;vue&lt;/li&gt;
&lt;li&gt;vue-ts&lt;/li&gt;
&lt;li&gt;react&lt;/li&gt;
&lt;li&gt;react-ts&lt;/li&gt;
&lt;li&gt;react-swc&lt;/li&gt;
&lt;li&gt;react-swc-ts&lt;/li&gt;
&lt;li&gt;preact&lt;/li&gt;
&lt;li&gt;preact-ts&lt;/li&gt;
&lt;li&gt;lit&lt;/li&gt;
&lt;li&gt;lit-ts&lt;/li&gt;
&lt;li&gt;svelte&lt;/li&gt;
&lt;li&gt;svelte-ts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vite isn't quite rolling your own, but is getting much closer to the toolchain than the previous options. &lt;/p&gt;

&lt;h3&gt;
  
  
  Other alternatives?
&lt;/h3&gt;

&lt;p&gt;Obviously, there are tons of other options available besides the ones listed above, but I wanted to showcase a natural progression developers can take within the React ecosystem. Below are some links to additional popular options other developers use for building and bundling their React applications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://parceljs.org/recipes/react/"&gt;Parcel&lt;/a&gt;: Prides themselves on the zero-configuration approach.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nx.dev/packages/react"&gt;Nx&lt;/a&gt;: Most notably known as a monorepo tool set with a vast plugin ecosystem.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://razzlejs.org/"&gt;Razzle&lt;/a&gt;: I've never used it personally, but based on what I can tell it seems to be an attempt to enhance the Create React App concept, enabling CSR/SSR while also working well with libraries other than React. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.gatsbyjs.com/"&gt;Gatsby&lt;/a&gt;: Excels in static site generation and uses GraphQL for data management.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;It is great to see so many options available for both new and old developers. It seems as though every few months, another player emerges in the space looking to challenge and disrupt the React ecosystem. Because of this ever-changing landscape, it's best not to over-invest time and resources on one tool, but instead lean on the experts in the communities such as Next, Parcel etc. for a somewhat-opinionated approach to solving similar problems.&lt;/p&gt;

&lt;p&gt;Looking forward, some other projects that I find have some really great potential in the approach they take to simplify the toolbox are Remix and Astro.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Remix&lt;/strong&gt;: is a web framework built with web standards and progressive enhancement in mind. Check out their &lt;a href="https://remix.run/"&gt;project page&lt;/a&gt; for more information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Astro&lt;/strong&gt;: is a web framework that encourages the use of the &lt;a href="https://www.patterns.dev/posts/islands-architecture"&gt;island architecture&lt;/a&gt; and more checkout their &lt;a href="https://astro.build/"&gt;project page&lt;/a&gt; for more information.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/facebook/create-react-app/issues/11180#issuecomment-874748552"&gt;Issue response from Meta Co-Creator of Create React App&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>vite</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
