<?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: Zineb Esso</title>
    <description>The latest articles on Forem by Zineb Esso (@zinebesso).</description>
    <link>https://forem.com/zinebesso</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%2F3060115%2F34b6680d-57d9-4ffd-ad53-70c26071e2ad.png</url>
      <title>Forem: Zineb Esso</title>
      <link>https://forem.com/zinebesso</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/zinebesso"/>
    <language>en</language>
    <item>
      <title>How I Optimized a Next.js +Refine + Ant Design Project for Lightning-Fast Performance 🚀</title>
      <dc:creator>Zineb Esso</dc:creator>
      <pubDate>Sat, 26 Apr 2025 19:26:23 +0000</pubDate>
      <link>https://forem.com/zinebesso/how-i-optimized-a-refine-nextjs-ant-design-project-for-lightning-fast-performance-glf</link>
      <guid>https://forem.com/zinebesso/how-i-optimized-a-refine-nextjs-ant-design-project-for-lightning-fast-performance-glf</guid>
      <description>&lt;p&gt;When working with frameworks like Refine, Next.js, and Ant Design, it's easy to build powerful apps — but making them &lt;em&gt;fast and optimized&lt;/em&gt; takes some extra steps.&lt;/p&gt;

&lt;p&gt;In this post, I'll show you how I took a standard Refine + Next.js project and customized it for &lt;strong&gt;better performance&lt;/strong&gt;, &lt;strong&gt;faster loading times&lt;/strong&gt;, and &lt;strong&gt;smoother UX&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
(And yes, I'll share Core Web Vitals scores before and after the optimizations! 📈)&lt;/p&gt;


&lt;h2&gt;
  
  
  🔥 Quick Demo
&lt;/h2&gt;

&lt;p&gt;Here's a quick demo showing the performance difference after optimization:  &lt;/p&gt;
&lt;h3&gt;
  
  
  Before:
&lt;/h3&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%2Fuploads%2Farticles%2Fz5a66bjanpeo1wmzvwa9.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%2Fuploads%2Farticles%2Fz5a66bjanpeo1wmzvwa9.png" alt="Before Optimization" width="774" height="726"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  After:
&lt;/h3&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%2Fuploads%2Farticles%2F44txaqjr103laz1vhhhw.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%2Fuploads%2Farticles%2F44txaqjr103laz1vhhhw.png" alt="After Optimization" width="739" height="718"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🧩 Stack Overview
&lt;/h2&gt;
&lt;h3&gt;
  
  
  What is Refine?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://refine.dev/" rel="noopener noreferrer"&gt;Refine&lt;/a&gt; is a headless React framework focused on building internal tools, admin panels, and dashboards — making CRUD operations much easier.&lt;/p&gt;
&lt;h3&gt;
  
  
  What is Ant Design (antd)?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://ant.design/" rel="noopener noreferrer"&gt;Ant Design&lt;/a&gt; is an enterprise-class UI library offering a large collection of well-designed React components, perfect for clean, consistent UIs.&lt;/p&gt;
&lt;h2&gt;
  
  
  ⚙️ Step 1: Customizing &lt;code&gt;next.config.mjs&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The first big move was &lt;strong&gt;tuning the Next.js configuration&lt;/strong&gt; to make imports smarter, bundles smaller, and builds faster.&lt;/p&gt;

&lt;p&gt;Here's the updated &lt;code&gt;next.config.mjs&lt;/code&gt;:&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="cm"&gt;/** @type {import('next').NextConfig} */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;transpilePackages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@refinedev/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@refinedev/devtools&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@refinedev/nextjs-router&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@refinedev/kbar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@refinedev/nestjsx-crud&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@refinedev/antd&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@ant-design/icons&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;antd&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;experimental&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;optimizePackageImports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@refinedev/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@refinedev/devtools&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@refinedev/nextjs-router&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@refinedev/kbar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@refinedev/nestjsx-crud&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@refinedev/antd&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@ant-design/icons&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;antd&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;swcMinify&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;modularizeImports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;antd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;antd/es/{{member}}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;preventFullImport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@ant-design/icons&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@ant-design/icons/es/icons/{{member}}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;preventFullImport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;compiler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;reactRemoveProperties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;removeConsole&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;exclude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;standalone&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🧠 Key Config Changes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transpile external packages&lt;/strong&gt; for better compatibility&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimize package imports&lt;/strong&gt; for tree-shaking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modularize imports&lt;/strong&gt; to avoid loading full libraries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remove console logs&lt;/strong&gt; and non-essential props from production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standalone output&lt;/strong&gt; for lighter deployments (Docker, serverless)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Result&lt;/strong&gt;: Faster builds, smaller bundles, and better runtime performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Step 2: Adding a Global &lt;code&gt;loading.tsx&lt;/code&gt; Component
&lt;/h2&gt;

&lt;p&gt;We don't want users staring at blank screens, right?&lt;br&gt;&lt;br&gt;
I added a global loading indicator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/loading.tsx&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Loading&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;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex items-center justify-center h-screen text-lg"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    Loading...
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Loading&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why This Matters:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;📱 Gives instant feedback while components load&lt;/li&gt;
&lt;li&gt;⚡ Improves "perceived performance" (even if load time is the same)&lt;/li&gt;
&lt;li&gt;🎯 Reduces Largest Contentful Paint (LCP) and layout shifts&lt;/li&gt;
&lt;li&gt;📈 Improves SEO and Core Web Vitals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Result&lt;/strong&gt;: Faster-feeling app + better UX from the user's perspective.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡ Step 3: Dynamic Imports with &lt;code&gt;next/dynamic&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Instead of using &lt;code&gt;React.lazy&lt;/code&gt;, Next.js offers &lt;code&gt;dynamic()&lt;/code&gt; for better optimization.&lt;/p&gt;

&lt;p&gt;Here’s how I used it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;dynamic&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next/dynamic&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Suspense&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;LoadingSpinner&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@context/loadingSpinner&lt;/span&gt;&lt;span class="dl"&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;BlogPostCreateComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dynamic&lt;/span&gt;&lt;span class="p"&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="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="s2"&gt;@components/blog/create&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;ssr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;loading&lt;/span&gt;&lt;span class="p"&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;LoadingSpinner&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&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;BlogPostCreate&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Suspense&lt;/span&gt; &lt;span class="na"&gt;fallback&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;LoadingSpinner&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;BlogPostCreateComponent&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Suspense&lt;/span&gt;&lt;span class="p"&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;h3&gt;
  
  
  Why Use &lt;code&gt;dynamic()&lt;/code&gt; Instead of &lt;code&gt;lazy()&lt;/code&gt;?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🏎️ &lt;strong&gt;Built-in to Next.js&lt;/strong&gt; and integrates perfectly&lt;/li&gt;
&lt;li&gt;🔥 &lt;strong&gt;Control over SSR&lt;/strong&gt; (disable server-side rendering if needed)&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Automatic code splitting&lt;/strong&gt; for lighter pages&lt;/li&gt;
&lt;li&gt;🎡 &lt;strong&gt;Custom loading states&lt;/strong&gt; (better than default browser loading)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Result&lt;/strong&gt;: Less initial JavaScript, quicker interaction, and smoother page transitions.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎨 Step 4: Tailwind CSS Optimization with JIT Mode
&lt;/h2&gt;

&lt;p&gt;Tailwind can get bloated if not handled properly.&lt;br&gt;&lt;br&gt;
That's why I enabled &lt;strong&gt;Just-in-Time (JIT) mode&lt;/strong&gt; in &lt;code&gt;tailwind.config.js&lt;/code&gt;:&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="cm"&gt;/** @type {import('tailwindcss').Config} */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./src/**/*.{js,ts,jsx,tsx,mdx}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&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;h3&gt;
  
  
  Benefits:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;⚡ Faster build times&lt;/li&gt;
&lt;li&gt;🧹 Smaller final CSS bundle&lt;/li&gt;
&lt;li&gt;🎯 Only generates classes you actually use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Result&lt;/strong&gt;: Clean, efficient, production-ready CSS.&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 Running the Project
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm &lt;span class="nb"&gt;install&lt;/span&gt;     &lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
pnpm dev         &lt;span class="c"&gt;# Start development server&lt;/span&gt;
pnpm build       &lt;span class="c"&gt;# Create a production build&lt;/span&gt;
pnpm start       &lt;span class="c"&gt;# Launch production server&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 &lt;strong&gt;Pro Tip&lt;/strong&gt;: Production optimizations (like tree-shaking and minification) are only fully applied after &lt;code&gt;pnpm build&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  📈 Performance Comparison: Before vs After
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bundle Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Huge&lt;/td&gt;
&lt;td&gt;Reduced&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Initial Load Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Slower&lt;/td&gt;
&lt;td&gt;Faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Console Noise&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lots&lt;/td&gt;
&lt;td&gt;Clean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User Experience&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Choppy&lt;/td&gt;
&lt;td&gt;Smooth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Core Web Vitals&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🚫 Poor&lt;/td&gt;
&lt;td&gt;✅ Improved&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  📊 Core Web Vitals Improvement
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before:
&lt;/h3&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%2Fuploads%2Farticles%2Fz5a66bjanpeo1wmzvwa9.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%2Fuploads%2Farticles%2Fz5a66bjanpeo1wmzvwa9.png" alt="Before Optimization" width="774" height="726"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  After:
&lt;/h3&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%2Fuploads%2Farticles%2F44txaqjr103laz1vhhhw.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%2Fuploads%2Farticles%2F44txaqjr103laz1vhhhw.png" alt="After Optimization" width="739" height="718"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Noticeable improvement in LCP, FCP, CLS, and TTFB scores!&lt;/p&gt;

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

&lt;p&gt;By optimizing the Next.js config, introducing better loading strategies, dynamically importing components, and cleaning up the Tailwind setup, I transformed a good app into a &lt;strong&gt;great&lt;/strong&gt;, &lt;strong&gt;fast&lt;/strong&gt;, and &lt;strong&gt;scalable&lt;/strong&gt; one.&lt;/p&gt;

&lt;p&gt;These changes led to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚀 Faster load times&lt;/li&gt;
&lt;li&gt;📈 Better SEO and Web Vitals&lt;/li&gt;
&lt;li&gt;🧩 Easier long-term maintenance&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔗 Check the Full Source Code
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/ZinebEsso/refine-project-template" rel="noopener noreferrer"&gt;GitHub Repo (Link)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>refine</category>
      <category>antd</category>
      <category>b2b</category>
      <category>optimization</category>
    </item>
    <item>
      <title>🗓️ Building a Custom Timeline Calendar with Next.js</title>
      <dc:creator>Zineb Esso</dc:creator>
      <pubDate>Sat, 26 Apr 2025 17:25:23 +0000</pubDate>
      <link>https://forem.com/zinebesso/building-a-custom-timeline-calendar-with-nextjs-3ob6</link>
      <guid>https://forem.com/zinebesso/building-a-custom-timeline-calendar-with-nextjs-3ob6</guid>
      <description>&lt;p&gt;Managing tasks across a team can get messy—especially when you want to see what everyone is working on. That’s why I built &lt;strong&gt;Custom Timeline Calendar&lt;/strong&gt;: a responsive, timeline-style calendar that visually maps tasks across a 24-hour day, per user.&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%2Fuploads%2Farticles%2Fhhwu89pkqtw4m20760cq.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%2Fuploads%2Farticles%2Fhhwu89pkqtw4m20760cq.png" alt="Custom Timeline Calendar" width="750" height="416"&gt;&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%2Fuploads%2Farticles%2Fq5t0faoc6wp9edye63xx.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%2Fuploads%2Farticles%2Fq5t0faoc6wp9edye63xx.png" alt="Create a task" width="668" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ✨ Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;📅 Select a specific day to view&lt;/li&gt;
&lt;li&gt;👤 Each row represents a team member&lt;/li&gt;
&lt;li&gt;🕒 Tasks are laid out hour by hour&lt;/li&gt;
&lt;li&gt;📱 Fully responsive design&lt;/li&gt;
&lt;li&gt;🛠️ Easy to customize and extend&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧱 Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React / Next.js&lt;/strong&gt; — for a fast and modern web framework&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; — utility-first styling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ant Design&lt;/strong&gt; — clean and functional date picker component&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 Try It Out
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Clone the Repository
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ZinebEsso/Custom-Timeline-Calendar.git
&lt;span class="nb"&gt;cd &lt;/span&gt;custom-timeline-calendar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Install Dependencies
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Start the Dev Server
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open your browser at &lt;code&gt;http://localhost:3000&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  📂 Project Structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── components/
│   └── calendar_v1.tsx  // Main calendar UI
├── pages/
│   └── index.tsx         // Main entry page
├── screenshots/          // For README visuals
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🔄 Ongoing Development
&lt;/h3&gt;

&lt;p&gt;This is just version 1 of the Custom Timeline Calendar — and there's a lot more coming! I'm actively working on improvements like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Task modals with more detail&lt;/li&gt;
&lt;li&gt;Drag-and-drop task blocks&lt;/li&gt;
&lt;li&gt;Weekly and monthly views&lt;/li&gt;
&lt;li&gt;Integrations with tools like Google Calendar or Trello&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have ideas or want to contribute, feel free to open an &lt;a href="https://github.com/ZinebEsso/Custom-Timeline-Calendar/issues" rel="noopener noreferrer"&gt;issue&lt;/a&gt; or submit a PR on GitHub!&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 Check It Out
&lt;/h3&gt;

&lt;p&gt;👉 GitHub: &lt;a href="https://github.com/ZinebEsso/Custom-Timeline-Calendar" rel="noopener noreferrer"&gt;custom-timeline-calendar&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ☕ Support
&lt;/h3&gt;

&lt;p&gt;If you find this calendar helpful, feel free to &lt;a href="https://buymeacoffee.com/zinebessoussi" rel="noopener noreferrer"&gt;buy me a coffee&lt;/a&gt; 💛. It really helps keep side projects like this alive!&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>calendar</category>
      <category>frontend</category>
      <category>management</category>
    </item>
  </channel>
</rss>
