<?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>Forem: Aghiles Lounis</title>
    <description>The latest articles on Forem by Aghiles Lounis (@axibord).</description>
    <link>https://forem.com/axibord</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%2F538441%2F52bf3e84-ae5d-4668-94bd-464dc5d9a7b9.png</url>
      <title>Forem: Aghiles Lounis</title>
      <link>https://forem.com/axibord</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/axibord"/>
    <language>en</language>
    <item>
      <title>Why Next.js Beats React + Vite for SPAs (It’s Not Just About SEO)</title>
      <dc:creator>Aghiles Lounis</dc:creator>
      <pubDate>Wed, 22 Jan 2025 10:37:57 +0000</pubDate>
      <link>https://forem.com/axibord/why-nextjs-beats-react-vite-for-spas-its-not-just-about-seo-b9g</link>
      <guid>https://forem.com/axibord/why-nextjs-beats-react-vite-for-spas-its-not-just-about-seo-b9g</guid>
      <description>&lt;p&gt;&lt;strong&gt;Let’s debunk a persistent myth&lt;/strong&gt;: Next.js isn’t just for SEO-obsessed marketing sites. Many teams assume React + Vite is better for single-page applications (SPAs) or highly interactive apps. But Next.js solves critical performance issues that React + Vite can’t address efficiently. Here’s why:&lt;/p&gt;

&lt;h2&gt;
  
  
  The Double Round-Trip Problem
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How React + Vite Fails
&lt;/h3&gt;

&lt;p&gt;In a typical React + Vite setup:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Client downloads JavaScript bundle first&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bundle parses&lt;/strong&gt; → triggers client-side data fetching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User waits again&lt;/strong&gt; for data → content renders&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This creates a &lt;strong&gt;network waterfall&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
&lt;code&gt;Download JS → Parse JS → Fetch Data → Render&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Even with lazy loading:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// React + Vite lazy loading example&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Dashboard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;lazy&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Client still fetches route JS first before data requests&lt;/li&gt;
&lt;li&gt;Double round-trips persist for every lazy-loaded route&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Next.js’s Server-Side Solution
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Next.js Server Component (zero client JS)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Dashboard&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Server-side fetch&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Chart&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Initial fetch on server:&lt;/strong&gt; HTML + data sent in one round-trip&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No client-side waterfalls:&lt;/strong&gt; Server-rendered HTML arrives ready-to-display&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bundle size reduced by ~30-60%&lt;/strong&gt; (server components don’t ship JS)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Streaming &amp;amp; Progressive Hydration
&lt;/h3&gt;

&lt;p&gt;Wrap slow components in :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Header&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* Instantly visible */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Suspense&lt;/span&gt; &lt;span class="nx"&gt;fallback&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SkeletonLoader&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Dashboard&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* Streams when ready */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Suspense&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Progressive loading:&lt;/strong&gt; Users interact with static UI while dynamic parts load&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Partial Prerendering (PPR) &amp;amp; Caching
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/page.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dynamicParams&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// SSG for static parts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;revalidate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// ISR every hour&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;DynamicSection&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchPersonalizedData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// SSR&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;UserProfile&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Edge caching:&lt;/strong&gt; Frequently accessed data stored at CDN edge nodes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RSC Payloads:&lt;/strong&gt; Serialized server components cached between navigation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It means you're getting better: FCP, TTFB, TTI basically for FREE.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Bottom Line
&lt;/h3&gt;

&lt;p&gt;Next.js isn’t just a framework—it’s a performance-first architecture that rethinks how data and components load. Use it for almost any modern web app unless your environment strictly forbids server-side logic (like Chrome extensions). In those rare cases, React + Vite becomes the pragmatic choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js for&lt;/strong&gt; 95% of web apps (better UX, performance, scalability, and much more...)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React + Vite in&lt;/strong&gt; edge cases like Chrome extensions, embeddable widgets or ANY client-only execution environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Found this helpful? Consider sharing it with your network! 🚀&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>vite</category>
    </item>
    <item>
      <title>A Simple Boilerplate for React.js Projects</title>
      <dc:creator>Aghiles Lounis</dc:creator>
      <pubDate>Mon, 28 Dec 2020 18:42:38 +0000</pubDate>
      <link>https://forem.com/axibord/a-simple-boilerplate-for-react-js-projects-4j41</link>
      <guid>https://forem.com/axibord/a-simple-boilerplate-for-react-js-projects-4j41</guid>
      <description>&lt;h1&gt;
  
  
  Brief description
&lt;/h1&gt;

&lt;p&gt;This boilerplate focuses on simplicity, speed and ability to choose a structure that fit your project, maybe you won't need if its a simple portfolio for example. This is a simple boilerplate for React.js projects with no specific structure, if you want a structured react boilerplate using typescript, i wrote a complete article about it &lt;a href="https://bit.ly/2Mib1yJ" rel="noopener noreferrer"&gt;https://bit.ly/2Mib1yJ&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Files structure
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzh60liai6eqqc90kzyyo.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzh60liai6eqqc90kzyyo.PNG" alt="files" width="601" height="717"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Git clone: &lt;a href="https://github.com/axibord/react-webpack-template" rel="noopener noreferrer"&gt;https://github.com/axibord/react-webpack-template&lt;/a&gt;
&lt;/h4&gt;

&lt;h2&gt;
  
  
  Supported features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sass/Scss compilation and normal css is supported without any configuration (make sure to have local compiler for Sass on your computer)&lt;/li&gt;
&lt;li&gt;The amazing TailwindcssV2 pre-configured with Postcss&lt;/li&gt;
&lt;li&gt;Eslint with strict Airbnb style to enforce consistency and clean code&lt;/li&gt;
&lt;li&gt;Code formatting using prettier&lt;/li&gt;
&lt;li&gt;Using cutting edge Webpack 5 to compile everything&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;To run a build for &lt;strong&gt;production&lt;/strong&gt; with minimal bundle size make sure to follow the steps in the repository.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Feel free to &lt;code&gt;git clone&lt;/code&gt; the repository, play with it and tell me what you think and what need to be improved/added, make a pull request or reach out to me and have a discussion.&lt;/p&gt;

&lt;p&gt;If you find this helpful, please follow my Twitter &lt;a href="https://twitter.com/Axibord1" rel="noopener noreferrer"&gt;profile&lt;/a&gt;&lt;/p&gt;




</description>
      <category>react</category>
      <category>javascript</category>
      <category>saas</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Boilerplate for React-Typescript projects</title>
      <dc:creator>Aghiles Lounis</dc:creator>
      <pubDate>Mon, 21 Dec 2020 06:41:24 +0000</pubDate>
      <link>https://forem.com/axibord/boilerplate-for-react-typescript-projects-55cg</link>
      <guid>https://forem.com/axibord/boilerplate-for-react-typescript-projects-55cg</guid>
      <description>&lt;h1&gt;
  
  
  Brief description
&lt;/h1&gt;

&lt;p&gt;Starter for React projects following Atomic design structure, i found it clear and intuitive to use and works for most projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Files structure
&lt;/h2&gt;

&lt;p&gt;If you are new and want to learn more about atomic design i suggest reading this blog post: &lt;a href="https://medium.com/@WeAreMobile1st/atomic-design-getting-started-916bc81bad0e" rel="noopener noreferrer"&gt;https://medium.com/@WeAreMobile1st/atomic-design-getting-started-916bc81bad0e&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmgtntpdiyv67weikq8m5.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmgtntpdiyv67weikq8m5.PNG" alt="files structure" width="567" height="811"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Git clone here:&lt;/strong&gt; &lt;a href="https://github.com/axibord/react-typescript-starter" rel="noopener noreferrer"&gt;https://github.com/axibord/react-typescript-starter&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is included in this boilerplate ?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Support for both JSX and TSX&lt;/li&gt;
&lt;li&gt;Support for SASS/SCSS using &lt;code&gt;sass-loader&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Support for TailwindcssV2 with the help of &lt;code&gt;postcss-loader&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Strict linting with Eslint and Prettier configured for typescript&lt;/li&gt;
&lt;li&gt;Finally everything is compiled with Webpack 5 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To run a build for production with minimal bundle size possible make sure to follow the steps in the repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Future improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Support for &lt;strong&gt;scoped&lt;/strong&gt; css and sass/scss in each component&lt;/li&gt;
&lt;li&gt;Better Eslint rules by following Airbnb style for exemple&lt;/li&gt;
&lt;li&gt;Improve &lt;code&gt;tsconfig.json&lt;/code&gt; file for better compilation and debugging&lt;/li&gt;
&lt;li&gt;Tslint instead of Eslint (&lt;em&gt;not sure its an improvement&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you find this helpful, please follow my Twitter &lt;a href="https://twitter.com/Axibord1" rel="noopener noreferrer"&gt;profile&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Feel free to &lt;code&gt;git clone&lt;/code&gt; it and tell me what you think, if you have any suggestions and want to contribute just fork it and make a request or reach out to me.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>typescript</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
