DEV Community: CodeBucksThe latest articles on DEV Community by CodeBucks (@codebucks).
https://dev.to/codebucks
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%2F520837%2F06d9d334-edd9-457e-9741-9b4e929bcff6.pngDEV Community: CodeBucks
https://dev.to/codebucks
enI built & launched AI headshot generator in 2 weeksCodeBucksWed, 11 Jun 2025 18:57:34 +0000
https://dev.to/codebucks/i-built-launched-ai-headshot-generator-in-2-weeks-ec2
https://dev.to/codebucks/i-built-launched-ai-headshot-generator-in-2-weeks-ec2<p>Hey everyone,</p>
<p>I'm a full-stack developer and have been fascinated by the progress in LLMs and image generation for the last year and a half. After seeing the AI headshot market explode, I noticed a common complaint: you'd pay for 100 images just to get a handful of good ones.</p>
<p>I knew I could do better by focusing on model quality and prompting. So, I challenged myself to build and launch a high-quality alternative from scratch in just two weeks.</p>
<p>Today, I’m excited to share that I launched <a href="proxy.php?url=https://www.smartheadshots.ai/" rel="noopener noreferrer">Smart Headshots AI</a>.</p>
<h3>
My 2-Week Sprint:
</h3>
<ul>
<li>Frontend: Next.js (love the performance)</li>
<li>Backend: Supabase for everything - auth, database, storage</li>
<li>UI: Kept it dead simple internally, went all-out on the landing page using shadcn UI + Tailwind CSS</li>
<li>Payments: Switched to Dodo Payments (MOR) after hearing too many Stripe horror stories</li>
<li>Architecture: Everything runs through webhooks - payment providers talk to AI APIs seamlessly, deployed on vercel.</li>
</ul>
<p>I use Cursor, so first I integrated supabase and dodo payments MCP servers, and created all required functions for the payments, auth and database. I spent more time on creating landing page since it's the first door that your customer will see. Analyzed few competitors and finalized one wireframe, provided it to claude sonnet 4.0 and voila! It generated very beautiful landing page, of course I spent few hours optimizing the landing page. Spent few more hours to make everything mobile responsive. I used Replicate for AI APIs.</p>
<h3>
What I Focused On:
</h3>
<ul>
<li>Quality over Quantity: My main focus was on fine-tuning the model and prompt engineering to ensure a very high hit rate of professional, usable headshots.</li>
<li>User Experience: I kept the internal dashboard dead simple. Upload photos, pick your styles, and that's it. All the complexity is hidden. I poured most of my design energy into the landing page to build trust and clearly explain the value.</li>
<li>Landing Page: First impressions matter - made it convert</li>
</ul>
<h3>
The Technical Stuff That Worked:
</h3>
<ul>
<li>Supabase is great for rapid development</li>
<li>Webhook architecture kept everything decoupled and scalable</li>
<li>shadcn components saved me probably 20+ hours of custom CSS</li>
<li>Dodo Payments integration was surprisingly smooth</li>
</ul>
<h3>
What I Learned:
</h3>
<ul>
<li>Ship fast, iterate faster</li>
<li>Don't over-engineer v1 (guilty as charged on previous projects)</li>
<li>Payment processor choice matters more than you think</li>
<li>Quality beats quantity every time</li>
</ul>
<p>For those who missed the link here it is: <a href="proxy.php?url=https://www.smartheadshots.ai/" rel="noopener noreferrer">https://www.smartheadshots.ai/</a></p>
<p>Thanks for reading this far! I'm happy to answer any technical questions about the build process. If anyone would like to try let me know I can share few discount codes😉</p>
saasainextjsdiscussWe have just released AIdea Central - Sign up and get 100 creditsCodeBucksWed, 28 May 2025 05:35:41 +0000
https://dev.to/codebucks/we-have-just-released-aidea-central-sign-up-and-get-100-credits-48ke
https://dev.to/codebucks/we-have-just-released-aidea-central-sign-up-and-get-100-credits-48ke<p>We have just released an AI app, which contains functional e-commerce tools to creative restyle FX, we simplify AI for everyone. No need to figure out prompts / settings / correct model - We do it all for you!</p>
<h2>
AIdea Central does ALL of this in one platform:
</h2>
<p>✅ Professional product visuals in clicks<br>
✅ Create video ads of your product in locations like Las vegas sphere, London streets n many more<br>
✅ Virtual fashion try-ons that look REAL<br>
✅ Create Infographics with just topic name <br>
✅ Create cool looking neon company cards<br>
✅ Turn yourself into a cartoon character<br>
✅ Fun video effects<br>
✅ Custom 3D avatars & toy packs of yourself<br>
✅ Background swaps like magic</p>
<p>No prompts. No coding. No subscriptions to manage.<br>
Plus we have simpler pricing structure!</p>
<p>🎁 Launch week: 100 free credits on signup + 25% off on first time deposit (code: AISIMPLIFIED)</p>
<p>Would love to get your feedback! <br>
Here is the Link: <a href="proxy.php?url=https://www.aideacentral.com" rel="noopener noreferrer">Aidea Central</a></p>
<p>My personal favourite tool is: Product ad video generator where you can show poster of your product on locations like las vegas sphere, london streets etc.</p>
saaswebdevainextjs10 Essential NPM Packages Every React.js Developer Should Master in 2025CodeBucksWed, 21 May 2025 18:39:19 +0000
https://dev.to/codebucks/10-essential-npm-packages-every-reactjs-developer-should-master-in-2025-800
https://dev.to/codebucks/10-essential-npm-packages-every-reactjs-developer-should-master-in-2025-800<p>Alright, let's be real. If you're deep in the React trenches like I am, you know the usual suspects: React Router, Redux, maybe Axios for your data fetching. And yeah, they're great, staples even. But in 2025, just knowing the 'big three' (or four, or five...) isn't quite enough to <em>really</em> feel like you're flying, you know? My productivity, and honestly, my sanity, often comes down to those lesser-known, sometimes <em>seriously</em> underrated, npm packages. The ones that make you go, "Where have you been all my life?!"</p>
<p>So, I've been wanting to share a list of tools that have genuinely made a difference in my projects. We're not just talking about the obvious headliners here. We're diving into some hidden gems that React developers should know – the kind that can truly <strong>supercharge React apps</strong> and streamline your React workflow. Think React performance boosts that actually work, <strong>UI/UX gems</strong> that make users smile, <strong>React state management</strong> that doesn't make you want to pull your hair out, and <strong>React testing</strong> utilities that, dare I say, make testing <em>less</em> of a chore.</p>
<p>Each one I'm about to show you is a quick look: what it's for, why I think it's a game-changer, and a little snippet or tip to get you started.</p>
<h2>
1. Motion (Framer Motion) – React Animations Made Fun (and Easy!)
</h2>
<p>First up, let's talk about making things <em>move</em>. If you've ever wrestled with CSS transitions for anything more than a simple hover effect, you'll appreciate <strong>Motion (you might know it as Framer Motion)</strong>. Their tagline is something like <strong>simple to start, fun to master</strong>, and honestly, they nailed it. I used to dread complex animations, but Motion genuinely makes adding fluid, professional-looking React animations to components... well, <em>fun</em>.</p>
<p>It's not just smoke and mirrors; it cleverly uses hardware-accelerated browser animations but gives you full JavaScript control. For me, this means I can achieve sophisticated motion design way more easily than trying to orchestrate a symphony of CSS keyframes. Want a quick fade-in? Check this out:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">motion</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">framer-motion</span><span class="dl">'</span><span class="p">;</span>
<span class="o"><</span><span class="nx">motion</span><span class="p">.</span><span class="nx">div</span> <span class="nx">initial</span><span class="o">=</span><span class="p">{{</span> <span class="na">opacity</span><span class="p">:</span> <span class="mi">0</span> <span class="p">}}</span> <span class="nx">animate</span><span class="o">=</span><span class="p">{{</span> <span class="na">opacity</span><span class="p">:</span> <span class="mi">1</span> <span class="p">}}</span> <span class="sr">/></span><span class="err">;
</span></code></pre>
</div>
<p>And just like that – a smooth fade-in when your component mounts. No messy CSS. But it's not just fades; we're talking drag gestures, slick layout animations (my personal favorite for dynamic lists), SVG morphing etc. Let's face it, in 2025, users expect a certain level of polish, and animations are a huge part of that. Motion has become my go-to for delivering that 'wow' factor in React apps. It can seriously elevate the UX of your project with just a few intuitive props.</p>
<blockquote>
<p><strong>My Hot Tip:</strong> Don't be intimidated! Just start by wrapping your elements in <code><motion.div></code>. Or, if you're feeling a bit more adventurous, dive into hooks like <code>useAnimation</code>. The defaults are surprisingly good, but the <code>transition</code> prop is where the real magic and deep customization lie. Trust me on this one.</p>
</blockquote>
<p>Plus, the developer experience is top-notch. Great TypeScript support and those Framer playgrounds for tinkering?😽. If you're aiming for those silky-smooth UI/UX enhancements, Framer Motion for React is pretty much the MVP of React animation libraries. Definitely one of those React developer tools to have in your belt.</p>
<h2>
2. TanStack Query (React Query) – Your New Best Friend for Smart Data Fetching & Caching
</h2>
<p>Okay, next up: data fetching. Oh, the joys of <code>useEffect</code> and <code>useState</code> for every single API call, right? If you're nodding along, you need to meet <strong>TanStack Query (you probably knew it as React Query)</strong>. I've heard it called the missing data-fetching library for web applications, and I'm not gonna lie, that's pretty accurate in my book for <strong>efficient data fetching in React</strong>.</p>
<p>What does it actually do? Simply put, it takes the headache out of fetching, caching, synchronizing, and updating server state. It magically (okay, not <em>actually</em> magic, but it feels like it sometimes) turns your async data into predictable, cached state with so little boilerplate, it's almost criminal. I remember the days of manually managing loading states, error states, refetching logic...😰.</p>
<p>Let me show you how clean it can be, A simple example:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">useQuery</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@tanstack/react-query</span><span class="dl">'</span><span class="p">;</span>
<span class="kd">function</span> <span class="nf">Posts</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">{</span> <span class="nx">data</span><span class="p">,</span> <span class="nx">isLoading</span> <span class="p">}</span> <span class="o">=</span> <span class="nf">useQuery</span><span class="p">([</span><span class="dl">'</span><span class="s1">posts</span><span class="dl">'</span><span class="p">],</span> <span class="p">()</span> <span class="o">=></span>
<span class="nf">fetch</span><span class="p">(</span><span class="dl">'</span><span class="s1">/api/posts</span><span class="dl">'</span><span class="p">).</span><span class="nf">then</span><span class="p">(</span><span class="nx">res</span> <span class="o">=></span> <span class="nx">res</span><span class="p">.</span><span class="nf">json</span><span class="p">())</span>
<span class="p">);</span>
<span class="k">if </span><span class="p">(</span><span class="nx">isLoading</span><span class="p">)</span> <span class="k">return</span> <span class="dl">'</span><span class="s1">Loading...</span><span class="dl">'</span><span class="p">;</span>
<span class="k">return</span> <span class="o"><</span><span class="nx">ul</span><span class="o">></span><span class="p">{</span><span class="nx">data</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="nx">post</span> <span class="o">=></span> <span class="o"><</span><span class="nx">li</span> <span class="nx">key</span><span class="o">=</span><span class="p">{</span><span class="nx">post</span><span class="p">.</span><span class="nx">id</span><span class="p">}</span><span class="o">></span><span class="p">{</span><span class="nx">post</span><span class="p">.</span><span class="nx">title</span><span class="p">}</span><span class="o"><</span><span class="sr">/li></span><span class="se">)</span><span class="sr">}</u</span><span class="nx">l</span><span class="o">></span><span class="p">;</span>
<span class="p">}</span>
</code></pre>
</div>
<p>Seriously, that's the core of it. <strong>TanStack Query</strong> handles fetching when the component mounts, smartly caches the results, does background refetching to keep things fresh, and can even help with updating stale data. And the best part? You get awesome stuff like pagination support, optimistic updates (making your UI feel super responsive), and request retries practically for free.</p>
<p>For me, this library is a massive productivity booster. All that boilerplate <code>useEffect</code> and <code>useState</code> mess for async operations? Gone. Instead, you get powerful, built-in features. It plays beautifully with React hooks, and if your modern React app talks to any kind of server or API (and whose doesn't?), this is an absolute game-changer. It's one of those underrated React developer tools I can't imagine working without anymore.</p>
<h2>
3. Zustand – Bear Necessities State Management
</h2>
<p>Now let's talk <strong>React state management</strong>. The mere mention of it can sometimes make React devs break out in a cold sweat, especially if you've battled the complexities of Redux. But what if I told you there's a way to get global state that's... <em>bearably</em> simple? (Sorry, couldn't resist the pun, they started it! 🐻)</p>
<p>Enter <strong>Zustand</strong>. Their own description calls it a "small, fast and scalable bearbones state-management solution," and honestly, it's spot on. If you're looking for React state management without Redux's infamous ceremony – no providers wrapping your app, no actions, no types (unless you want them, it plays nice with TypeScript!), no reducers in the traditional sense – then <strong>Zustand</strong> might just be your new best friend. You basically create a store using a simple hook API. That's it.</p>
<p>I was skeptical at first, thinking "it can't be <em>that</em> easy," but check this out for a simple counter:</p>
<p>For example:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">import</span> <span class="nx">create</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">zustand</span><span class="dl">'</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">useStore</span> <span class="o">=</span> <span class="nf">create</span><span class="p">(</span><span class="kd">set</span> <span class="o">=></span> <span class="p">({</span>
<span class="na">count</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="na">inc</span><span class="p">:</span> <span class="p">()</span> <span class="o">=></span> <span class="nf">set</span><span class="p">(</span><span class="nx">state</span> <span class="o">=></span> <span class="p">({</span> <span class="na">count</span><span class="p">:</span> <span class="nx">state</span><span class="p">.</span><span class="nx">count</span> <span class="o">+</span> <span class="mi">1</span> <span class="p">}))</span>
<span class="p">}));</span>
<span class="kd">function</span> <span class="nf">Counter</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">count</span> <span class="o">=</span> <span class="nf">useStore</span><span class="p">(</span><span class="nx">state</span> <span class="o">=></span> <span class="nx">state</span><span class="p">.</span><span class="nx">count</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">inc</span> <span class="o">=</span> <span class="nf">useStore</span><span class="p">(</span><span class="nx">state</span> <span class="o">=></span> <span class="nx">state</span><span class="p">.</span><span class="nx">inc</span><span class="p">);</span>
<span class="k">return</span> <span class="o"><</span><span class="nx">button</span> <span class="nx">onClick</span><span class="o">=</span><span class="p">{</span><span class="nx">inc</span><span class="p">}</span><span class="o">></span><span class="nx">Count</span><span class="p">:</span> <span class="p">{</span><span class="nx">count</span><span class="p">}</span><span class="o"><</span><span class="sr">/button></span><span class="err">;
</span><span class="p">}</span>
</code></pre>
</div>
<p>And boom! A working counter with global state. No <code>dispatch</code>, no <code>connect</code> HOCs, minimal boilerplate. I've found Zustand absolutely shines when I need some shared state – think theme toggles, user authentication status, maybe a shopping cart – without wanting to pull in the entire Redux ecosystem. It's particularly loved for its simplicity and performance (it's smart about re-renders, avoiding those heavy context pitfalls).</p>
<p>The creator calls it the "bare bones" state manager, and it truly lives up to that. If you're a React dev yearning for an easy, type-safe (if you choose) global state solution, getting comfortable with Zustand is, in my opinion, a fantastic move for 2025. It's a genuinely <strong>underrated React developer tool</strong> that can seriously boost your productivity by keeping your state logic lean and mean. Plus, who doesn't love a good bear pun?</p>
<h2>
4. MSW (Mock Service Worker) – API Mocking for Dev & Tests
</h2>
<p>Ah, the classic developer dilemma: you're ready to build that awesome new UI feature, but the backend API isn't quite ready. Or maybe it is ready, but it's flaky, or you need to test a bunch of weird edge cases that are a pain to set up for real. We've all been there, right? This is where <strong>Mock Service Worker (MSW)</strong> swoops in like a superhero for API mocking for React development.</p>
<p>MSW is pretty clever. It uses service workers (don't worry if that sounds scary, <strong>MSW React</strong> makes it easy) to intercept actual network requests right in the browser (or Node for testing!). This means you can define mock responses for your API endpoints, and your app behaves as if it's talking to the real thing. It's been a total game-changer for my workflow.</p>
<p>Imagine you're building a user profile page. You can set up MSW like this:</p>
<ul>
<li>First Create Request Handlers:
</li>
</ul>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="c1">// src/mocks/handlers.js</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">rest</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">msw</span><span class="dl">'</span><span class="p">;</span>
<span class="k">export</span> <span class="kd">const</span> <span class="nx">handlers</span> <span class="o">=</span> <span class="p">[</span>
<span class="nx">rest</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="dl">'</span><span class="s1">/api/user</span><span class="dl">'</span><span class="p">,</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">ctx</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
<span class="k">return</span> <span class="nf">res</span><span class="p">(</span>
<span class="nx">ctx</span><span class="p">.</span><span class="nf">status</span><span class="p">(</span><span class="mi">200</span><span class="p">),</span>
<span class="nx">ctx</span><span class="p">.</span><span class="nf">json</span><span class="p">({</span>
<span class="na">username</span><span class="p">:</span> <span class="dl">'</span><span class="s1">john_doe</span><span class="dl">'</span><span class="p">,</span>
<span class="na">email</span><span class="p">:</span> <span class="dl">'</span><span class="s1">[email protected]</span><span class="dl">'</span><span class="p">,</span>
<span class="p">})</span>
<span class="p">);</span>
<span class="p">}),</span>
<span class="p">];</span>
</code></pre>
</div>
<ul>
<li>Set Up the Service Worker
</li>
</ul>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="c1">// src/mocks/browser.js</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">setupWorker</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">msw/browser</span><span class="dl">'</span><span class="p">;</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">handlers</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">./handlers</span><span class="dl">'</span><span class="p">;</span>
<span class="k">export</span> <span class="kd">const</span> <span class="nx">worker</span> <span class="o">=</span> <span class="nf">setupWorker</span><span class="p">(...</span><span class="nx">handlers</span><span class="p">);</span>
</code></pre>
</div>
<ul>
<li>Start the Worker in Your App
</li>
</ul>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">worker</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">./mocks/browser</span><span class="dl">'</span><span class="p">;</span>
<span class="nx">worker</span><span class="p">.</span><span class="nf">start</span><span class="p">();</span>
</code></pre>
</div>
<p>Now any fetch('/api/user') returns the mock data. You can run MSW alongside Storybook so your components load fake data, or use it in your tests (there’s a Jest integration). You can iterate UIs without a backend or test edge cases deterministically. Its impact on developer experience is huge, it makes frontend development independent from unreliable backends and makes tests more realistic without flakiness. If you care about smooth local development and confident testing, MSW is a non-negotiable skill.</p>
<h2>
5. Vite – Lightning-Fast Bundler & Dev Server
</h2>
<p>Okay, this next one isn't a React component library, but trust me, it's a massive part of my modern React development workflow these days: <strong>Vite</strong> (pronounced 'veet'!). If you've ever found yourself staring at a webpack build spinner, slowly losing your will to live, Vite is the breath of fresh air you've been waiting for. It's arguably the <strong>fastest React build tool</strong> out there.</p>
<p>Vite is a build tool and dev server that's all about speed. How? It cleverly uses native ES modules during development. What that means for you is that your dev server starts up almost instantly – I'm talking seconds, not minutes. And Hot Module Replacement (HMR)? It's so fast, sometimes I blink and miss it. It's genuinely changed how I feel about starting new projects or just tinkering.</p>
<p>Getting a new <strong>Vite React</strong> project off the ground is a piece of cake:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight shell"><code><span class="c"># Using npm</span>
npm create vite@latest my-awesome-vite-app <span class="nt">--</span> <span class="nt">--template</span> react-ts
<span class="c"># (I usually go with TypeScript, but react is an option too!)</span>
<span class="nb">cd </span>my-awesome-vite-app
npm <span class="nb">install
</span>npm run dev
</code></pre>
</div>
<p>And <em>bam!</em> Your dev server is up and running. The first time I saw it, I was genuinely shocked. No more lengthy bundling phase just to see your first 'Hello World'. And when it comes to production builds, it uses Rollup under the hood, so you still get highly optimized bundles.</p>
<p>For me, the improvement in developer experience is huge. Those minutes spent waiting for webpack to catch up? They add up, man! Vite pretty much eliminates that productivity drain. It's no wonder so many new React projects, and even frameworks like Remix, are built on or integrate with Vite. People call it "the new Create React App", and while that might be a bit cliché by now, it's totally earned. It really does feel like CRA 2.0, but with next-generation speed.</p>
<p>Learning Vite, and maybe poking around its plugin ecosystem, is something I'd strongly recommend for staying efficient in 2025. Whether you're using it directly or it's powering a framework you love, understanding how this tool works will keep your projects zippy and your development feedback loop incredibly tight.</p>
<h2>
6. react-window – Virtualize Long Lists for Performance
</h2>
<p>Ever tried to render a list with, like, a <em>thousand</em> items in React? Or ten thousand? Yeah, your browser probably wasn't too happy about that. The app grinds to a halt, scrolling becomes a slideshow – it's a classic React performance headache. This is where a nifty technique called 'virtualization' comes in, and <strong>react-window</strong> is a fantastic little library that makes virtualizing long lists in React surprisingly easy.</p>
<p>The core idea is simple but powerful: instead of rendering every single item in your massive list, <strong>react-window</strong> only renders the items that are currently visible in the viewport (plus a few extra as a buffer). This drastically cuts down on the number of DOM nodes, and suddenly, your super long lists scroll like butter. I like to think of it as a performance optimization ninja for your UIs.</p>
<p>Imagine you've got that dreaded 10,000-item list. Normally, that's a recipe for disaster. But with react-window, it's manageable:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">FixedSizeList</span> <span class="k">as</span> <span class="nx">List</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">react-window</span><span class="dl">"</span><span class="p">;</span>
<span class="c1">// Let's imagine a huge dataset</span>
<span class="kd">const</span> <span class="nx">bigData</span> <span class="o">=</span> <span class="nb">Array</span><span class="p">.</span><span class="k">from</span><span class="p">({</span> <span class="na">length</span><span class="p">:</span> <span class="mi">10000</span> <span class="p">},</span> <span class="p">(</span><span class="nx">_</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="o">=></span> <span class="p">({</span>
<span class="na">id</span><span class="p">:</span> <span class="s2">`item-</span><span class="p">${</span><span class="nx">i</span><span class="p">}</span><span class="s2">`</span><span class="p">,</span>
<span class="na">text</span><span class="p">:</span> <span class="s2">`Item </span><span class="p">${</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">}</span><span class="s2"> reporting for duty!`</span><span class="p">,</span>
<span class="p">}));</span>
<span class="c1">// Your component to render each row - keep it lean!</span>
<span class="kd">const</span> <span class="nx">Row</span> <span class="o">=</span> <span class="p">({</span> <span class="nx">index</span><span class="p">,</span> <span class="nx">style</span> <span class="p">})</span> <span class="o">=></span> <span class="p">(</span>
<span class="o"><</span><span class="nx">div</span> <span class="nx">style</span><span class="o">=</span><span class="p">{</span><span class="nx">style</span><span class="p">}</span> <span class="nx">className</span><span class="o">=</span><span class="dl">"</span><span class="s2">list-item</span><span class="dl">"</span><span class="o">></span>
<span class="p">{</span><span class="dl">"</span><span class="s2"> </span><span class="dl">"</span><span class="p">}</span>
<span class="p">{</span><span class="cm">/* Apply your item styles here */</span><span class="p">}</span>
<span class="p">{</span><span class="nx">bigData</span><span class="p">[</span><span class="nx">index</span><span class="p">].</span><span class="nx">text</span><span class="p">}</span>
<span class="o"><</span><span class="sr">/div</span><span class="err">>
</span><span class="p">);</span>
<span class="c1">// And here's the virtualized list</span>
<span class="o"><</span><span class="nx">List</span>
<span class="nx">height</span><span class="o">=</span><span class="p">{</span><span class="mi">400</span><span class="p">}</span> <span class="c1">// The height of the scrollable area</span>
<span class="nx">itemCount</span><span class="o">=</span><span class="p">{</span><span class="nx">bigData</span><span class="p">.</span><span class="nx">length</span><span class="p">}</span>
<span class="nx">itemSize</span><span class="o">=</span><span class="p">{</span><span class="mi">50</span><span class="p">}</span> <span class="c1">// The height of each individual item</span>
<span class="nx">width</span><span class="o">=</span><span class="dl">"</span><span class="s2">100%</span><span class="dl">"</span> <span class="c1">// Or a fixed width</span>
<span class="o">></span>
<span class="p">{</span><span class="nx">Row</span><span class="p">}</span>
<span class="o"><</span><span class="sr">/List></span><span class="err">;
</span></code></pre>
</div>
<p>What's happening here? Only the handful of rows that fit within that <code>400px</code> height are actually in the DOM. The rest are just virtual. As you scroll, <code>react-window</code> cleverly swaps items in and out. The result? Your app stays snappy and responsive, even with enormous datasets. It's a lifesaver.</p>
<p>Honestly, knowing how to improve React app performance with large datasets is a crucial skill. Libraries like <code>react-window</code> (and its older, more feature-rich cousin, react-virtualized, though I often prefer react-window for its leanness) give you that power. It's definitely one of those npm packages that improve React performance significantly. If you're building anything with long lists – chat applications, data tables, infinite scrollers give <code>react-window</code> a try, it can be a genuine game-changer.</p>
<h2>
7. React Hook Form – Performant React Form Library
</h2>
<p>Forms, the bread and butter of so many web apps, and yet, sometimes a real pain to build in React, right? All those controlled components, the state management for every field, the re-renders every time someone types a character, it can get messy and slow things down. If this sounds familiar, let me introduce you to <strong>React Hook Form</strong>, my go-to React form library.</p>
<p>This library has been a revelation for me when it comes to building performant React forms. Its secret sauce? It cleverly uses uncontrolled inputs and refs under the hood. This means fewer re-renders (often, only the input that changes re-renders, not the whole form!) and a much smaller bundle size. Plus, it's all built around a hook, <code>useForm()</code>, so the API feels very 'React-y' and intuitive. No extra <code><Form></code> wrapper components needed – just call the hook and you're good to go.</p>
<p>Here's a taste of how clean it can be for a simple signup form:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">import</span> <span class="nx">React</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">react</span><span class="dl">"</span><span class="p">;</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">useForm</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">react-hook-form</span><span class="dl">"</span><span class="p">;</span>
<span class="kd">function</span> <span class="nf">SignupForm</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">{</span>
<span class="nx">register</span><span class="p">,</span>
<span class="nx">handleSubmit</span><span class="p">,</span>
<span class="na">formState</span><span class="p">:</span> <span class="p">{</span> <span class="nx">errors</span> <span class="p">}</span>
<span class="p">}</span> <span class="o">=</span> <span class="nf">useForm</span><span class="p">();</span>
<span class="kd">const</span> <span class="nx">onSubmit</span> <span class="o">=</span> <span class="nx">data</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">data</span><span class="p">);</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">form</span> <span class="nx">onSubmit</span><span class="o">=</span><span class="p">{</span><span class="nf">handleSubmit</span><span class="p">(</span><span class="nx">onSubmit</span><span class="p">)}</span><span class="o">></span>
<span class="o"><</span><span class="nx">input</span>
<span class="p">{...</span><span class="nf">register</span><span class="p">(</span><span class="dl">"</span><span class="s2">email</span><span class="dl">"</span><span class="p">,</span> <span class="p">{</span> <span class="na">required</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Email is required</span><span class="dl">"</span> <span class="p">})}</span>
<span class="nx">placeholder</span><span class="o">=</span><span class="dl">"</span><span class="s2">Email</span><span class="dl">"</span>
<span class="nx">type</span><span class="o">=</span><span class="dl">"</span><span class="s2">email</span><span class="dl">"</span>
<span class="o">/></span>
<span class="p">{</span><span class="nx">errors</span><span class="p">.</span><span class="nx">email</span> <span class="o">&&</span> <span class="o"><</span><span class="nx">p</span><span class="o">></span><span class="p">{</span><span class="nx">errors</span><span class="p">.</span><span class="nx">email</span><span class="p">.</span><span class="nx">message</span><span class="p">}</span><span class="o"><</span><span class="sr">/p></span><span class="err">}
</span>
<span class="o"><</span><span class="nx">input</span>
<span class="p">{...</span><span class="nf">register</span><span class="p">(</span><span class="dl">"</span><span class="s2">password</span><span class="dl">"</span><span class="p">,</span> <span class="p">{</span> <span class="na">minLength</span><span class="p">:</span> <span class="mi">8</span> <span class="p">})}</span>
<span class="nx">placeholder</span><span class="o">=</span><span class="dl">"</span><span class="s2">Password</span><span class="dl">"</span>
<span class="nx">type</span><span class="o">=</span><span class="dl">"</span><span class="s2">password</span><span class="dl">"</span>
<span class="o">/></span>
<span class="p">{</span><span class="nx">errors</span><span class="p">.</span><span class="nx">password</span> <span class="o">&&</span> <span class="o"><</span><span class="nx">p</span><span class="o">></span><span class="nx">Password</span> <span class="nx">must</span> <span class="nx">be</span> <span class="nx">at</span> <span class="nx">least</span> <span class="mi">8</span> <span class="nx">characters</span><span class="o"><</span><span class="sr">/p></span><span class="err">}
</span>
<span class="o"><</span><span class="nx">button</span> <span class="nx">type</span><span class="o">=</span><span class="dl">"</span><span class="s2">submit</span><span class="dl">"</span><span class="o">></span><span class="nx">Sign</span> <span class="nx">Up</span><span class="o"><</span><span class="sr">/button</span><span class="err">>
</span> <span class="o"><</span><span class="sr">/form</span><span class="err">>
</span> <span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
<p>The magic here is that <code>register</code> function. It handles a lot of the boilerplate for you. And because it leans on uncontrolled inputs, your form stays snappy, even if it's a big one. I've found this makes a noticeable difference in UX. If you're a React dev looking for that sweet spot between simplicity, top-notch performance, and a tiny bundle footprint for your forms, I can't recommend <strong>React Hook Form</strong> enough.</p>
<h2>
8. Zod – Type-Safe Schema Validation in React
</h2>
<p>Okay, so we just talked about React Hook Form. Now, what about validating that form data? Or any data, really, the API responses, environment variables, you name it. If you're using TypeScript (and in 2025, many of us are, right?), you've probably felt the pain of defining your types and then... writing separate runtime validation logic that hopefully matches those types. It's a recipe for drift and bugs. This is where <strong>Zod</strong> comes in and, frankly, feels a bit like magic for type-safe validation in React.</p>
<p>Zod is all about Zod-React integration and beyond! The genius of it is that you declare your data schema <em>once</em>, and Zod infers both the runtime validator and the static TypeScript type from that single definition. No more duplication! I was blown away when I first saw this. You can build up complex schemas, add custom logic with <code>.refine()</code>, and it integrates beautifully with tools like React Hook Form (they have official resolvers!).</p>
<p>Let's say you're defining a user schema:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">z</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">zod</span><span class="dl">"</span><span class="p">;</span>
<span class="c1">// Define a schema for user input</span>
<span class="kd">const</span> <span class="nx">userSchema</span> <span class="o">=</span> <span class="nx">z</span><span class="p">.</span><span class="nf">object</span><span class="p">({</span>
<span class="na">username</span><span class="p">:</span> <span class="nx">z</span><span class="p">.</span><span class="nf">string</span><span class="p">().</span><span class="nf">min</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="dl">"</span><span class="s2">Username too short</span><span class="dl">"</span><span class="p">),</span>
<span class="na">age</span><span class="p">:</span> <span class="nx">z</span><span class="p">.</span><span class="nf">number</span><span class="p">().</span><span class="nf">int</span><span class="p">().</span><span class="nf">positive</span><span class="p">(</span><span class="dl">"</span><span class="s2">Age must be positive</span><span class="dl">"</span><span class="p">),</span>
<span class="na">email</span><span class="p">:</span> <span class="nx">z</span><span class="p">.</span><span class="nf">string</span><span class="p">().</span><span class="nf">email</span><span class="p">(</span><span class="dl">"</span><span class="s2">Invalid email address</span><span class="dl">"</span><span class="p">),</span>
<span class="p">});</span>
<span class="c1">// Infer TypeScript type</span>
<span class="nx">type</span> <span class="nx">User</span> <span class="o">=</span> <span class="nx">z</span><span class="p">.</span><span class="nx">infer</span><span class="o"><</span><span class="k">typeof</span> <span class="nx">userSchema</span><span class="o">></span><span class="p">;</span>
<span class="kd">function</span> <span class="nf">handleRegistration</span><span class="p">(</span><span class="nx">data</span><span class="p">:</span> <span class="nx">unknown</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// Throws if data doesn’t match schema</span>
<span class="kd">const</span> <span class="nx">validUser</span><span class="p">:</span> <span class="nx">User</span> <span class="o">=</span> <span class="nx">userSchema</span><span class="p">.</span><span class="nf">parse</span><span class="p">(</span><span class="nx">data</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Validated user:</span><span class="dl">"</span><span class="p">,</span> <span class="nx">validUser</span><span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
<p>By making Zod schemas the single source of truth, you drastically reduce the chances of your types and runtime checks getting out of sync. I've found this makes my code so much safer and easier to maintain. It's a fantastic tool for any developer who values robustness.</p>
<h2>
9. React-Use – Massive Collection of React Hooks
</h2>
<p>How many times have you found yourself writing the same custom hook for, say, debouncing an input, tracking window size, or interacting with local storage? I know I've done it more times than I can count before I discovered <strong>react-use</strong>. This library is an absolute goldmine – a massive useful React hooks collection.</p>
<p>Think about it: common UI patterns and browser API interactions that you'd normally have to roll yourself. Hooks for animation frames (<code>useRaf</code>), intervals (<code>useInterval</code>), super easy local storage syncing (<code>useLocalStorage</code> – a personal favorite!), getting geolocation data (<code>useGeolocation</code>), listening to media queries (<code>useMedia</code>)... the list just goes on and on. It's like a Swiss Army knife for React developers.</p>
<p>Installation is just your standard <code>npm install react-use</code>, and you can cherry-pick only the specific hooks you need, so it won't bloat your bundle.</p>
<p>Here's a quick peek at <code>useLocalStorage</code>:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">import</span> <span class="nx">React</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">react</span><span class="dl">"</span><span class="p">;</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">useLocalStorage</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">react-use</span><span class="dl">"</span><span class="p">;</span>
<span class="kd">function</span> <span class="nf">Counter</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">count</span><span class="p">,</span> <span class="nx">setCount</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useLocalStorage</span><span class="p">(</span><span class="dl">"</span><span class="s2">counter</span><span class="dl">"</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">div</span><span class="o">></span>
<span class="o"><</span><span class="nx">p</span><span class="o">></span><span class="nc">Count </span><span class="p">(</span><span class="nx">persisted</span><span class="p">):</span> <span class="p">{</span><span class="nx">count</span><span class="p">}</span><span class="o"><</span><span class="sr">/p</span><span class="err">>
</span> <span class="o"><</span><span class="nx">button</span> <span class="nx">onClick</span><span class="o">=</span><span class="p">{()</span> <span class="o">=></span> <span class="nf">setCount</span><span class="p">(</span><span class="nx">count</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)}</span><span class="o">></span><span class="nx">Increment</span><span class="o"><</span><span class="sr">/button</span><span class="err">>
</span> <span class="o"><</span><span class="sr">/div</span><span class="err">>
</span> <span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
<p>Seriously, why reinvent the wheel? Whether you need a debouncing hook, a media-query listener, or an idle-timer, chances are <strong>react-use</strong> has got you covered. It's become one of my first installs in many projects.</p>
<h2>
10. SWR – Another Powerhouse for React Data Fetching
</h2>
<p>So, we talked about TanStack Query earlier for data fetching, and it's fantastic. But it's always good to know the landscape, right? Another incredibly popular and powerful option in the React data fetching world is <strong>SWR</strong>, from the folks at Vercel. If you've ever found yourself manually implementing caching or revalidation, <strong>SWR</strong> for React is here to make your life a lot easier.</p>
<p>The name SWR stands for "stale-while-revalidate." It first tries to serve data from cache (stale), making your UI feel fast, then re-fetches in the background (revalidate). It's a brilliant approach.</p>
<p>The API is beautifully simple: </p>
<p><code>const { data, error, isLoading, mutate } = useSWR(key, fetcherFunction);</code></p>
<p>Here's a quick look:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">import</span> <span class="nx">useSWR</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">swr</span><span class="dl">"</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">fetcher</span> <span class="o">=</span> <span class="nx">url</span> <span class="o">=></span> <span class="nf">fetch</span><span class="p">(</span><span class="nx">url</span><span class="p">).</span><span class="nf">then</span><span class="p">(</span><span class="nx">res</span> <span class="o">=></span> <span class="nx">res</span><span class="p">.</span><span class="nf">json</span><span class="p">());</span>
<span class="kd">function</span> <span class="nf">UserProfile</span><span class="p">({</span> <span class="nx">userId</span> <span class="p">})</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">{</span> <span class="nx">data</span><span class="p">,</span> <span class="nx">error</span><span class="p">,</span> <span class="nx">isLoading</span> <span class="p">}</span> <span class="o">=</span> <span class="nf">useSWR</span><span class="p">(</span>
<span class="s2">`/api/users/</span><span class="p">${</span><span class="nx">userId</span><span class="p">}</span><span class="s2">`</span><span class="p">,</span>
<span class="nx">fetcher</span>
<span class="p">);</span>
<span class="k">if </span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="k">return</span> <span class="o"><</span><span class="nx">p</span><span class="o">></span><span class="nb">Error</span> <span class="nx">loading</span> <span class="nx">profile</span><span class="p">.</span><span class="o"><</span><span class="sr">/p></span><span class="err">;
</span> <span class="k">if </span><span class="p">(</span><span class="nx">isLoading</span><span class="p">)</span> <span class="k">return</span> <span class="o"><</span><span class="nx">p</span><span class="o">></span><span class="nx">Loading</span><span class="p">...</span><span class="o"><</span><span class="sr">/p></span><span class="err">;
</span>
<span class="k">return</span> <span class="o"><</span><span class="nx">p</span><span class="o">></span><span class="nx">Welcome</span> <span class="nx">back</span><span class="p">,</span> <span class="p">{</span><span class="nx">data</span><span class="p">.</span><span class="nx">name</span><span class="p">}</span><span class="o">!<</span><span class="sr">/p></span><span class="err">;
</span><span class="p">}</span>
</code></pre>
</div>
<p>What I particularly love about SWR are features like auto-revalidation on focus/network recovery – it just <em>works</em>. It also handles request deduplication and has excellent TypeScript support. For many projects, SWR is a strong contender for React hooks for remote data fetching.</p>
<h2>
Conclusion
</h2>
<p>And there you have it – my personal rundown of 10 <strong>npm packages</strong> that I genuinely believe can make a real difference for React.js developers in 2025. These might not always be the first ones that jump to mind like Router or Redux, but they're the kind of React developer tools that, once you discover them, can seriously level up your game and supercharge your React apps.</p>
<p>Now, let me be clear: I'm not saying you need to cram <em>all</em> of these into every single project. That would be overkill, right? Different projects have different needs. But just <em>knowing</em> these tools exist, understanding what problems they solve, and having them in your back pocket when the right situation arises? That, in my experience, is what separates a good React developer from a great one. It's about having the right tool for the job.</p>
<p>So, I really encourage you: pick one or two that piqued your interest and give them a spin in your next side project, or even a small feature at work. You might just be surprised at how much smoother your React workflow becomes. I know I was!</p>
<p>Got any other underrated React developer tools you like? I'd love to hear about them! Drop a comment below – I'm always on the lookout for new ways to make <strong>React development</strong> even better. Until then, happy coding!</p>
webdevreactproductivitybeginnersCrafting URLs That Search Engines (And Humans) Love: A Developer's 2025 PlaybookCodeBucksTue, 22 Apr 2025 18:58:07 +0000
https://dev.to/codebucks/crafting-urls-that-search-engines-and-humans-love-a-developers-2025-playbook-3820
https://dev.to/codebucks/crafting-urls-that-search-engines-and-humans-love-a-developers-2025-playbook-3820<p>As developers, we often focus on the elegant code behind the scenes, the slick user interfaces, and the robust back-end systems. But there's a humble, yet critical, component of every website and application that acts as the first point of contact for both users and search engines: the URL.</p>
<p>Far more than just a web address, a well-crafted URL is a signpost, a descriptor, and a trust signal. In the ever-evolving landscape of search engine optimization (SEO), where algorithms become more sophisticated and user experience takes center stage, the structure and content of your URLs remain fundamentally important. Ignoring them in 2025 is like building a beautiful house without a clear street address – people (and bots) will struggle to find it.</p>
<p>This article isn't just another <strong>SEO basics</strong> rundown. It's a developer's guide to understanding why URL structure matters for SEO today and how to implement best practices effectively in your projects, looking ahead to 2025. We'll dive into the technical considerations, the user experience implications, and how to make sure your URLs are working for you, not against you.</p>
<h2>
Why URLs Are More Than Just Addresses
</h2>
<p>Think about the last time you clicked a link in a search result. What did you notice about the URL? If it was short, descriptive, and made sense, you probably felt more confident clicking it. If it was a long string of random characters and numbers, you might have hesitated. That's the user experience side of the URL's power.</p>
<p>From an SEO perspective, URLs provide crucial context to search engines. While Google and other search engines have become incredibly adept at understanding content regardless of URL structure, a clear, descriptive URL still offers valuable signals:</p>
<ul>
<li>
<strong>Relevance</strong>: Keywords in the URL can help confirm the page's topic.</li>
<li>
<strong>Site Structure</strong>: A logical URL hierarchy helps search engines understand how your content is organized.</li>
<li>
<strong>Crawlability</strong>: Clean, static-looking URLs are generally easier for search engine bots to crawl and index efficiently.</li>
<li>
<strong>Click-Through Rate (CTR)</strong>: Descriptive URLs can improve the likelihood of users clicking your result in the SERPs because they have a better idea of what to expect.</li>
</ul>
<p>In 2025, as search algorithms continue to prioritize user intent and overall website quality, URLs that enhance both machine understanding and human usability will remain a vital piece of the SEO puzzle.</p>
<h2>
The Core Principles of a Developer-Friendly, SEO-Friendly URL
</h2>
<p>Building effective URLs isn't rocket science, but it does require adherence to a few key principles. As developers, we have the power to implement these at the architectural level, ensuring SEO is baked in, not bolted on.</p>
<h3>
1. Create Human Readable URLs That Actually Make Sense
</h3>
<p>This is perhaps the most critical rule. A good URL should be instantly understandable to a human. Avoid cryptic IDs, session variables, or overly complex parameter strings.</p>
<p>✅Good: /blog/the-developers-guide-to-seo-urls<br>
❌Bad: /article.php?id=123&sessionid=xyz&cat=4</p>
<p>Readable URLs are easier for users to remember, share, and understand. They also signal to search engines that the page is about a specific, identifiable topic.</p>
<h3>
2. Use Keywords (But Don't Stuff Them)
</h3>
<p>Including relevant keywords in your URL can still provide a ranking signal and improve CTR. However, the emphasis here is on relevant and natural.[9] Don't force keywords in if they make the URL look spammy or unreadable. Aim for 1-2 primary keywords that accurately reflect the page content.</p>
<p>✅Good: /products/mens-running-shoes<br>
🟡Okay: /products/mens-athletic-footwear-for-running-and-training (Getting a bit long, but still readable)<br>
❌Bad: /products/cheap-mens-running-shoes-buy-online-best-price (Keyword stuffing)</p>
<h3>
3. Hyphens for Separators, Always
</h3>
<p>This is a long-standing best practice that still holds true. Use hyphens (-) to separate words in your URL slug. Search engines are explicitly told to interpret hyphens as word separators. Avoid underscores (_) or spaces (which get encoded into unsightly%20`).</p>
<p>✅Good: /seo-friendly-urls<br>
❌Bad: /seo_friendly_urls<br>
❌Really Bad: /seo%20friendly%20urls</p>
<h3>
4. Embrace the Lowercase
</h3>
<p>URLs can technically be case-sensitive. To avoid potential duplicate content issues (where /About and /about are treated as two different pages), always use lowercase letters in your URLs. Enforce this at the server level or within your routing configuration.</p>
<h3>
5. Shorter is Often Better
</h3>
<p>While there's no strict character limit for SEO, shorter URLs are generally preferred. They are easier to read, remember, and fit better in search results and other displays. Aim for conciseness without sacrificing descriptiveness. Google has indicated that URL length doesn't directly impact ranking, but readability and usability do.</p>
<h3>
6. Avoid Unnecessary Parameters and IDs
</h3>
<p>Dynamic parameters (?param=value) can sometimes cause issues with crawling and duplicate content. While modern search engines are better at handling them, it's best practice to use clean, static-looking URLs wherever possible, achieving this through URL rewriting. Avoid parameters for things like session IDs or tracking unless absolutely necessary and properly handled with canonical tags.</p>
<h3>
7. Consistency is Key (Trailing Slashes and WWW)
</h3>
<p>Decide whether you want to use trailing slashes (e.g., <code>/about/</code>) or not (e.g., <code>/about</code>) and stick to it consistently across your entire site. The same goes for the www prefix (e.g., <code>www.example.com</code> vs. <code>example.com</code>). Choose your preferred version and implement 301 redirects to point all other variations to the canonical version. Consistency helps search engines crawl and index your site correctly and prevents duplicate content issues.</p>
<h2>
How to Handle Duplicate Content with Canonical URLs
</h2>
<p>Sometimes, the same content might be accessible via multiple URLs (e.g., with different parameters, or trailing slash variations if not handled by redirects). The <code>rel="canonical"</code> tag is your tool for telling search engines which URL is the "master"/"main" version. This is implemented in the <code><head></code> section of your HTML:</p>
<p><code></code><code><link rel="canonical" href="proxy.php?url=https://www.example.com/preferred-url/"></code><code></code></p>
<p>Developers should ensure that canonical tags are dynamically generated based on the preferred URL for the current page, especially when dealing with filtered lists or parameterized URLs.</p>
<h2>
Advanced URL Considerations for Modern Web Development
</h2>
<p>As technical SEO evolves alongside web development practices, keep these additional factors in mind:</p>
<h3>
Single Page Applications and URL Structure
</h3>
<p>If you're building SPAs or PWAs (like most of us these days), use the History API for clean URLs and implement either server-side rendering or pre-rendering for search engines.</p>
<h3>
International and Multilingual URL Structures
</h3>
<p>For sites targeting multiple countries or languages, choose your approach carefully:</p>
<ul>
<li>ccTLDs: <code>example.de</code>, <code>example.fr</code>
</li>
<li>Subdomains: <code>de.example.com</code>, <code>fr.example.com</code>
</li>
<li>Subdirectories: <code>example.com/de/</code>, <code>example.com/fr/</code>
</li>
</ul>
<p>Each has pros and cons, but for most sites, multilingual website URL structure works best with subdirectories for maximum domain authority consolidation.</p>
<h3>
URL Structure for Content Marketing Success
</h3>
<p>If you're serious about content marketing SEO, organize your blog URL structure logically:</p>
<ul>
<li>✅ Good: /blog/category/post-title</li>
<li>✅ Also Good: /blog/post-title (flatter structure)</li>
</ul>
<p>Avoid dates in URLs unless absolutely necessary for your content strategy—they make content look outdated even when it's been updated.</p>
<h2>
My Step-by-Step URL Audit Checklist
</h2>
<p>Before launching any new site or section, I run through this URL structure audit checklist:</p>
<ol>
<li>URLs readable and descriptive for both users and search engines?</li>
<li>Are relevant keywords included naturally where appropriate?</li>
<li>Are hyphens used to separate words?</li>
<li>Is everything in lowercase?</li>
<li>Are URLs reasonably concise?</li>
<li>Are unnecessary parameters avoided or handled with canonical tags?</li>
<li>Is there consistency in trailing slashes and WWW usage, enforced with redirects?</li>
<li>Are 301 redirects in place for any changed or old URLs?</li>
<li>If using SPAs/PWAs, is routing SEO-friendly (History API, SSR/pre-rendering)?</li>
<li>Are canonical tags correctly implemented for any potential duplicate content?</li>
</ol>
<h2>
The "How to Fix Bad URL Structure" Action Plan
</h2>
<p>If you're looking at an existing site with poor URL structure, don't panic. Here's my URL structure optimization plan:</p>
<ol>
<li>Audit current URLs and identify problems</li>
<li>Create a mapping of old URLs to new, improved versions</li>
<li>Implement 301 redirects from old to new</li>
<li>Update all internal links</li>
<li>Submit the new URL structure to Google Search Console</li>
<li>Monitor for any 404 errors and fix them promptly</li>
</ol>
<h2>
Final Thoughts: URL Structure Is Part of Your SEO Foundation
</h2>
<p>URLs might seem like a small detail, but they are foundational to a well-optimized website. By taking ownership of URL structure and implementing these best practices, developers don't just make search engines happy; they create a more usable, understandable, and trustworthy experience for every person who interacts with their work.</p>
<p>I've implemented pretty much every URL structure imaginable over the years some good, many bad. What I've learned is that taking the time to get this right from the beginning saves countless headaches down the road and delivers measurable SEO benefits.</p>
<p>If you're just starting your SEO URL optimization journey, definitely check out Google's official guidance:</p>
<ul>
<li><a href="proxy.php?url=https://developers.google.com/search/docs/fundamentals/seo-starter-guide#urls" rel="noopener noreferrer">Search Engine Optimization (SEO) Starter Guide by Google</a></li>
</ul>
<p>But remember, while guidelines are great, real-world experience often teaches the most valuable lessons. I'd love to hear about your URL structure wins and fails in the comments.</p>
<p>Now go build some URLs that both humans and search engines will love!</p>
webdevseotutorialbeginnersBuild a Deep Research AI agent using Next.js, the Vercel AI SDK, and multiple LLMs, including Gemini and Deepseek.CodeBucksThu, 20 Mar 2025 13:17:54 +0000
https://dev.to/codebucks/build-a-deep-research-ai-agent-using-nextjs-the-vercel-ai-sdk-and-multiple-llms-including-3ji0
https://dev.to/codebucks/build-a-deep-research-ai-agent-using-nextjs-the-vercel-ai-sdk-and-multiple-llms-including-3ji0<p>I have built an open source Deep Research AI agent like Gemini or ChatGPT. Using Next.js, Vercel AI SDK, and Exa Search API, It generates follow-up questions, crafts optimal search queries, and compiles comprehensive research reports.</p>
<p>Using open router it is using multiple LLMs for different stages. At the last stage I have used gemini 2.0 reasoning model to generate comprehensive report based on the collected data from web search.</p>
<p>Check out the tutorial👇🏻</p>
<p><iframe width="710" height="399" src="proxy.php?url=https://www.youtube.com/embed/zKN18GQBxCM">
</iframe>
</p>
<p>Let me know your thoughts, and feel free give star on the github repo. </p>
ainextjswebdevtutorialMastering React Hooks in 2025: A Step-by-Step Guide for BeginnersCodeBucksTue, 04 Mar 2025 16:03:18 +0000
https://dev.to/codebucks/mastering-react-hooks-in-2025-a-step-by-step-guide-for-beginners-387h
https://dev.to/codebucks/mastering-react-hooks-in-2025-a-step-by-step-guide-for-beginners-387h<p>When I first started learning React, class components were the norm, requiring a lot of code. Then, functional components were introduced, which changed everything. As React continues to evolve, one of its most transformative features has been <strong>React Hooks</strong>, introduced in React 16.8 in February 2019. Now in 2025, <strong>React Hooks</strong> have become an essential part of modern React development, fundamentally changing how developers work with state and side effects in functional components.</p>
<p>Before <strong>React Hooks</strong>, developers had to use class components to manage state and lifecycle methods. This often led to complex, hard-to-maintain code with logic scattered across different lifecycle methods. <strong>React Hooks</strong> solved this problem by allowing developers to use state and other React features in functional components, leading to cleaner, more reusable code.</p>
<p>In this comprehensive guide, we'll explore everything you need to know about <strong>React Hooks</strong>. Whether you're a developer with basic knowledge of React looking to deepen your understanding or a beginner trying to grasp the fundamentals, this guide will walk you through the core concepts, best practices, and advanced techniques to master <strong>React Hooks</strong>.</p>
<blockquote>
<p><strong>NOTE:</strong> This article is a complete guide to React hooks for beginners, packed with tons of useful concepts. The code snippets have comments, so make sure to check them out to get a better understanding of the examples.</p>
</blockquote>
<h2>
What Are React Hooks?
</h2>
<blockquote>
<p><strong>React Hooks</strong> are functions that let you "hook into" React state and lifecycle features from functional components.</p>
</blockquote>
<p>They were introduced to solve problems that developers faced with class components, such as reusing stateful logic between components, organizing related code that was split across different lifecycle methods, and dealing with confusing class binding. React Hooks provide a more direct API to the React concepts you already know such as props, state, context, refs, and lifecycle events. Hooks don't fundamentally change how React works; rather, they offer a more ergonomic way to access React's powerful features.</p>
<p>At their core, <strong>React Hooks</strong> allow you to:</p>
<ul>
<li>Manage state within functional components</li>
<li>Perform side effects in a controlled way</li>
<li>Reuse stateful logic across multiple components</li>
<li>Access context in functional components</li>
<li>Create custom hooks to share logic between components</li>
</ul>
<p>In 2025, <strong>React Hooks</strong> have matured considerably, with the React team and community continually improving their performance and adding new capabilities. Let's explore the fundamental hooks that form the foundation of React hooks system.</p>
<h3>
Why are Hooks important for beginners?
</h3>
<ul>
<li>
<strong>Simpler Code:</strong> Hooks help you write less code to achieve the same results.</li>
<li>
<strong>Easier to Learn:</strong> For many, Hooks are easier to understand than the intricacies of class component lifecycle methods.</li>
<li>
<strong>Modern React:</strong> The React community and the React team are focusing on Hooks as the primary way to build components. Learning Hooks is essential for working with modern React codebases.</li>
<li>
<strong>Reusable Logic:</strong> Create custom hooks to use through out the projects</li>
</ul>
<h3>
The Two Golden Rules of Hooks
</h3>
<p>There are two important rules about where you can use Hooks, but don't get bogged down in them right now. Just be aware of them:</p>
<ol>
<li>
<strong>Top Level Only:</strong> Use Hooks at the top level of your function component, before any return statement. Don't put them inside loops, conditions, or nested functions.</li>
<li>
<strong>React Functions Only:</strong> Use Hooks inside React function components or custom Hooks (which are also functions).</li>
</ol>
<p>React provides an ESLint plugin that will warn you if you break these rules, so you'll get help as you code!</p>
<h2>
The Core Hooks: useState and useEffect
</h2>
<h3>
useState: Managing Component State
</h3>
<p>The <code>useState</code> hook is the most basic and frequently used hook in React. It allows you to add state to functional components, something that was previously only possible with class components.<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="k">import</span> <span class="nx">React</span><span class="p">,</span> <span class="p">{</span> <span class="nx">useState</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">react</span><span class="dl">'</span><span class="p">;</span>
<span class="kd">function</span> <span class="nf">Counter</span><span class="p">()</span> <span class="p">{</span>
<span class="c1">// Declare a state variable called "count" with initial value of 0</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">count</span><span class="p">,</span> <span class="nx">setCount</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">div</span><span class="o">></span>
<span class="o"><</span><span class="nx">p</span><span class="o">></span><span class="nx">You</span> <span class="nx">clicked</span> <span class="p">{</span><span class="nx">count</span><span class="p">}</span> <span class="nx">times</span><span class="o"><</span><span class="sr">/p</span><span class="err">>
</span> <span class="o"><</span><span class="nx">button</span> <span class="nx">onClick</span><span class="o">=</span><span class="p">{()</span> <span class="o">=></span> <span class="nf">setCount</span><span class="p">(</span><span class="nx">count</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)}</span><span class="o">></span>
<span class="nx">Click</span> <span class="nx">me</span>
<span class="o"><</span><span class="sr">/button</span><span class="err">>
</span> <span class="o"><</span><span class="sr">/div</span><span class="err">>
</span> <span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
<p>In this example, <code>useState</code> returns a pair: the current state value (<code>count</code>) and a function to update it (<code>setCount</code>). The argument passed to <code>useState</code> is the initial state value. When you call <code>setCount</code>, React re-renders the component with the new state value.</p>
<h4>
useState with Complex State
</h4>
<p>While the example above uses a simple number as state, <code>useState</code> can handle more complex data structures like objects and arrays. However, unlike <code>this.setState</code> in class components, <code>useState</code> doesn't automatically merge update objects.<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="k">import</span> <span class="nx">React</span><span class="p">,</span> <span class="p">{</span> <span class="nx">useState</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">react</span><span class="dl">'</span><span class="p">;</span>
<span class="kd">function</span> <span class="nf">UserProfile</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">user</span><span class="p">,</span> <span class="nx">setUser</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">({</span>
<span class="na">name</span><span class="p">:</span> <span class="dl">'</span><span class="s1">John</span><span class="dl">'</span><span class="p">,</span>
<span class="na">email</span><span class="p">:</span> <span class="dl">'</span><span class="s1">[email protected]</span><span class="dl">'</span><span class="p">,</span>
<span class="na">preferences</span><span class="p">:</span> <span class="p">{</span>
<span class="na">darkMode</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
<span class="na">notifications</span><span class="p">:</span> <span class="kc">true</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="c1">// Update a nested property in state</span>
<span class="kd">const</span> <span class="nx">toggleDarkMode</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="nf">setUser</span><span class="p">({</span>
<span class="p">...</span><span class="nx">user</span><span class="p">,</span>
<span class="na">preferences</span><span class="p">:</span> <span class="p">{</span>
<span class="p">...</span><span class="nx">user</span><span class="p">.</span><span class="nx">preferences</span><span class="p">,</span>
<span class="na">darkMode</span><span class="p">:</span> <span class="o">!</span><span class="nx">user</span><span class="p">.</span><span class="nx">preferences</span><span class="p">.</span><span class="nx">darkMode</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">};</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">div</span><span class="o">></span>
<span class="o"><</span><span class="nx">h2</span><span class="o">></span><span class="p">{</span><span class="nx">user</span><span class="p">.</span><span class="nx">name</span><span class="p">}</span><span class="dl">'</span><span class="s1">s Profile</h2>
<p>Email: {user.email}</p>
<p>Dark Mode: {user.preferences.darkMode ? </span><span class="dl">'</span><span class="nx">On</span><span class="dl">'</span><span class="s1"> : </span><span class="dl">'</span><span class="nx">Off</span><span class="dl">'</span><span class="s1">}</p>
<button onClick={toggleDarkMode}>Toggle Dark Mode</button>
</div>
);
}
</span></code></pre>
</div>
<p>Notice how we have to use the spread operator (<code>...</code>) to maintain the existing state while updating only specific parts. This <strong>immutable</strong> update pattern is common in React and helps ensure predictable <a href="proxy.php?url=https://devdreaming.com/blogs/simplify-state-management-with-reactjs-context-api" rel="noopener noreferrer">state management</a>.</p>
<h4>
Functional Updates in useState
</h4>
<p>When new state depends on previous state, React recommends using the functional update form of <code>useState</code>:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="kd">function</span> <span class="nf">Counter</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">count</span><span class="p">,</span> <span class="nx">setCount</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="c1">// Using functional update form</span>
<span class="kd">const</span> <span class="nx">increment</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="nf">setCount</span><span class="p">(</span><span class="nx">prevCount</span> <span class="o">=></span> <span class="nx">prevCount</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
<span class="p">};</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">div</span><span class="o">></span>
<span class="o"><</span><span class="nx">p</span><span class="o">></span><span class="nx">Count</span><span class="p">:</span> <span class="p">{</span><span class="nx">count</span><span class="p">}</span><span class="o"><</span><span class="sr">/p</span><span class="err">>
</span> <span class="o"><</span><span class="nx">button</span> <span class="nx">onClick</span><span class="o">=</span><span class="p">{</span><span class="nx">increment</span><span class="p">}</span><span class="o">></span><span class="nx">Increment</span><span class="o"><</span><span class="sr">/button</span><span class="err">>
</span> <span class="o"><</span><span class="sr">/div</span><span class="err">>
</span> <span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
<p>This approach ensures you're always working with the most current state value, which is essential in scenarios with multiple state updates or asynchronous code.</p>
<h3>
useEffect: Managing Side Effects
</h3>
<p>The <code>useEffect</code> hook lets you perform side effects in functional components. Side effects can include data fetching, subscriptions, or manually changing the DOM.<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="k">import</span> <span class="nx">React</span><span class="p">,</span> <span class="p">{</span> <span class="nx">useState</span><span class="p">,</span> <span class="nx">useEffect</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">react</span><span class="dl">'</span><span class="p">;</span>
<span class="kd">function</span> <span class="nf">UserData</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">user</span><span class="p">,</span> <span class="nx">setUser</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">loading</span><span class="p">,</span> <span class="nx">setLoading</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
<span class="nf">useEffect</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">fetchUser</span> <span class="o">=</span> <span class="k">async </span><span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="k">try</span> <span class="p">{</span>
<span class="nf">setLoading</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">response</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">fetch</span><span class="p">(</span><span class="dl">'</span><span class="s1">https://api.example.com/user</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">userData</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">response</span><span class="p">.</span><span class="nf">json</span><span class="p">();</span>
<span class="nf">setUser</span><span class="p">(</span><span class="nx">userData</span><span class="p">);</span>
<span class="p">}</span> <span class="k">catch </span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if </span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="dl">'</span><span class="s1">Error fetching user data:</span><span class="dl">'</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span> <span class="k">finally</span> <span class="p">{</span>
<span class="nf">setLoading</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="nf">fetchUser</span><span class="p">();</span>
<span class="c1">// Cleanup function</span>
<span class="k">return </span><span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="c1">// add cleanup code here such as window.removeEventListener</span>
<span class="p">};</span>
<span class="p">},</span> <span class="p">[]);</span> <span class="c1">// Empty dependency array means this effect runs once on mount</span>
<span class="k">if </span><span class="p">(</span><span class="nx">loading</span><span class="p">)</span> <span class="k">return</span> <span class="o"><</span><span class="nx">div</span><span class="o">></span><span class="nx">Loading</span><span class="p">...</span><span class="o"><</span><span class="sr">/div></span><span class="err">;
</span>
<span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">user</span><span class="p">)</span> <span class="k">return</span> <span class="o"><</span><span class="nx">div</span><span class="o">></span><span class="nx">No</span> <span class="nx">user</span> <span class="nx">data</span> <span class="nx">found</span><span class="o"><</span><span class="sr">/div></span><span class="err">;
</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">div</span><span class="o">></span>
<span class="o"><</span><span class="nx">h2</span><span class="o">></span><span class="p">{</span><span class="nx">user</span><span class="p">.</span><span class="nx">name</span><span class="p">}</span><span class="o"><</span><span class="sr">/h2</span><span class="err">>
</span> <span class="o"><</span><span class="nx">p</span><span class="o">></span><span class="nx">Email</span><span class="p">:</span> <span class="p">{</span><span class="nx">user</span><span class="p">.</span><span class="nx">email</span><span class="p">}</span><span class="o"><</span><span class="sr">/p</span><span class="err">>
</span> <span class="o"><</span><span class="sr">/div</span><span class="err">>
</span> <span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
<p>This example demonstrates a common pattern of using <code>useEffect</code> for data fetching. The empty dependency array <code>[]</code> means the effect runs only when the component mounts. The function returned from the effect serves as a cleanup mechanism, which runs when the component unmounts or before the effect runs again.</p>
<h4>
The Dependency Array
</h4>
<p>The dependency array is a crucial part of <code>useEffect</code>. It determines when the effect should run:</p>
<ul>
<li>
<strong>Empty array (<code>[]</code>)</strong>: The effect runs once after the initial render</li>
<li>
<strong>Variables in the array (<code>[var1, var2]</code>)</strong>: The effect runs after the initial render and whenever any dependency (var1 or var2) changes.</li>
<li>
<strong>No array</strong>: The effect runs after every render
</li>
</ul>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="kd">function</span> <span class="nf">SearchResults</span><span class="p">({</span> <span class="nx">query</span> <span class="p">})</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">results</span><span class="p">,</span> <span class="nx">setResults</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">([]);</span>
<span class="nf">useEffect</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="k">if </span><span class="p">(</span><span class="nx">query</span><span class="p">.</span><span class="nf">trim</span><span class="p">()</span> <span class="o">===</span> <span class="dl">''</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">fetchResults</span> <span class="o">=</span> <span class="k">async </span><span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">response</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">fetch</span><span class="p">(</span><span class="s2">`https://api.example.com/search?q=</span><span class="p">${</span><span class="nx">query</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">data</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">response</span><span class="p">.</span><span class="nf">json</span><span class="p">();</span>
<span class="nf">setResults</span><span class="p">(</span><span class="nx">data</span><span class="p">);</span>
<span class="p">};</span>
<span class="nf">fetchResults</span><span class="p">();</span>
<span class="p">},</span> <span class="p">[</span><span class="nx">query</span><span class="p">]);</span> <span class="c1">// Effect runs when query changes</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">ul</span><span class="o">></span>
<span class="p">{</span><span class="nx">results</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="nx">result</span> <span class="o">=></span> <span class="p">(</span>
<span class="o"><</span><span class="nx">li</span> <span class="nx">key</span><span class="o">=</span><span class="p">{</span><span class="nx">result</span><span class="p">.</span><span class="nx">id</span><span class="p">}</span><span class="o">></span><span class="p">{</span><span class="nx">result</span><span class="p">.</span><span class="nx">title</span><span class="p">}</span><span class="o"><</span><span class="sr">/li</span><span class="err">>
</span> <span class="p">))}</span>
<span class="o"><</span><span class="sr">/ul</span><span class="err">>
</span> <span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
<p>In the above example, the effect runs whenever the <code>query</code> prop changes, fetching new search results.</p>
<h4>
Common useEffect Patterns
</h4>
<p><strong>1. Data Fetching</strong><br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="nf">useEffect</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="kd">let</span> <span class="nx">isMounted</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">fetchData</span> <span class="o">=</span> <span class="k">async </span><span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">data</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">fetchSomeData</span><span class="p">();</span>
<span class="k">if </span><span class="p">(</span><span class="nx">isMounted</span><span class="p">)</span> <span class="nf">setData</span><span class="p">(</span><span class="nx">data</span><span class="p">);</span>
<span class="p">};</span>
<span class="nf">fetchData</span><span class="p">();</span>
<span class="k">return </span><span class="p">()</span> <span class="o">=></span> <span class="p">{</span> <span class="nx">isMounted</span> <span class="o">=</span> <span class="kc">false</span> <span class="p">};</span>
<span class="p">},</span> <span class="p">[</span><span class="nx">dependencyValue</span><span class="p">]);</span>
</code></pre>
</div>
<p><strong>2. Subscriptions</strong><br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="nf">useEffect</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">subscription</span> <span class="o">=</span> <span class="nf">subscribeToEvent</span><span class="p">(</span><span class="nx">eventId</span><span class="p">,</span> <span class="nx">handleEvent</span><span class="p">);</span>
<span class="k">return </span><span class="p">()</span> <span class="o">=></span> <span class="nf">unsubscribe</span><span class="p">(</span><span class="nx">subscription</span><span class="p">);</span>
<span class="p">},</span> <span class="p">[</span><span class="nx">eventId</span><span class="p">]);</span>
</code></pre>
</div>
<p><strong>3. DOM Manipulations</strong><br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="nf">useEffect</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">element</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">getElementById</span><span class="p">(</span><span class="dl">'</span><span class="s1">some-element</span><span class="dl">'</span><span class="p">);</span>
<span class="nx">element</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">opacity</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">1</span><span class="dl">'</span><span class="p">;</span>
<span class="k">return </span><span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="nx">element</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">opacity</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">0</span><span class="dl">'</span><span class="p">;</span>
<span class="p">};</span>
<span class="p">},</span> <span class="p">[]);</span>
</code></pre>
</div>
<h2>
Additional Core React Hooks
</h2>
<p>Here is few other React hooks which are widely used along with <code>useState</code> and <code>useEffect</code> hooks.</p>
<h3>
1. useContext: Managing Global State
</h3>
<p>The <code>useContext</code> hook provides a way to pass data through the component tree without manually passing props at every level. This is especially useful for theme settings, user authentication, or language preferences. Basically using <code>useContext</code> hook you can access <a href="proxy.php?url=https://devdreaming.com/blogs/simplify-state-management-with-reactjs-context-api" rel="noopener noreferrer">React's context APIs</a>.<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="k">import</span> <span class="nx">React</span><span class="p">,</span> <span class="p">{</span> <span class="nx">createContext</span><span class="p">,</span> <span class="nx">useContext</span><span class="p">,</span> <span class="nx">useState</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">react</span><span class="dl">'</span><span class="p">;</span>
<span class="c1">// Create a context</span>
<span class="kd">const</span> <span class="nx">ThemeContext</span> <span class="o">=</span> <span class="nf">createContext</span><span class="p">();</span>
<span class="c1">// Provider component</span>
<span class="kd">function</span> <span class="nf">ThemeProvider</span><span class="p">({</span> <span class="nx">children</span> <span class="p">})</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">theme</span><span class="p">,</span> <span class="nx">setTheme</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="dl">'</span><span class="s1">light</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">toggleTheme</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="nf">setTheme</span><span class="p">(</span><span class="nx">prevTheme</span> <span class="o">=></span> <span class="nx">prevTheme</span> <span class="o">===</span> <span class="dl">'</span><span class="s1">light</span><span class="dl">'</span> <span class="p">?</span> <span class="dl">'</span><span class="s1">dark</span><span class="dl">'</span> <span class="p">:</span> <span class="dl">'</span><span class="s1">light</span><span class="dl">'</span><span class="p">);</span>
<span class="p">};</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">ThemeContext</span><span class="p">.</span><span class="nx">Provider</span> <span class="nx">value</span><span class="o">=</span><span class="p">{{</span> <span class="nx">theme</span><span class="p">,</span> <span class="nx">toggleTheme</span> <span class="p">}}</span><span class="o">></span>
<span class="p">{</span><span class="nx">children</span><span class="p">}</span>
<span class="o"><</span><span class="sr">/ThemeContext.Provider</span><span class="err">>
</span> <span class="p">);</span>
<span class="p">}</span>
<span class="c1">// Consumer component</span>
<span class="kd">function</span> <span class="nf">ThemedButton</span><span class="p">()</span> <span class="p">{</span>
<span class="c1">// Use the context</span>
<span class="kd">const</span> <span class="p">{</span> <span class="nx">theme</span><span class="p">,</span> <span class="nx">toggleTheme</span> <span class="p">}</span> <span class="o">=</span> <span class="nf">useContext</span><span class="p">(</span><span class="nx">ThemeContext</span><span class="p">);</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">button</span>
<span class="nx">onClick</span><span class="o">=</span><span class="p">{</span><span class="nx">toggleTheme</span><span class="p">}</span>
<span class="nx">style</span><span class="o">=</span><span class="p">{{</span>
<span class="na">background</span><span class="p">:</span> <span class="nx">theme</span> <span class="o">===</span> <span class="dl">'</span><span class="s1">light</span><span class="dl">'</span> <span class="p">?</span> <span class="dl">'</span><span class="s1">#fff</span><span class="dl">'</span> <span class="p">:</span> <span class="dl">'</span><span class="s1">#333</span><span class="dl">'</span><span class="p">,</span>
<span class="na">color</span><span class="p">:</span> <span class="nx">theme</span> <span class="o">===</span> <span class="dl">'</span><span class="s1">light</span><span class="dl">'</span> <span class="p">?</span> <span class="dl">'</span><span class="s1">#333</span><span class="dl">'</span> <span class="p">:</span> <span class="dl">'</span><span class="s1">#fff</span><span class="dl">'</span><span class="p">,</span>
<span class="na">padding</span><span class="p">:</span> <span class="dl">'</span><span class="s1">10px 15px</span><span class="dl">'</span><span class="p">,</span>
<span class="na">border</span><span class="p">:</span> <span class="s2">`1px solid </span><span class="p">${</span><span class="nx">theme</span> <span class="o">===</span> <span class="dl">'</span><span class="s1">light</span><span class="dl">'</span> <span class="p">?</span> <span class="dl">'</span><span class="s1">#333</span><span class="dl">'</span> <span class="p">:</span> <span class="dl">'</span><span class="s1">#fff</span><span class="dl">'</span><span class="p">}</span><span class="s2">`</span>
<span class="p">}}</span>
<span class="o">></span>
<span class="nx">Toggle</span> <span class="nx">Theme</span>
<span class="o"><</span><span class="sr">/button</span><span class="err">>
</span> <span class="p">);</span>
<span class="p">}</span>
<span class="c1">// App that uses the theme</span>
<span class="kd">function</span> <span class="nf">App</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">ThemeProvider</span><span class="o">></span>
<span class="o"><</span><span class="nx">div</span> <span class="nx">style</span><span class="o">=</span><span class="p">{{</span> <span class="na">padding</span><span class="p">:</span> <span class="dl">'</span><span class="s1">20px</span><span class="dl">'</span> <span class="p">}}</span><span class="o">></span>
<span class="o"><</span><span class="nx">h1</span><span class="o">></span><span class="nx">Context</span> <span class="nx">Example</span><span class="o"><</span><span class="sr">/h1</span><span class="err">>
</span> <span class="o"><</span><span class="nx">ThemedButton</span> <span class="o">/></span>
<span class="o"><</span><span class="sr">/div</span><span class="err">>
</span> <span class="o"><</span><span class="sr">/ThemeProvider</span><span class="err">>
</span> <span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
<p>This pattern creates a "theme context" that can be accessed by any component within the <code>ThemeProvider</code>, eliminating the need to pass the theme through multiple layers of components.</p>
<h3>
2. useReducer: Complex State Logic
</h3>
<p>For more complex state logic, <code>useReducer</code> provides an alternative to <code>useState</code>. Inspired by Redux, it's particularly useful when the next state depends on the previous state or when state transitions are complex. Checkout following example:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="k">import</span> <span class="nx">React</span><span class="p">,</span> <span class="p">{</span> <span class="nx">useReducer</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">react</span><span class="dl">'</span><span class="p">;</span>
<span class="c1">// Reducer function</span>
<span class="kd">function</span> <span class="nf">todoReducer</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span> <span class="nx">action</span><span class="p">)</span> <span class="p">{</span>
<span class="k">switch </span><span class="p">(</span><span class="nx">action</span><span class="p">.</span><span class="nx">type</span><span class="p">)</span> <span class="p">{</span>
<span class="k">case</span> <span class="dl">'</span><span class="s1">ADD_TODO</span><span class="dl">'</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[...</span><span class="nx">state</span><span class="p">,</span> <span class="p">{</span>
<span class="na">id</span><span class="p">:</span> <span class="nb">Date</span><span class="p">.</span><span class="nf">now</span><span class="p">(),</span>
<span class="na">text</span><span class="p">:</span> <span class="nx">action</span><span class="p">.</span><span class="nx">payload</span><span class="p">,</span>
<span class="na">completed</span><span class="p">:</span> <span class="kc">false</span>
<span class="p">}];</span>
<span class="k">case</span> <span class="dl">'</span><span class="s1">TOGGLE_TODO</span><span class="dl">'</span><span class="p">:</span>
<span class="k">return</span> <span class="nx">state</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="nx">todo</span> <span class="o">=></span>
<span class="nx">todo</span><span class="p">.</span><span class="nx">id</span> <span class="o">===</span> <span class="nx">action</span><span class="p">.</span><span class="nx">payload</span>
<span class="p">?</span> <span class="p">{</span> <span class="p">...</span><span class="nx">todo</span><span class="p">,</span> <span class="na">completed</span><span class="p">:</span> <span class="o">!</span><span class="nx">todo</span><span class="p">.</span><span class="nx">completed</span> <span class="p">}</span>
<span class="p">:</span> <span class="nx">todo</span>
<span class="p">);</span>
<span class="k">case</span> <span class="dl">'</span><span class="s1">DELETE_TODO</span><span class="dl">'</span><span class="p">:</span>
<span class="k">return</span> <span class="nx">state</span><span class="p">.</span><span class="nf">filter</span><span class="p">(</span><span class="nx">todo</span> <span class="o">=></span> <span class="nx">todo</span><span class="p">.</span><span class="nx">id</span> <span class="o">!==</span> <span class="nx">action</span><span class="p">.</span><span class="nx">payload</span><span class="p">);</span>
<span class="nl">default</span><span class="p">:</span>
<span class="k">return</span> <span class="nx">state</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kd">function</span> <span class="nf">TodoApp</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">todos</span><span class="p">,</span> <span class="nx">dispatch</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useReducer</span><span class="p">(</span><span class="nx">todoReducer</span><span class="p">,</span> <span class="p">[]);</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">text</span><span class="p">,</span> <span class="nx">setText</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="dl">''</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">handleSubmit</span> <span class="o">=</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
<span class="nx">e</span><span class="p">.</span><span class="nf">preventDefault</span><span class="p">();</span>
<span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">text</span><span class="p">.</span><span class="nf">trim</span><span class="p">())</span> <span class="k">return</span><span class="p">;</span>
<span class="nf">dispatch</span><span class="p">({</span> <span class="na">type</span><span class="p">:</span> <span class="dl">'</span><span class="s1">ADD_TODO</span><span class="dl">'</span><span class="p">,</span> <span class="na">payload</span><span class="p">:</span> <span class="nx">text</span> <span class="p">});</span>
<span class="nf">setText</span><span class="p">(</span><span class="dl">''</span><span class="p">);</span>
<span class="p">};</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">div</span><span class="o">></span>
<span class="o"><</span><span class="nx">form</span> <span class="nx">onSubmit</span><span class="o">=</span><span class="p">{</span><span class="nx">handleSubmit</span><span class="p">}</span><span class="o">></span>
<span class="o"><</span><span class="nx">input</span>
<span class="nx">value</span><span class="o">=</span><span class="p">{</span><span class="nx">text</span><span class="p">}</span>
<span class="nx">onChange</span><span class="o">=</span><span class="p">{(</span><span class="nx">e</span><span class="p">)</span> <span class="o">=></span> <span class="nf">setText</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">value</span><span class="p">)}</span>
<span class="nx">placeholder</span><span class="o">=</span><span class="dl">"</span><span class="s2">Add a todo</span><span class="dl">"</span>
<span class="o">/></span>
<span class="o"><</span><span class="nx">button</span> <span class="nx">type</span><span class="o">=</span><span class="dl">"</span><span class="s2">submit</span><span class="dl">"</span><span class="o">></span><span class="nx">Add</span><span class="o"><</span><span class="sr">/button</span><span class="err">>
</span> <span class="o"><</span><span class="sr">/form</span><span class="err">>
</span>
<span class="o"><</span><span class="nx">ul</span><span class="o">></span>
<span class="p">{</span><span class="nx">todos</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="nx">todo</span> <span class="o">=></span> <span class="p">(</span>
<span class="o"><</span><span class="nx">li</span>
<span class="nx">key</span><span class="o">=</span><span class="p">{</span><span class="nx">todo</span><span class="p">.</span><span class="nx">id</span><span class="p">}</span>
<span class="nx">style</span><span class="o">=</span><span class="p">{{</span> <span class="na">textDecoration</span><span class="p">:</span> <span class="nx">todo</span><span class="p">.</span><span class="nx">completed</span> <span class="p">?</span> <span class="dl">'</span><span class="s1">line-through</span><span class="dl">'</span> <span class="p">:</span> <span class="dl">'</span><span class="s1">none</span><span class="dl">'</span> <span class="p">}}</span>
<span class="o">></span>
<span class="o"><</span><span class="nx">span</span> <span class="nx">onClick</span><span class="o">=</span><span class="p">{()</span> <span class="o">=></span> <span class="nf">dispatch</span><span class="p">({</span> <span class="na">type</span><span class="p">:</span> <span class="dl">'</span><span class="s1">TOGGLE_TODO</span><span class="dl">'</span><span class="p">,</span> <span class="na">payload</span><span class="p">:</span> <span class="nx">todo</span><span class="p">.</span><span class="nx">id</span> <span class="p">})}</span><span class="o">></span>
<span class="p">{</span><span class="nx">todo</span><span class="p">.</span><span class="nx">text</span><span class="p">}</span>
<span class="o"><</span><span class="sr">/span</span><span class="err">>
</span>
<span class="o"><</span><span class="nx">button</span> <span class="nx">onClick</span><span class="o">=</span><span class="p">{()</span> <span class="o">=></span> <span class="nf">dispatch</span><span class="p">({</span> <span class="na">type</span><span class="p">:</span> <span class="dl">'</span><span class="s1">DELETE_TODO</span><span class="dl">'</span><span class="p">,</span> <span class="na">payload</span><span class="p">:</span> <span class="nx">todo</span><span class="p">.</span><span class="nx">id</span> <span class="p">})}</span><span class="o">></span>
<span class="nx">Delete</span>
<span class="o"><</span><span class="sr">/button</span><span class="err">>
</span>
<span class="o"><</span><span class="sr">/li</span><span class="err">>
</span> <span class="p">))}</span>
<span class="o"><</span><span class="sr">/ul</span><span class="err">>
</span> <span class="o"><</span><span class="sr">/div</span><span class="err">>
</span> <span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
<p>The <code>useReducer</code> hook is preferred over <code>useState</code> when:</p>
<ul>
<li>State logic is complex involving multiple sub-values</li>
<li>The next state depends on the previous one</li>
<li>You want to optimize performance for components that trigger deep updates</li>
</ul>
<h3>
3. useRef: Persisting Values Between Renders
</h3>
<p>The <code>useRef</code> hook creates a mutable reference that persists across renders. Unlike state, changing a ref doesn't trigger a re-render.<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="k">import</span> <span class="nx">React</span><span class="p">,</span> <span class="p">{</span> <span class="nx">useRef</span><span class="p">,</span> <span class="nx">useState</span><span class="p">,</span> <span class="nx">useEffect</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">react</span><span class="dl">'</span><span class="p">;</span>
<span class="kd">function</span> <span class="nf">StopwatchWithFocus</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">time</span><span class="p">,</span> <span class="nx">setTime</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">isRunning</span><span class="p">,</span> <span class="nx">setIsRunning</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">timerIdRef</span> <span class="o">=</span> <span class="nf">useRef</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">inputRef</span> <span class="o">=</span> <span class="nf">useRef</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
<span class="nf">useEffect</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="k">if </span><span class="p">(</span><span class="nx">isRunning</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">timerIdRef</span><span class="p">.</span><span class="nx">current</span> <span class="o">=</span> <span class="nf">setInterval</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="nf">setTime</span><span class="p">(</span><span class="nx">prevTime</span> <span class="o">=></span> <span class="nx">prevTime</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
<span class="p">},</span> <span class="mi">1000</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="k">if </span><span class="p">(</span><span class="nx">timerIdRef</span><span class="p">.</span><span class="nx">current</span><span class="p">)</span> <span class="p">{</span>
<span class="nf">clearInterval</span><span class="p">(</span><span class="nx">timerIdRef</span><span class="p">.</span><span class="nx">current</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">return </span><span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="k">if </span><span class="p">(</span><span class="nx">timerIdRef</span><span class="p">.</span><span class="nx">current</span><span class="p">)</span> <span class="p">{</span>
<span class="nf">clearInterval</span><span class="p">(</span><span class="nx">timerIdRef</span><span class="p">.</span><span class="nx">current</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="p">},</span> <span class="p">[</span><span class="nx">isRunning</span><span class="p">]);</span>
<span class="kd">const</span> <span class="nx">handleStartStop</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="nf">setIsRunning</span><span class="p">(</span><span class="o">!</span><span class="nx">isRunning</span><span class="p">);</span>
<span class="p">};</span>
<span class="kd">const</span> <span class="nx">handleReset</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="nf">setIsRunning</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
<span class="nf">setTime</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="c1">// Focus the input after reset</span>
<span class="nx">inputRef</span><span class="p">.</span><span class="nx">current</span><span class="p">.</span><span class="nf">focus</span><span class="p">();</span>
<span class="p">};</span>
<span class="kd">const</span> <span class="nx">formatTime</span> <span class="o">=</span> <span class="p">(</span><span class="nx">seconds</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">mins</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nx">seconds</span> <span class="o">/</span> <span class="mi">60</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">secs</span> <span class="o">=</span> <span class="nx">seconds</span> <span class="o">%</span> <span class="mi">60</span><span class="p">;</span>
<span class="k">return</span> <span class="s2">`</span><span class="p">${</span><span class="nx">mins</span><span class="p">.</span><span class="nf">toString</span><span class="p">().</span><span class="nf">padStart</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="dl">'</span><span class="s1">0</span><span class="dl">'</span><span class="p">)}</span><span class="s2">:</span><span class="p">${</span><span class="nx">secs</span><span class="p">.</span><span class="nf">toString</span><span class="p">().</span><span class="nf">padStart</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="dl">'</span><span class="s1">0</span><span class="dl">'</span><span class="p">)}</span><span class="s2">`</span><span class="p">;</span>
<span class="p">};</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">div</span><span class="o">></span>
<span class="o"><</span><span class="nx">h2</span><span class="o">></span><span class="nx">Stopwatch</span><span class="p">:</span> <span class="p">{</span><span class="nf">formatTime</span><span class="p">(</span><span class="nx">time</span><span class="p">)}</span><span class="o"><</span><span class="sr">/h2</span><span class="err">>
</span>
<span class="o"><</span><span class="nx">button</span> <span class="nx">onClick</span><span class="o">=</span><span class="p">{</span><span class="nx">handleStartStop</span><span class="p">}</span><span class="o">></span>
<span class="p">{</span><span class="nx">isRunning</span> <span class="p">?</span> <span class="dl">'</span><span class="s1">Stop</span><span class="dl">'</span> <span class="p">:</span> <span class="dl">'</span><span class="s1">Start</span><span class="dl">'</span><span class="p">}</span>
<span class="o"><</span><span class="sr">/button</span><span class="err">>
</span>
<span class="o"><</span><span class="nx">button</span> <span class="nx">onClick</span><span class="o">=</span><span class="p">{</span><span class="nx">handleReset</span><span class="p">}</span><span class="o">></span><span class="nx">Reset</span><span class="o"><</span><span class="sr">/button</span><span class="err">>
</span>
<span class="o"><</span><span class="nx">div</span><span class="o">></span>
<span class="o"><</span><span class="nx">input</span>
<span class="nx">ref</span><span class="o">=</span><span class="p">{</span><span class="nx">inputRef</span><span class="p">}</span>
<span class="nx">type</span><span class="o">=</span><span class="dl">"</span><span class="s2">text</span><span class="dl">"</span>
<span class="nx">placeholder</span><span class="o">=</span><span class="dl">"</span><span class="s2">Notes about this timer session...</span><span class="dl">"</span>
<span class="o">/></span>
<span class="o"><</span><span class="sr">/div</span><span class="err">>
</span> <span class="o"><</span><span class="sr">/div</span><span class="err">>
</span> <span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
<p>In this example, <code>useRef</code> serves two different purposes:</p>
<ol>
<li>
<code>timerIdRef</code> holds the interval ID, which needs to persist between renders but doesn't affect the UI.</li>
<li>
<code>inputRef</code> provides a reference to the DOM input element, allowing us to programmatically focus it.</li>
</ol>
<h2>
Performance Optimization Hooks
</h2>
<p>There are few hooks that improve the performance of your React app, you must use these hook wherever it's applicable.</p>
<h3>
useMemo: Memoizing Expensive Calculations
</h3>
<p>The <code>useMemo</code> hook helps optimize performance by memoizing expensive calculations so they only recompute when dependencies change.<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="k">import</span> <span class="nx">React</span><span class="p">,</span> <span class="p">{</span> <span class="nx">useState</span><span class="p">,</span> <span class="nx">useMemo</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">react</span><span class="dl">'</span><span class="p">;</span>
<span class="kd">function</span> <span class="nf">ExpensiveCalculation</span><span class="p">({</span> <span class="nx">numbers</span> <span class="p">})</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">filter</span><span class="p">,</span> <span class="nx">setFilter</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="dl">''</span><span class="p">);</span>
<span class="c1">// Memoize expensive calculation</span>
<span class="kd">const</span> <span class="nx">filteredAndSortedNumbers</span> <span class="o">=</span> <span class="nf">useMemo</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Computing filtered and sorted numbers...</span><span class="dl">'</span><span class="p">);</span>
<span class="c1">// Simulating expensive operation</span>
<span class="kd">const</span> <span class="nx">filtered</span> <span class="o">=</span> <span class="nx">numbers</span><span class="p">.</span><span class="nf">filter</span><span class="p">(</span><span class="nx">n</span> <span class="o">=></span>
<span class="nx">n</span><span class="p">.</span><span class="nf">toString</span><span class="p">().</span><span class="nf">includes</span><span class="p">(</span><span class="nx">filter</span><span class="p">)</span>
<span class="p">);</span>
<span class="c1">// Sort is expensive for large arrays</span>
<span class="k">return</span> <span class="p">[...</span><span class="nx">filtered</span><span class="p">].</span><span class="nf">sort</span><span class="p">((</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="o">=></span> <span class="nx">a</span> <span class="o">-</span> <span class="nx">b</span><span class="p">);</span>
<span class="p">},</span> <span class="p">[</span><span class="nx">numbers</span><span class="p">,</span> <span class="nx">filter</span><span class="p">]);</span> <span class="c1">// Only recompute when numbers or filter changes</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">div</span><span class="o">></span>
<span class="o"><</span><span class="nx">input</span>
<span class="nx">value</span><span class="o">=</span><span class="p">{</span><span class="nx">filter</span><span class="p">}</span>
<span class="nx">onChange</span><span class="o">=</span><span class="p">{</span><span class="nx">e</span> <span class="o">=></span> <span class="nf">setFilter</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">value</span><span class="p">)}</span>
<span class="nx">placeholder</span><span class="o">=</span><span class="dl">"</span><span class="s2">Filter numbers...</span><span class="dl">"</span>
<span class="o">/></span>
<span class="o"><</span><span class="nx">h3</span><span class="o">></span><span class="nx">Filtered</span> <span class="nx">and</span> <span class="nx">Sorted</span> <span class="nx">Numbers</span><span class="p">:</span><span class="o"><</span><span class="sr">/h3</span><span class="err">>
</span>
<span class="o"><</span><span class="nx">ul</span><span class="o">></span>
<span class="p">{</span><span class="nx">filteredAndSortedNumbers</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="nx">n</span> <span class="o">=></span> <span class="p">(</span>
<span class="o"><</span><span class="nx">li</span> <span class="nx">key</span><span class="o">=</span><span class="p">{</span><span class="nx">n</span><span class="p">}</span><span class="o">></span><span class="p">{</span><span class="nx">n</span><span class="p">}</span><span class="o"><</span><span class="sr">/li</span><span class="err">>
</span> <span class="p">))}</span>
<span class="o"><</span><span class="sr">/ul</span><span class="err">>
</span>
<span class="o"><</span><span class="sr">/div</span><span class="err">>
</span> <span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
<p>This optimization is particularly valuable for:</p>
<ul>
<li>Expensive calculations that don't need to be recalculated on every render</li>
<li>Preventing unnecessary re-renders of child components that rely on computed values</li>
</ul>
<h3>
useCallback: Memoizing Functions
</h3>
<p>The <code>useCallback</code> hook memoizes function definitions, which is useful when passing callbacks to optimized child components that rely on reference equality to prevent unnecessary renders.<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="k">import</span> <span class="nx">React</span><span class="p">,</span> <span class="p">{</span> <span class="nx">useState</span><span class="p">,</span> <span class="nx">useCallback</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">react</span><span class="dl">'</span><span class="p">;</span>
<span class="c1">// Child component that uses React.memo</span>
<span class="kd">const</span> <span class="nx">ItemList</span> <span class="o">=</span> <span class="nx">React</span><span class="p">.</span><span class="nf">memo</span><span class="p">(({</span> <span class="nx">items</span><span class="p">,</span> <span class="nx">onItemClick</span> <span class="p">})</span> <span class="o">=></span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">ItemList rendered</span><span class="dl">'</span><span class="p">);</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">ul</span><span class="o">></span>
<span class="p">{</span><span class="nx">items</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="nx">item</span> <span class="o">=></span> <span class="p">(</span>
<span class="o"><</span><span class="nx">li</span> <span class="nx">key</span><span class="o">=</span><span class="p">{</span><span class="nx">item</span><span class="p">.</span><span class="nx">id</span><span class="p">}</span> <span class="nx">onClick</span><span class="o">=</span><span class="p">{()</span> <span class="o">=></span> <span class="nf">onItemClick</span><span class="p">(</span><span class="nx">item</span><span class="p">.</span><span class="nx">id</span><span class="p">)}</span><span class="o">></span>
<span class="p">{</span><span class="nx">item</span><span class="p">.</span><span class="nx">name</span><span class="p">}</span>
<span class="o"><</span><span class="sr">/li</span><span class="err">>
</span> <span class="p">))}</span>
<span class="o"><</span><span class="sr">/ul</span><span class="err">>
</span> <span class="p">);</span>
<span class="p">});</span>
<span class="kd">function</span> <span class="nf">ShoppingList</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">items</span><span class="p">,</span> <span class="nx">setItems</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">([</span>
<span class="p">{</span> <span class="na">id</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">name</span><span class="p">:</span> <span class="dl">'</span><span class="s1">Apples</span><span class="dl">'</span> <span class="p">},</span>
<span class="p">{</span> <span class="na">id</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="na">name</span><span class="p">:</span> <span class="dl">'</span><span class="s1">Bananas</span><span class="dl">'</span> <span class="p">},</span>
<span class="p">{</span> <span class="na">id</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="na">name</span><span class="p">:</span> <span class="dl">'</span><span class="s1">Cherries</span><span class="dl">'</span> <span class="p">}</span>
<span class="p">]);</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">selectedId</span><span class="p">,</span> <span class="nx">setSelectedId</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
<span class="c1">// Without useCallback, this function would be recreated on every render</span>
<span class="c1">// causing ItemList to re-render unnecessarily</span>
<span class="kd">const</span> <span class="nx">handleItemClick</span> <span class="o">=</span> <span class="nf">useCallback</span><span class="p">((</span><span class="nx">id</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
<span class="nf">setSelectedId</span><span class="p">(</span><span class="nx">id</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Item </span><span class="p">${</span><span class="nx">id</span><span class="p">}</span><span class="s2"> selected`</span><span class="p">);</span>
<span class="p">},</span> <span class="p">[]);</span> <span class="c1">// Empty dependency array means this function only changes if dependencies change</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">div</span><span class="o">></span>
<span class="o"><</span><span class="nx">h2</span><span class="o">></span><span class="nx">Shopping</span> <span class="nx">List</span><span class="o"><</span><span class="sr">/h2</span><span class="err">>
</span> <span class="o"><</span><span class="nx">ItemList</span> <span class="nx">items</span><span class="o">=</span><span class="p">{</span><span class="nx">items</span><span class="p">}</span> <span class="nx">onItemClick</span><span class="o">=</span><span class="p">{</span><span class="nx">handleItemClick</span><span class="p">}</span> <span class="sr">/</span><span class="err">>
</span> <span class="p">{</span><span class="nx">selectedId</span> <span class="o">&&</span> <span class="o"><</span><span class="nx">p</span><span class="o">></span><span class="nx">You</span> <span class="nx">selected</span> <span class="nx">item</span> <span class="kd">with</span> <span class="nx">ID</span><span class="p">:</span> <span class="p">{</span><span class="nx">selectedId</span><span class="p">}</span><span class="o"><</span><span class="sr">/p></span><span class="err">}
</span> <span class="o"><</span><span class="sr">/div</span><span class="err">>
</span>
<span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
<p>The <code>useCallback</code> hook is essential when:</p>
<ul>
<li>Passing callbacks to optimized child components using <code>React.memo</code>
</li>
<li>Creating event handlers that depend on props or state</li>
<li>Working with custom hooks that rely on function equality</li>
</ul>
<h2>
Building Custom Hooks
</h2>
<p>One of the most powerful features of <strong>React Hooks</strong> is the ability to create custom hooks, allowing you to extract component logic into reusable functions.<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="k">import</span> <span class="p">{</span> <span class="nx">useState</span><span class="p">,</span> <span class="nx">useEffect</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">react</span><span class="dl">'</span><span class="p">;</span>
<span class="c1">// Custom hook for window dimensions</span>
<span class="kd">function</span> <span class="nf">useWindowSize</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">windowSize</span><span class="p">,</span> <span class="nx">setWindowSize</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">({</span>
<span class="na">width</span><span class="p">:</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerWidth</span><span class="p">,</span>
<span class="na">height</span><span class="p">:</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerHeight</span>
<span class="p">});</span>
<span class="nf">useEffect</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">handleResize</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="nf">setWindowSize</span><span class="p">({</span>
<span class="na">width</span><span class="p">:</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerWidth</span><span class="p">,</span>
<span class="na">height</span><span class="p">:</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerHeight</span>
<span class="p">});</span>
<span class="p">};</span>
<span class="c1">// Add event listener</span>
<span class="nb">window</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">resize</span><span class="dl">'</span><span class="p">,</span> <span class="nx">handleResize</span><span class="p">);</span>
<span class="c1">// Clean up</span>
<span class="k">return </span><span class="p">()</span> <span class="o">=></span> <span class="nb">window</span><span class="p">.</span><span class="nf">removeEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">resize</span><span class="dl">'</span><span class="p">,</span> <span class="nx">handleResize</span><span class="p">);</span>
<span class="p">},</span> <span class="p">[]);</span> <span class="c1">// Empty array means only run on mount and unmount</span>
<span class="k">return</span> <span class="nx">windowSize</span><span class="p">;</span>
<span class="p">}</span>
</code></pre>
</div>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="c1">// Using the above custom hook</span>
<span class="kd">function</span> <span class="nf">ResponsiveComponent</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">size</span> <span class="o">=</span> <span class="nf">useWindowSize</span><span class="p">();</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">div</span><span class="o">></span>
<span class="o"><</span><span class="nx">h2</span><span class="o">></span><span class="nx">Window</span> <span class="nx">Size</span><span class="p">:</span><span class="o"><</span><span class="sr">/h2</span><span class="err">>
</span> <span class="o"><</span><span class="nx">p</span><span class="o">></span><span class="nx">Width</span><span class="p">:</span> <span class="p">{</span><span class="nx">size</span><span class="p">.</span><span class="nx">width</span><span class="p">}</span><span class="nx">px</span><span class="p">,</span> <span class="nx">Height</span><span class="p">:</span> <span class="p">{</span><span class="nx">size</span><span class="p">.</span><span class="nx">height</span><span class="p">}</span><span class="nx">px</span><span class="o"><</span><span class="sr">/p</span><span class="err">>
</span> <span class="p">{</span><span class="nx">size</span><span class="p">.</span><span class="nx">width</span> <span class="o"><</span> <span class="mi">768</span> <span class="p">?</span> <span class="p">(</span>
<span class="o"><</span><span class="nx">p</span><span class="o">></span><span class="nx">Mobile</span> <span class="nx">view</span><span class="o"><</span><span class="sr">/p</span><span class="err">>
</span> <span class="p">)</span> <span class="p">:</span> <span class="p">(</span>
<span class="o"><</span><span class="nx">p</span><span class="o">></span><span class="nx">Desktop</span> <span class="nx">view</span><span class="o"><</span><span class="sr">/p</span><span class="err">>
</span> <span class="p">)}</span>
<span class="o"><</span><span class="sr">/div</span><span class="err">>
</span> <span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
<h3>
More Custom Hook Examples
</h3>
<p>Here are a few more examples of useful custom hooks:</p>
<h4>
1. useFetch: Simplified Data Fetching
</h4>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="kd">function</span> <span class="nf">useFetch</span><span class="p">(</span><span class="nx">url</span><span class="p">,</span> <span class="nx">options</span> <span class="o">=</span> <span class="p">{})</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">data</span><span class="p">,</span> <span class="nx">setData</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">loading</span><span class="p">,</span> <span class="nx">setLoading</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">error</span><span class="p">,</span> <span class="nx">setError</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
<span class="nf">useEffect</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="kd">let</span> <span class="nx">isMounted</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">controller</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">AbortController</span><span class="p">();</span>
<span class="kd">const</span> <span class="nx">fetchData</span> <span class="o">=</span> <span class="k">async </span><span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="k">try</span> <span class="p">{</span>
<span class="nf">setLoading</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">response</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">fetch</span><span class="p">(</span><span class="nx">url</span><span class="p">,</span> <span class="p">{</span>
<span class="p">...</span><span class="nx">options</span><span class="p">,</span>
<span class="na">signal</span><span class="p">:</span> <span class="nx">controller</span><span class="p">.</span><span class="nx">signal</span>
<span class="p">});</span>
<span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">response</span><span class="p">.</span><span class="nx">ok</span><span class="p">)</span> <span class="p">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nc">Error</span><span class="p">(</span><span class="s2">`HTTP error! Status: </span><span class="p">${</span><span class="nx">response</span><span class="p">.</span><span class="nx">status</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
<span class="p">}</span>
<span class="kd">const</span> <span class="nx">result</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">response</span><span class="p">.</span><span class="nf">json</span><span class="p">();</span>
<span class="k">if </span><span class="p">(</span><span class="nx">isMounted</span><span class="p">)</span> <span class="p">{</span>
<span class="nf">setData</span><span class="p">(</span><span class="nx">result</span><span class="p">);</span>
<span class="nf">setError</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span> <span class="k">catch </span><span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if </span><span class="p">(</span><span class="nx">isMounted</span> <span class="o">&&</span> <span class="nx">err</span><span class="p">.</span><span class="nx">name</span> <span class="o">!==</span> <span class="dl">'</span><span class="s1">AbortError</span><span class="dl">'</span><span class="p">)</span> <span class="p">{</span>
<span class="nf">setError</span><span class="p">(</span><span class="nx">err</span><span class="p">.</span><span class="nx">message</span><span class="p">);</span>
<span class="nf">setData</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span> <span class="k">finally</span> <span class="p">{</span>
<span class="k">if </span><span class="p">(</span><span class="nx">isMounted</span><span class="p">)</span> <span class="nf">setLoading</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="nf">fetchData</span><span class="p">();</span>
<span class="c1">// Cleanup</span>
<span class="k">return </span><span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="nx">isMounted</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
<span class="nx">controller</span><span class="p">.</span><span class="nf">abort</span><span class="p">();</span>
<span class="p">};</span>
<span class="p">},</span> <span class="p">[</span><span class="nx">url</span><span class="p">,</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">stringify</span><span class="p">(</span><span class="nx">options</span><span class="p">)]);</span>
<span class="k">return</span> <span class="p">{</span> <span class="nx">data</span><span class="p">,</span> <span class="nx">loading</span><span class="p">,</span> <span class="nx">error</span> <span class="p">};</span>
<span class="p">}</span>
</code></pre>
</div>
<h4>
2. useLocalStorage: Persistent State
</h4>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="kd">function</span> <span class="nf">useLocalStorage</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span> <span class="nx">initialValue</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// Get from local storage then parse</span>
<span class="kd">const</span> <span class="nx">getStoredValue</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="k">try</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">item</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">localStorage</span><span class="p">.</span><span class="nf">getItem</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
<span class="k">return</span> <span class="nx">item</span> <span class="p">?</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">parse</span><span class="p">(</span><span class="nx">item</span><span class="p">)</span> <span class="p">:</span> <span class="nx">initialValue</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">catch </span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="s2">`Error reading localStorage key "</span><span class="p">${</span><span class="nx">key</span><span class="p">}</span><span class="s2">":`</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
<span class="k">return</span> <span class="nx">initialValue</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="c1">// State to store our value</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">storedValue</span><span class="p">,</span> <span class="nx">setStoredValue</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="nx">getStoredValue</span><span class="p">);</span>
<span class="c1">// Return a wrapped version of useState's setter function that</span>
<span class="c1">// persists the new value to localStorage</span>
<span class="kd">const</span> <span class="nx">setValue</span> <span class="o">=</span> <span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
<span class="k">try</span> <span class="p">{</span>
<span class="c1">// Allow value to be a function like in useState</span>
<span class="kd">const</span> <span class="nx">valueToStore</span> <span class="o">=</span> <span class="nx">value</span> <span class="k">instanceof</span> <span class="nb">Function</span> <span class="p">?</span> <span class="nf">value</span><span class="p">(</span><span class="nx">storedValue</span><span class="p">)</span> <span class="p">:</span> <span class="nx">value</span><span class="p">;</span>
<span class="c1">// Save state</span>
<span class="nf">setStoredValue</span><span class="p">(</span><span class="nx">valueToStore</span><span class="p">);</span>
<span class="c1">// Save to localStorage</span>
<span class="nb">window</span><span class="p">.</span><span class="nx">localStorage</span><span class="p">.</span><span class="nf">setItem</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">stringify</span><span class="p">(</span><span class="nx">valueToStore</span><span class="p">));</span>
<span class="p">}</span> <span class="k">catch </span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="s2">`Error setting localStorage key "</span><span class="p">${</span><span class="nx">key</span><span class="p">}</span><span class="s2">":`</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="k">return</span> <span class="p">[</span><span class="nx">storedValue</span><span class="p">,</span> <span class="nx">setValue</span><span class="p">];</span>
<span class="p">}</span>
</code></pre>
</div>
<h2>
React Hooks Best Practices in 2025
</h2>
<p>Over the years, the React community has established solid best practices for working with hooks. Here are some key recommendations:</p>
<h3>
1. Rules of Hooks
</h3>
<p>We already learned the top 2 rules at the beginning of this article. You should Always follow the <a href="proxy.php?url=https://react.dev/reference/rules/rules-of-hooks" rel="noopener noreferrer">Rules of Hooks</a>:</p>
<ul>
<li>Only call hooks at the top level of your React functions</li>
<li>Don't call hooks inside loops, conditions, or nested functions</li>
<li>Only call hooks from React function components or custom hooks</li>
</ul>
<h3>
2. Keep Related Logic Together
</h3>
<p>Use hooks to organize related logic together, rather than splitting it across different lifecycle methods as in class components.<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="c1">// Prefer this</span>
<span class="kd">function</span> <span class="nf">UserProfile</span><span class="p">({</span> <span class="nx">userId</span> <span class="p">})</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">{</span> <span class="nx">data</span><span class="p">,</span> <span class="nx">loading</span> <span class="p">}</span> <span class="o">=</span> <span class="nf">useFetch</span><span class="p">(</span><span class="s2">`/api/users/</span><span class="p">${</span><span class="nx">userId</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
<span class="kd">const</span> <span class="p">{</span> <span class="nx">settings</span><span class="p">,</span> <span class="nx">updateSettings</span> <span class="p">}</span> <span class="o">=</span> <span class="nf">useUserSettings</span><span class="p">(</span><span class="nx">userId</span><span class="p">);</span>
<span class="c1">// All user-related logic stays together</span>
<span class="c1">// ...</span>
<span class="p">}</span>
<span class="c1">// Instead of spreading across lifecycle methods like in class components</span>
</code></pre>
</div>
<h3>
3. Create Custom Hooks for Reusable Logic
</h3>
<p>Extract logic into custom hooks when it's used across multiple components:</p>
<ul>
<li>Without custom hook (repeated in multiple components):
</li>
</ul>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="kd">function</span> <span class="nf">Component1</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">isOnline</span><span class="p">,</span> <span class="nx">setIsOnline</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="nb">navigator</span><span class="p">.</span><span class="nx">onLine</span><span class="p">);</span>
<span class="nf">useEffect</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">handleOnline</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="nf">setIsOnline</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">handleOffline</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="nf">setIsOnline</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
<span class="nb">window</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">online</span><span class="dl">'</span><span class="p">,</span> <span class="nx">handleOnline</span><span class="p">);</span>
<span class="nb">window</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">offline</span><span class="dl">'</span><span class="p">,</span> <span class="nx">handleOffline</span><span class="p">);</span>
<span class="k">return </span><span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="nb">window</span><span class="p">.</span><span class="nf">removeEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">online</span><span class="dl">'</span><span class="p">,</span> <span class="nx">handleOnline</span><span class="p">);</span>
<span class="nb">window</span><span class="p">.</span><span class="nf">removeEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">offline</span><span class="dl">'</span><span class="p">,</span> <span class="nx">handleOffline</span><span class="p">);</span>
<span class="p">};</span>
<span class="p">},</span> <span class="p">[]);</span>
<span class="c1">// ...</span>
<span class="p">}</span>
</code></pre>
</div>
<ul>
<li>With custom hook:
</li>
</ul>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="kd">function</span> <span class="nf">useOnlineStatus</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">isOnline</span><span class="p">,</span> <span class="nx">setIsOnline</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="nb">navigator</span><span class="p">.</span><span class="nx">onLine</span><span class="p">);</span>
<span class="nf">useEffect</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">handleOnline</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="nf">setIsOnline</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">handleOffline</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="nf">setIsOnline</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
<span class="nb">window</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">online</span><span class="dl">'</span><span class="p">,</span> <span class="nx">handleOnline</span><span class="p">);</span>
<span class="nb">window</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">offline</span><span class="dl">'</span><span class="p">,</span> <span class="nx">handleOffline</span><span class="p">);</span>
<span class="k">return </span><span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="nb">window</span><span class="p">.</span><span class="nf">removeEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">online</span><span class="dl">'</span><span class="p">,</span> <span class="nx">handleOnline</span><span class="p">);</span>
<span class="nb">window</span><span class="p">.</span><span class="nf">removeEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">offline</span><span class="dl">'</span><span class="p">,</span> <span class="nx">handleOffline</span><span class="p">);</span>
<span class="p">};</span>
<span class="p">},</span> <span class="p">[]);</span>
<span class="k">return</span> <span class="nx">isOnline</span><span class="p">;</span>
<span class="p">}</span>
</code></pre>
</div>
<ul>
<li>Now usage is simple in any component:
</li>
</ul>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="kd">function</span> <span class="nf">Component1</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">isOnline</span> <span class="o">=</span> <span class="nf">useOnlineStatus</span><span class="p">();</span>
<span class="c1">// ...</span>
<span class="p">}</span>
</code></pre>
</div>
<h3>
4. Optimize Expensive Calculations with useMemo and useCallback
</h3>
<p>Use <code>useMemo</code> for expensive computations and <code>useCallback</code> for function memoization, but don't overuse them for simple operations.</p>
<h3>
5. Manage Complex State with useReducer
</h3>
<p>For complex state logic, prefer <code>useReducer</code> over multiple <code>useState</code> calls:</p>
<ul>
<li>Instead of multiple useState calls:
</li>
</ul>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="kd">function</span> <span class="nf">ComplexForm</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">name</span><span class="p">,</span> <span class="nx">setName</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="dl">''</span><span class="p">);</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">email</span><span class="p">,</span> <span class="nx">setEmail</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="dl">''</span><span class="p">);</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">password</span><span class="p">,</span> <span class="nx">setPassword</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="dl">''</span><span class="p">);</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">errors</span><span class="p">,</span> <span class="nx">setErrors</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">({});</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">isSubmitting</span><span class="p">,</span> <span class="nx">setIsSubmitting</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">isSuccess</span><span class="p">,</span> <span class="nx">setIsSuccess</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
<span class="c1">// Many handlers that update different pieces of state</span>
<span class="c1">// ...</span>
<span class="p">}</span>
</code></pre>
</div>
<ul>
<li>Prefer useReducer for complex state:
</li>
</ul>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="kd">function</span> <span class="nf">formReducer</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span> <span class="nx">action</span><span class="p">)</span> <span class="p">{</span>
<span class="k">switch </span><span class="p">(</span><span class="nx">action</span><span class="p">.</span><span class="nx">type</span><span class="p">)</span> <span class="p">{</span>
<span class="k">case</span> <span class="dl">'</span><span class="s1">UPDATE_FIELD</span><span class="dl">'</span><span class="p">:</span>
<span class="k">return</span> <span class="p">{</span> <span class="p">...</span><span class="nx">state</span><span class="p">,</span> <span class="p">[</span><span class="nx">action</span><span class="p">.</span><span class="nx">field</span><span class="p">]:</span> <span class="nx">action</span><span class="p">.</span><span class="nx">value</span> <span class="p">};</span>
<span class="k">case</span> <span class="dl">'</span><span class="s1">SET_ERRORS</span><span class="dl">'</span><span class="p">:</span>
<span class="k">return</span> <span class="p">{</span> <span class="p">...</span><span class="nx">state</span><span class="p">,</span> <span class="na">errors</span><span class="p">:</span> <span class="nx">action</span><span class="p">.</span><span class="nx">errors</span> <span class="p">};</span>
<span class="k">case</span> <span class="dl">'</span><span class="s1">START_SUBMIT</span><span class="dl">'</span><span class="p">:</span>
<span class="k">return</span> <span class="p">{</span> <span class="p">...</span><span class="nx">state</span><span class="p">,</span> <span class="na">isSubmitting</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span> <span class="na">isSuccess</span><span class="p">:</span> <span class="kc">false</span> <span class="p">};</span>
<span class="k">case</span> <span class="dl">'</span><span class="s1">SUBMIT_SUCCESS</span><span class="dl">'</span><span class="p">:</span>
<span class="k">return</span> <span class="p">{</span> <span class="p">...</span><span class="nx">state</span><span class="p">,</span> <span class="na">isSubmitting</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span> <span class="na">isSuccess</span><span class="p">:</span> <span class="kc">true</span> <span class="p">};</span>
<span class="c1">// ...other cases</span>
<span class="nl">default</span><span class="p">:</span>
<span class="k">return</span> <span class="nx">state</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kd">function</span> <span class="nf">ComplexForm</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">state</span><span class="p">,</span> <span class="nx">dispatch</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useReducer</span><span class="p">(</span><span class="nx">formReducer</span><span class="p">,</span> <span class="p">{</span>
<span class="na">name</span><span class="p">:</span> <span class="dl">''</span><span class="p">,</span>
<span class="na">email</span><span class="p">:</span> <span class="dl">''</span><span class="p">,</span>
<span class="na">password</span><span class="p">:</span> <span class="dl">''</span><span class="p">,</span>
<span class="na">errors</span><span class="p">:</span> <span class="p">{},</span>
<span class="na">isSubmitting</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
<span class="na">isSuccess</span><span class="p">:</span> <span class="kc">false</span>
<span class="p">});</span>
<span class="c1">// Unified state management with actions</span>
<span class="c1">// ...</span>
<span class="p">}</span>
</code></pre>
</div>
<h3>
6. Separate Data Fetching from UI
</h3>
<p>Extract data fetching logic into custom hooks to keep components focused on UI rendering:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="c1">// Custom hook for data fetching</span>
<span class="kd">function</span> <span class="nf">useUser</span><span class="p">(</span><span class="nx">userId</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">user</span><span class="p">,</span> <span class="nx">setUser</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">loading</span><span class="p">,</span> <span class="nx">setLoading</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">error</span><span class="p">,</span> <span class="nx">setError</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
<span class="nf">useEffect</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="c1">// Fetching logic...</span>
<span class="p">},</span> <span class="p">[</span><span class="nx">userId</span><span class="p">]);</span>
<span class="k">return</span> <span class="p">{</span> <span class="nx">user</span><span class="p">,</span> <span class="nx">loading</span><span class="p">,</span> <span class="nx">error</span> <span class="p">};</span>
<span class="p">}</span>
<span class="c1">// Component focused on UI</span>
<span class="kd">function</span> <span class="nf">UserProfile</span><span class="p">({</span> <span class="nx">userId</span> <span class="p">})</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">{</span> <span class="nx">user</span><span class="p">,</span> <span class="nx">loading</span><span class="p">,</span> <span class="nx">error</span> <span class="p">}</span> <span class="o">=</span> <span class="nf">useUser</span><span class="p">(</span><span class="nx">userId</span><span class="p">);</span>
<span class="k">if </span><span class="p">(</span><span class="nx">loading</span><span class="p">)</span> <span class="k">return</span> <span class="o"><</span><span class="nx">Spinner</span> <span class="o">/></span><span class="p">;</span>
<span class="k">if </span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="k">return</span> <span class="o"><</span><span class="nx">ErrorMessage</span> <span class="nx">error</span><span class="o">=</span><span class="p">{</span><span class="nx">error</span><span class="p">}</span> <span class="sr">/></span><span class="err">;
</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">div</span><span class="o">></span>
<span class="o"><</span><span class="nx">h2</span><span class="o">></span><span class="p">{</span><span class="nx">user</span><span class="p">.</span><span class="nx">name</span><span class="p">}</span><span class="o"><</span><span class="sr">/h2</span><span class="err">>
</span> <span class="p">{</span><span class="cm">/* Other UI elements */</span><span class="p">}</span>
<span class="o"><</span><span class="sr">/div</span><span class="err">>
</span> <span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
<h2>
Advanced Hook Patterns
</h2>
<p>As you become more familiar with basic hooks like <code>useState</code>, <code>useEffect</code>, and <code>useContext</code>, you can explore <strong>advanced hook patterns</strong> that enable better organization, reusability, and more scalable code. These patterns allow you to compose, share, and manage logic in ways that enhance the readability and maintainability of your application.</p>
<h3>
Composition of Hooks
</h3>
<p>Compose multiple hooks together to create more powerful abstractions:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="kd">function</span> <span class="nf">useUserDataWithStatus</span><span class="p">(</span><span class="nx">userId</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">{</span> <span class="na">data</span><span class="p">:</span> <span class="nx">user</span><span class="p">,</span> <span class="na">loading</span><span class="p">:</span> <span class="nx">userLoading</span><span class="p">,</span> <span class="na">error</span><span class="p">:</span> <span class="nx">userError</span> <span class="p">}</span> <span class="o">=</span> <span class="nf">useFetch</span><span class="p">(</span><span class="s2">`/api/users/</span><span class="p">${</span><span class="nx">userId</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">isOnline</span> <span class="o">=</span> <span class="nf">useOnlineStatus</span><span class="p">();</span>
<span class="k">return</span> <span class="p">{</span>
<span class="nx">user</span><span class="p">,</span>
<span class="na">loading</span><span class="p">:</span> <span class="nx">userLoading</span><span class="p">,</span>
<span class="na">error</span><span class="p">:</span> <span class="nx">userError</span><span class="p">,</span>
<span class="nx">isOnline</span>
<span class="p">};</span>
<span class="p">}</span>
</code></pre>
</div>
<h3>
Context + Reducer Pattern
</h3>
<p>Combine context and reducers for global state management:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="c1">// Create context</span>
<span class="kd">const</span> <span class="nx">AppStateContext</span> <span class="o">=</span> <span class="nf">createContext</span><span class="p">();</span>
<span class="kd">const</span> <span class="nx">AppDispatchContext</span> <span class="o">=</span> <span class="nf">createContext</span><span class="p">();</span>
<span class="c1">// Reducer function</span>
<span class="kd">function</span> <span class="nf">appReducer</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span> <span class="nx">action</span><span class="p">)</span> <span class="p">{</span>
<span class="k">switch </span><span class="p">(</span><span class="nx">action</span><span class="p">.</span><span class="nx">type</span><span class="p">)</span> <span class="p">{</span>
<span class="k">case</span> <span class="dl">'</span><span class="s1">SET_USER</span><span class="dl">'</span><span class="p">:</span>
<span class="k">return</span> <span class="p">{</span> <span class="p">...</span><span class="nx">state</span><span class="p">,</span> <span class="na">user</span><span class="p">:</span> <span class="nx">action</span><span class="p">.</span><span class="nx">payload</span> <span class="p">};</span>
<span class="k">case</span> <span class="dl">'</span><span class="s1">TOGGLE_THEME</span><span class="dl">'</span><span class="p">:</span>
<span class="k">return</span> <span class="p">{</span> <span class="p">...</span><span class="nx">state</span><span class="p">,</span> <span class="na">darkMode</span><span class="p">:</span> <span class="o">!</span><span class="nx">state</span><span class="p">.</span><span class="nx">darkMode</span> <span class="p">};</span>
<span class="c1">// other cases</span>
<span class="nl">default</span><span class="p">:</span>
<span class="k">return</span> <span class="nx">state</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="c1">// Provider component</span>
<span class="kd">function</span> <span class="nf">AppProvider</span><span class="p">({</span> <span class="nx">children</span> <span class="p">})</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">state</span><span class="p">,</span> <span class="nx">dispatch</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useReducer</span><span class="p">(</span><span class="nx">appReducer</span><span class="p">,</span> <span class="p">{</span>
<span class="na">user</span><span class="p">:</span> <span class="kc">null</span><span class="p">,</span>
<span class="na">darkMode</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
<span class="c1">// other global state</span>
<span class="p">});</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">AppStateContext</span><span class="p">.</span><span class="nx">Provider</span> <span class="nx">value</span><span class="o">=</span><span class="p">{</span><span class="nx">state</span><span class="p">}</span><span class="o">></span>
<span class="o"><</span><span class="nx">AppDispatchContext</span><span class="p">.</span><span class="nx">Provider</span> <span class="nx">value</span><span class="o">=</span><span class="p">{</span><span class="nx">dispatch</span><span class="p">}</span><span class="o">></span>
<span class="p">{</span><span class="nx">children</span><span class="p">}</span>
<span class="o"><</span><span class="sr">/AppDispatchContext.Provider</span><span class="err">>
</span> <span class="o"><</span><span class="sr">/AppStateContext.Provider</span><span class="err">>
</span> <span class="p">);</span>
<span class="p">}</span>
<span class="c1">// Custom hooks to use the context</span>
<span class="kd">function</span> <span class="nf">useAppState</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">context</span> <span class="o">=</span> <span class="nf">useContext</span><span class="p">(</span><span class="nx">AppStateContext</span><span class="p">);</span>
<span class="k">if </span><span class="p">(</span><span class="nx">context</span> <span class="o">===</span> <span class="kc">undefined</span><span class="p">)</span> <span class="p">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nc">Error</span><span class="p">(</span><span class="dl">'</span><span class="s1">useAppState must be used within an AppProvider</span><span class="dl">'</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nx">context</span><span class="p">;</span>
<span class="p">}</span>
<span class="kd">function</span> <span class="nf">useAppDispatch</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">context</span> <span class="o">=</span> <span class="nf">useContext</span><span class="p">(</span><span class="nx">AppDispatchContext</span><span class="p">);</span>
<span class="k">if </span><span class="p">(</span><span class="nx">context</span> <span class="o">===</span> <span class="kc">undefined</span><span class="p">)</span> <span class="p">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nc">Error</span><span class="p">(</span><span class="dl">'</span><span class="s1">useAppDispatch must be used within an AppProvider</span><span class="dl">'</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nx">context</span><span class="p">;</span>
<span class="p">}</span>
</code></pre>
</div>
<p>This pattern provides a lightweight alternative to <a href="proxy.php?url=https://devdreaming.com/blogs/category/redux" rel="noopener noreferrer">Redux</a> for many applications.</p>
<h2>
React Hooks in 2025: What's New?
</h2>
<p>As React continues to evolve, several enhancements have been made to hooks in recent years:</p>
<h3>
Improved Performance
</h3>
<p>The React team has continuously optimized the internals of hooks for better performance:</p>
<ul>
<li>Reduced overhead for each hook call</li>
<li>Better batching of state updates</li>
<li>Improved memory usage patterns</li>
</ul>
<h3>
Enhanced DevTools Support
</h3>
<p>React DevTools now provide better debugging support for hooks:</p>
<ul>
<li>Inspect hook values during development</li>
<li>Track which components are causing re-renders</li>
<li>View dependency arrays and their changes</li>
</ul>
<h3>
Integration with Concurrent Mode
</h3>
<p>Hooks work seamlessly with React's Concurrent Mode features:</p>
<ul>
<li>Suspense for data fetching</li>
<li>Transitions for state updates</li>
<li>Prioritization of different updates</li>
</ul>
<h3>
TypeScript Improvements
</h3>
<p>TypeScript integration with hooks has improved dramatically:</p>
<ul>
<li>Better type inference for hook return values</li>
<li>Enhanced autocomplete for hook parameters</li>
<li>Stricter typing for custom hooks</li>
</ul>
<h2>
Common Challenges and Solutions
</h2>
<h3>
1. Why Does My useEffect Hook Keep Running Infinitely?
</h3>
<p>A common issue is creating infinite loops with <code>useEffect</code>:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="c1">// Problematic code</span>
<span class="kd">function</span> <span class="nf">SearchComponent</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">query</span><span class="p">,</span> <span class="nx">setQuery</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="dl">''</span><span class="p">);</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">results</span><span class="p">,</span> <span class="nx">setResults</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">([]);</span>
<span class="c1">// This creates an infinite loop!</span>
<span class="nf">useEffect</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="nf">fetchResults</span><span class="p">(</span><span class="nx">query</span><span class="p">).</span><span class="nf">then</span><span class="p">(</span><span class="nx">data</span> <span class="o">=></span> <span class="nf">setResults</span><span class="p">(</span><span class="nx">data</span><span class="p">));</span>
<span class="p">},</span> <span class="p">[</span><span class="nx">results</span><span class="p">]);</span> <span class="c1">// results change triggers effect, which updates results!</span>
<span class="c1">// ...</span>
<span class="p">}</span>
</code></pre>
</div>
<p><strong>Solution:</strong> Ensure your dependency array only includes values that, when changed, should trigger the effect:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="c1">// Fixed code</span>
<span class="nf">useEffect</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="nf">fetchResults</span><span class="p">(</span><span class="nx">query</span><span class="p">).</span><span class="nf">then</span><span class="p">(</span><span class="nx">data</span> <span class="o">=></span> <span class="nf">setResults</span><span class="p">(</span><span class="nx">data</span><span class="p">));</span>
<span class="p">},</span> <span class="p">[</span><span class="nx">query</span><span class="p">]);</span> <span class="c1">// Only refetch when query changes</span>
</code></pre>
</div>
<h3>
2. Why Isn't My State Updating Correctly in React Hooks?
</h3>
<p>Closures in JavaScript can lead to stale state in event handlers:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="kd">function</span> <span class="nf">Timer</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">count</span><span class="p">,</span> <span class="nx">setCount</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="nf">useEffect</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">timer</span> <span class="o">=</span> <span class="nf">setInterval</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="c1">// This uses the initial count value (0) in the closure</span>
<span class="nf">setCount</span><span class="p">(</span><span class="nx">count</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
<span class="p">},</span> <span class="mi">1000</span><span class="p">);</span>
<span class="k">return </span><span class="p">()</span> <span class="o">=></span> <span class="nf">clearInterval</span><span class="p">(</span><span class="nx">timer</span><span class="p">);</span>
<span class="p">},</span> <span class="p">[]);</span> <span class="c1">// Empty deps array means this only runs on mount</span>
<span class="c1">// count will only ever be 1!</span>
<span class="p">}</span>
</code></pre>
</div>
<p><strong>Solution:</strong> Use the functional update form of state setters:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="nf">useEffect</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">timer</span> <span class="o">=</span> <span class="nf">setInterval</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="c1">// This always uses the latest count value</span>
<span class="nf">setCount</span><span class="p">(</span><span class="nx">prevCount</span> <span class="o">=></span> <span class="nx">prevCount</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
<span class="p">},</span> <span class="mi">1000</span><span class="p">);</span>
<span class="k">return </span><span class="p">()</span> <span class="o">=></span> <span class="nf">clearInterval</span><span class="p">(</span><span class="nx">timer</span><span class="p">);</span>
<span class="p">},</span> <span class="p">[]);</span>
</code></pre>
</div>
<h3>
3. Do I Need useMemo and useCallback for Everything in React?
</h3>
<p>A common mistake is wrapping everything in <code>useMemo</code> and <code>useCallback</code>:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="c1">// Excessive optimization</span>
<span class="kd">function</span> <span class="nf">UserList</span><span class="p">({</span> <span class="nx">users</span> <span class="p">})</span> <span class="p">{</span>
<span class="c1">// Unnecessary for simple operations</span>
<span class="kd">const</span> <span class="nx">displayUsers</span> <span class="o">=</span> <span class="nf">useMemo</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">users</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="nx">user</span> <span class="o">=></span> <span class="p">(</span>
<span class="o"><</span><span class="nx">li</span> <span class="nx">key</span><span class="o">=</span><span class="p">{</span><span class="nx">user</span><span class="p">.</span><span class="nx">id</span><span class="p">}</span><span class="o">></span><span class="p">{</span><span class="nx">user</span><span class="p">.</span><span class="nx">name</span><span class="p">}</span><span class="o"><</span><span class="sr">/li</span><span class="err">>
</span> <span class="p">));</span>
<span class="p">},</span> <span class="p">[</span><span class="nx">users</span><span class="p">]);</span>
<span class="c1">// Unnecessary for this simple function</span>
<span class="kd">const</span> <span class="nx">handleClick</span> <span class="o">=</span> <span class="nf">useCallback</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Clicked</span><span class="dl">'</span><span class="p">);</span>
<span class="p">},</span> <span class="p">[]);</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">div</span><span class="o">></span>
<span class="o"><</span><span class="nx">h2</span><span class="o">></span><span class="nx">User</span> <span class="nx">List</span><span class="o"><</span><span class="sr">/h2</span><span class="err">>
</span> <span class="o"><</span><span class="nx">ul</span><span class="o">></span><span class="p">{</span><span class="nx">displayUsers</span><span class="p">}</span><span class="o"><</span><span class="sr">/ul</span><span class="err">>
</span> <span class="o"><</span><span class="nx">button</span> <span class="nx">onClick</span><span class="o">=</span><span class="p">{</span><span class="nx">handleClick</span><span class="p">}</span><span class="o">></span><span class="nx">Click</span> <span class="nx">Me</span><span class="o"><</span><span class="sr">/button</span><span class="err">>
</span> <span class="o"><</span><span class="sr">/div</span><span class="err">>
</span> <span class="p">);</span>
<span class="p">}</span>
</code></pre>
</div>
<p><strong>Solution:</strong> Only use <code>useMemo</code> and <code>useCallback</code> when there's a clear performance benefit:</p>
<ul>
<li>For expensive calculations</li>
<li>When passing callbacks to optimized components using <code>React.memo</code>
</li>
<li>When dependencies change frequently</li>
</ul>
<h3>
4. How Do I Fix the "React Hook useEffect has a missing dependency" Warning?
</h3>
<p>Managing dependencies can be tricky:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="kd">function</span> <span class="nf">SearchComponent</span><span class="p">({</span> <span class="nx">onSearch</span><span class="p">,</span> <span class="nx">defaultQuery</span> <span class="p">})</span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">query</span><span class="p">,</span> <span class="nx">setQuery</span><span class="p">]</span> <span class="o">=</span> <span class="nf">useState</span><span class="p">(</span><span class="nx">defaultQuery</span><span class="p">);</span>
<span class="c1">// Missing dependencies</span>
<span class="nf">useEffect</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">results</span> <span class="o">=</span> <span class="nf">searchAPI</span><span class="p">(</span><span class="nx">query</span><span class="p">);</span>
<span class="nf">onSearch</span><span class="p">(</span><span class="nx">results</span><span class="p">);</span>
<span class="p">},</span> <span class="p">[]);</span> <span class="c1">// Missing dependencies: query, onSearch</span>
<span class="p">}</span>
</code></pre>
</div>
<p><strong>Solution:</strong> Use ESLint's <code>react-hooks/exhaustive-deps</code> rule and address all warnings:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>
<span class="nf">useEffect</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">results</span> <span class="o">=</span> <span class="nf">searchAPI</span><span class="p">(</span><span class="nx">query</span><span class="p">);</span>
<span class="nf">onSearch</span><span class="p">(</span><span class="nx">results</span><span class="p">);</span>
<span class="p">},</span> <span class="p">[</span><span class="nx">query</span><span class="p">,</span> <span class="nx">onSearch</span><span class="p">]);</span> <span class="c1">// All dependencies included</span>
</code></pre>
</div>
<p>If <code>onSearch</code> changes too often, consider stabilizing it with <code>useCallback</code> in the parent component.</p>
<h2>
Conclusion
</h2>
<p><strong>React Hooks</strong> have fundamentally changed how we build React applications, enabling more concise, maintainable, and reusable code. In 2025, they remain the preferred approach for managing state and side effects in React components, with ongoing improvements in performance, developer experience, and integration with other React features.</p>
<p>By mastering hooks, you can:</p>
<ul>
<li>Write more expressive and concise components</li>
<li>Easily reuse stateful logic between components</li>
<li>Organize related code together</li>
<li>Create powerful abstractions with custom hooks</li>
<li>Take advantage of the latest React features and optimizations</li>
</ul>
<p>Whether you're a beginner just starting with React or an experienced developer looking to deepen your understanding, getting comfortable with hooks is essential for modern React development. Start with the basics <code>useState</code> and <code>useEffect</code> and gradually explore more advanced hooks and patterns as you build more complex applications.</p>
<p>Remember that the true power of hooks comes not just from using them individually, but from composing them together to create elegant solutions to complex problems. Happy coding!</p>
<p>Thanks for reading this article, I hope you found it helpful. If you are interested in learning and building project using React, Redux and Next.js you can visit my YouTube channel here: <a href="proxy.php?url=https://www.youtube.com/channel/UCeYt6blRBKuNrEg_-282fSA/" rel="noopener noreferrer">CodeBucks</a></p>
<p>Here are my other article that you might like to read:</p>
<ul>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/website-performance-optimization-for-loading-website-faster" rel="noopener noreferrer">Website Performance Optimization: Proven Techniques for Faster Websites</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/how-to-build-personal-brand-as-developer-guide" rel="noopener noreferrer">How to Build a Personal Brand as a Developer: A Step-by-Step Guide</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/nextjs-seo-guide-for-higher-search-ranking" rel="noopener noreferrer">Next.js SEO Made Simple: Your Quick Start Guide to Higher Search Rankings
</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/videos/build-ai-saas-app-nextjs-supabase-replicate-stripe" rel="noopener noreferrer">How I Cloned a $1M AI SaaS Application Using Next.js, Supabase, Replicate and Stripe</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/simplify-state-management-with-reactjs-context-api" rel="noopener noreferrer">Simplify State Management with React.js Context API Tutorial</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/nextjs-smooth-scrolling-with-lenis-gsap" rel="noopener noreferrer">How to implement smooth scrolling in Next.js with Lenis and GSAP</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/how-to-get-user-location-in-react-js" rel="noopener noreferrer">How to Get User's Location in React.js</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/top-10-popular-vs-code-themes" rel="noopener noreferrer">Top 10 Popular VS Code Themes You Should Try</a></li>
</ul>
<p>💻Visit my personal blog website from here: <a href="proxy.php?url=https://devdreaming.com/" rel="noopener noreferrer">DevDreaming</a><br>
🐥Follow me on X: <a href="proxy.php?url=https://x.com/code_bucks" rel="noopener noreferrer">@code_bucks</a></p>
reactwebdevtutorialbeginnersWebsite Performance Optimization: Proven Techniques for Faster WebsitesCodeBucksMon, 24 Feb 2025 14:47:47 +0000
https://dev.to/codebucks/website-performance-optimization-proven-techniques-for-faster-websites-1ckg
https://dev.to/codebucks/website-performance-optimization-proven-techniques-for-faster-websites-1ckg<p>In the current age of AI apps, where every second counts, <strong>web performance optimization</strong> is a critical skill for delivering exceptional online experiences. A slow website doesn't just test a user's patience, it can drive them away entirely, costing businesses revenue and reputation. Research shows that 40% of users abandon a site if it takes more than 3 seconds to load, and 47% expect pages to load in 2 seconds or less. For e-commerce giants like Amazon, a mere 100ms delay translates to a 1% drop in sales.</p>
<p>In this article we'll explore everything from minimizing HTTP requests to optimizing images, CSS, JavaScript, and server-side operations, all backed by real-world examples that prove these methods work. Let's dive into the essentials of <strong>website speed</strong> and how you can transform your site into a high-performing asset.</p>
<h2>
Introduction to Web Performance Optimization
</h2>
<p><strong>Web performance optimization</strong> is the art and science of making websites load faster, run smoother, and deliver a seamless user experience. It's about reducing the time it takes for a page to become fully interactive, measured through metrics like <a href="proxy.php?url=https://web.dev/articles/ttfb" rel="noopener noreferrer">Time to First Byte (TTFB)</a>, <a href="proxy.php?url=https://web.dev/articles/fcp" rel="noopener noreferrer">First Contentful Paint (FCP)</a>, and <a href="proxy.php?url=https://web.dev/articles/tti" rel="noopener noreferrer">Time to Interactive (TTI)</a>, while ensuring the site performs well across devices and network conditions.</p>
<p>Why does it matter? Beyond user frustration, slow websites hurt your bottom line. Google considers <strong>website speed</strong> a ranking factor, meaning <a href="proxy.php?url=https://devdreaming.com/blogs/nextjs-seo-guide-for-higher-search-ranking" rel="noopener noreferrer">optimized sites climb higher in search results</a>. Faster load times also improve conversion rates and reduce bounce rates. For instance, Pinterest saw a 15% increase in search traffic and sign-ups after cutting perceived wait times by 40%, while Etsy gained a 12% revenue boost from a 150ms improvement.</p>
<p>Let's break down proven techniques to enhance <strong>website speed</strong>, addressing common pain points and answering key questions like “How do I minimize HTTP requests?” and “What's the best way to optimize images?” Let's start with one of the foundational steps: reducing HTTP requests.</p>
<h2>
Minimizing HTTP Requests
</h2>
<p>Every time a browser loads a webpage, it sends HTTP requests to fetch resources like images, scripts, and stylesheets. Too many requests slow things down, as browsers can only handle a limited number of simultaneous connections. <strong>Minimizing HTTP requests</strong> is a cornerstone of <strong>web performance optimization</strong>.</p>
<h3>
How to Minimize HTTP Requests
</h3>
<ul>
<li>
<strong>Combine Files:</strong> Merge multiple CSS or JavaScript files into one. Tools like Webpack or Gulp streamline this process, cutting down requests without changing functionality.</li>
<li>
<strong>Use CSS Sprites:</strong> Combine small images like icons or buttons into a single sprite sheet. Amazon famously uses sprites for product icons, reducing dozens of requests to just one.</li>
<li>
<strong>Implement Lazy Loading:</strong> Delay loading non-critical resources, such as images below the fold, until they're needed. The HTML loading="lazy" attribute makes this simple for images and iframes.</li>
<li>
<strong>Inline Small Resources:</strong> For tiny CSS or JavaScript snippets (under 1KB), embed them directly in the HTML to eliminate extra requests.</li>
</ul>
<p>Fewer requests mean less waiting. A site with 50 separate resources might take seconds longer to load than one with 10, especially on mobile networks. By tackling this bottleneck, you pave the way for faster rendering.</p>
<blockquote>
<p>Pro Tip: Use a tool like Chrome DevTools' Network tab to audit your site's requests and identify opportunities for consolidation.</p>
</blockquote>
<h2>
Optimizing CSS and JavaScript
</h2>
<p>CSS and JavaScript are vital to modern websites, but if they're not optimized, they can block rendering and drag down <strong>website speed</strong>. Effective <strong>CSS and JavaScript optimization</strong> ensures these assets enhance rather than hinder performance.</p>
<h3>
CSS Optimization Techniques
</h3>
<ul>
<li>
<strong>Minify CSS:</strong> Strip out comments, whitespace, and redundant code with tools like <a href="proxy.php?url=https://cssnano.github.io/cssnano/" rel="noopener noreferrer">CSSNano</a> or <a href="proxy.php?url=https://www.npmjs.com/package/clean-css" rel="noopener noreferrer">CleanCSS</a>. A 100KB stylesheet might shrink to 70KB, speeding up downloads.</li>
<li>
<strong>Extract Critical CSS:</strong> Inline the CSS needed for above-the-fold content, deferring the rest. This reduces render-blocking delays.</li>
<li>
<strong>Avoid <a class="mentioned-user" href="proxy.php?url=https://dev.to/import">@import</a>:</strong> Replace <code>@import</code> with <code><link></code> tags, as the former forces sequential loading of stylesheets.</li>
</ul>
<h3>
JavaScript Optimization Techniques
</h3>
<ul>
<li>
<strong>Minify JavaScript:</strong> Compress files with UglifyJS or Terser, removing unnecessary characters without altering functionality.</li>
<li>
<strong>Load Asynchronously:</strong> Use async or defer attributes for non-critical scripts. For example, <code><script async src="proxy.php?url=script.js"></code> lets the page render while the script downloads.</li>
<li>
<strong>Leverage Bundlers:</strong> Tools like Webpack or Rollup bundle multiple scripts into a single, optimized file, reducing requests and improving load times.</li>
</ul>
<blockquote>
<p>Twitter uses Webpack to minify and bundle JavaScript, cutting file sizes and boosting performance for millions of users. These techniques ensure scripts and styles load efficiently, keeping visitors engaged.</p>
</blockquote>
<p><a href="proxy.php?url=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%2Fcrhkfpzqxhv6sajp1gr4.png" class="article-body-image-wrapper"><img src="proxy.php?url=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%2Fcrhkfpzqxhv6sajp1gr4.png" alt="a minified CSS file versus its original, highlighting the size reduction" width="800" height="450"></a></p>
<h2>
Image Optimization
</h2>
<p>Images often account for over 50% of a webpage's total size, making <strong>image optimization</strong> a game-changer for <strong>web performance optimization</strong>. A poorly optimized image can balloon load times, while a streamlined one keeps things snappy.</p>
<h3>
Best Practices for Image Optimization
</h3>
<ul>
<li>
<strong>Compress Images:</strong> Tools like <a href="proxy.php?url=https://tinypng.com/" rel="noopener noreferrer">TinyPNG</a> or JPEGmini reduce file sizes without noticeable quality loss. A 1MB JPEG might drop to 300KB with no visible difference.</li>
<li>
<strong>Serve Correct Sizes:</strong> Resize images to match their display dimensions. A 2000px-wide banner doesn't need to load at full resolution on a 500px-wide screen.</li>
<li>
<strong>Adopt Modern Formats:</strong> Use WebP or AVIF for superior compression compared to JPEG or PNG. Add fallbacks with <code><picture></code> tags:
</li>
</ul>
<div class="highlight js-code-highlight">
<pre class="highlight html"><code><span class="nt"><picture></span>
<span class="nt"><source</span> <span class="na">srcset=</span><span class="s">"image.webp"</span> <span class="na">type=</span><span class="s">"image/webp"</span><span class="nt">></span>
<span class="nt"><img</span> <span class="na">src=</span><span class="s">"image.jpg"</span> <span class="na">alt=</span><span class="s">"Example"</span><span class="nt">></span>
<span class="nt"></picture></span>
</code></pre>
</div>
<ul>
<li>
<strong>Lazy Load Images:</strong> Defer off-screen images with loading="lazy", saving bandwidth until users scroll to them.</li>
</ul>
<p>Pinterest optimized images and implemented lazy loading, slashing bandwidth usage and improving load times for its image-heavy platform. The result? Happier users and more engagement.</p>
<blockquote>
<p>Pro Tip: Test image performance with Google's Lighthouse tool to pinpoint oversized or unoptimized assets.</p>
</blockquote>
<h2>
Server-Side Optimization
</h2>
<p>Even the best front-end optimizations can falter if the server lags. <strong>Server-side optimization</strong> reduces <strong>Time to First Byte (TTFB)</strong> and ensures rapid delivery of resources, a key component of <strong>web performance optimization</strong>.</p>
<h3>
Server-Side Optimization Strategies
</h3>
<ul>
<li>
<strong>Use a CDN:</strong> Content Delivery Networks (CDNs) like Cloudflare or Akamai cache content on global servers, reducing latency by serving files from locations closer to users.</li>
<li>
<strong>Optimize Databases:</strong> Index slow queries and cache results with tools like Redis or Memcached. A well-tuned database can cut response times from seconds to milliseconds.</li>
<li>
<strong>Enable HTTP/2:</strong> Upgrade to HTTP/2 for multiplexing and header compression, allowing multiple requests over a single connection.</li>
<li>
<strong>Compress Responses:</strong> Activate GZIP or Brotli compression to shrink HTML, CSS, and JavaScript files before sending them to the browser.</li>
</ul>
<p>CNN uses optimized database queries to deliver news articles instantly, even during traffic surges. Pairing this with a CDN ensures global users get fast access.</p>
<blockquote>
<p>Pro Tip: Monitor server performance with New Relic to catch bottlenecks before they impact users.</p>
</blockquote>
<h2>
HTML and Font Optimization
</h2>
<p>While less obvious than images or scripts, <strong>HTML optimization</strong> and <strong>font optimization</strong> play a subtle but significant role in <strong>website speed</strong>.</p>
<h3>
HTML Optimization Techniques
</h3>
<ul>
<li>
<strong>Write Clean HTML:</strong> Use concise, semantic markup validated by the W3C Validator. Fewer bytes mean faster parsing.</li>
<li>
<strong>Compress HTML:</strong> Enable server-side GZIP or Brotli compression to reduce file sizes by up to 70%.</li>
<li>
<strong>Prioritize Resources:</strong> Use <code><link rel="preload"></code> for critical assets, like:
</li>
</ul>
<div class="highlight js-code-highlight">
<pre class="highlight html"><code><span class="nt"><link</span> <span class="na">rel=</span><span class="s">"preload"</span> <span class="na">href=</span><span class="s">"styles.css"</span> <span class="na">as=</span><span class="s">"style"</span><span class="nt">></span>
</code></pre>
</div>
<h3>
Font Optimization Techniques
</h3>
<ul>
<li>
<strong>Subset Fonts:</strong> Load only the characters you need with tools like Glyphhanger.</li>
<li>
<strong>Use System Fonts:</strong> Default to system fonts (e.g., font-family: -apple-system, sans-serif) to skip external font downloads.</li>
<li>
<strong>Optimize Font Loading:</strong> Preload key fonts with <code><link rel="preload"></code> and use font-display: swap to avoid invisible text during loading.</li>
</ul>
<p>Google's homepage relies on clean HTML and minimal fonts, contributing to its lightning-fast load times. Small tweaks here can yield big gains.</p>
<h2>
Caching for Performance
</h2>
<p><strong>Caching</strong> is a powerful way to speed up repeat visits by storing resources locally or on servers, reducing redundant downloads.</p>
<p><a href="proxy.php?url=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%2Fgd20tf3uuthgazqka5fh.png" class="article-body-image-wrapper"><img src="proxy.php?url=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%2Fgd20tf3uuthgazqka5fh.png" alt="how caching reduces server requests" width="800" height="566"></a></p>
<h3>
Caching Strategies
</h3>
<ul>
<li>
<strong>Browser Caching:</strong> Set Cache-Control headers for static files, like:
</li>
</ul>
<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>Cache-Control: public, max-age<span class="o">=</span>31536000
</code></pre>
</div>
<ul>
<li>
<strong>Server-Side Caching:</strong> Use Redis or Varnish to store dynamic content, cutting database strain.</li>
<li>
<strong>CDN Caching:</strong> Cache assets on a CDN to serve them from edge locations, minimizing latency.</li>
</ul>
<blockquote>
<p>GitHub Pages leverages browser caching for static assets, ensuring returning users experience near-instant load times.</p>
</blockquote>
<h2>
Performance Monitoring
</h2>
<p>Optimizing once isn't enough, <strong>performance monitoring</strong> ensures your site stays fast as content, traffic, and technology evolve.</p>
<h3>
Top Performance Monitoring Tools
</h3>
<ul>
<li>
<strong>Google PageSpeed Insights:</strong> Scores your site and offers actionable fixes for speed and usability.</li>
<li>
<strong>Lighthouse:</strong> Built into Chrome DevTools, it audits performance, accessibility, and SEO.</li>
<li>
<strong>New Relic:</strong> Tracks server-side metrics and application health in real time.</li>
</ul>
<p>Netflix uses New Relic to monitor streaming performance, ensuring smooth playback for millions during peak hours.</p>
<h2>
Real-World Case Studies
</h2>
<p>These examples show how <a href="proxy.php?url=https://devdreaming.com/blogs/category/seo" rel="noopener noreferrer"><strong>web performance optimization</strong></a> drives tangible results:</p>
<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Company</th>
<th>Action Taken</th>
<th>Result</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Amazon</strong></td>
<td>Cut latency by 100ms</td>
<td>1% sales loss avoided</td>
</tr>
<tr>
<td><strong>eBay</strong></td>
<td>Reduced load time by 1s</td>
<td>11% fewer page views lost</td>
</tr>
<tr>
<td><strong>Netflix</strong></td>
<td>Optimized for 1s delay</td>
<td>7.5% more views retained</td>
</tr>
<tr>
<td><strong>Etsy</strong></td>
<td>Improved load time by 150ms</td>
<td>12% revenue increase</td>
</tr>
<tr>
<td><strong>Pinterest</strong></td>
<td>Cut wait times by 40%</td>
<td>15% boost in traffic and sign-ups</td>
</tr>
<tr>
<td><strong>BBC</strong></td>
<td>Fixed 1s delay</td>
<td>10% user retention gained</td>
</tr>
</tbody>
</table></div>
<p>These cases highlight that even tiny improvements can yield outsized benefits.</p>
<h2>
Conclusion
</h2>
<p><strong>Web performance optimization</strong> is a blend of science, strategy, and creativity. By minimizing HTTP requests, optimizing CSS, JavaScript, images, and server operations, and leveraging caching and monitoring, you can build websites that load fast and keep users coming back. The payoff? Better SEO, higher conversions, and happier visitors.</p>
<p>Start small, test one technique, measure the impact, and scale up. Tools like Lighthouse and New Relic will guide your journey. In a world where speed is king, optimizing your site isn't just a technical task it's a competitive edge.</p>
<p>Thanks for reading this article, I hope you found it helpful. If you are interested in learning and building project using React, Redux and Next.js you can visit my YouTube channel here: <a href="proxy.php?url=https://www.youtube.com/channel/UCeYt6blRBKuNrEg_-282fSA/" rel="noopener noreferrer">CodeBucks</a></p>
<p>Here are my other article that you might like to read:</p>
<ul>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/how-to-build-personal-brand-as-developer-guide" rel="noopener noreferrer">How to Build a Personal Brand as a Developer: A Step-by-Step Guide</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/nextjs-seo-guide-for-higher-search-ranking" rel="noopener noreferrer">Next.js SEO Made Simple: Your Quick Start Guide to Higher Search Rankings
</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/videos/build-ai-saas-app-nextjs-supabase-replicate-stripe" rel="noopener noreferrer">How I Cloned a $1M AI SaaS Application Using Next.js, Supabase, Replicate and Stripe</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/simplify-state-management-with-reactjs-context-api" rel="noopener noreferrer">Simplify State Management with React.js Context API Tutorial</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/nextjs-smooth-scrolling-with-lenis-gsap" rel="noopener noreferrer">How to implement smooth scrolling in Next.js with Lenis and GSAP</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/how-to-get-user-location-in-react-js" rel="noopener noreferrer">How to Get User's Location in React.js</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/top-10-popular-vs-code-themes" rel="noopener noreferrer">Top 10 Popular VS Code Themes You Should Try</a></li>
</ul>
<p>💻Visit my personal blog website from here: <a href="proxy.php?url=https://devdreaming.com/" rel="noopener noreferrer">DevDreaming</a><br>
🐥Follow me on X: <a href="proxy.php?url=https://x.com/code_bucks" rel="noopener noreferrer">@code_bucks</a></p>
webdevperformancetutorialuxHow to Build a Personal Brand as a Developer: A Step-by-Step GuideCodeBucksMon, 24 Feb 2025 11:30:00 +0000
https://dev.to/codebucks/how-to-build-a-personal-brand-as-a-developer-a-step-by-step-guide-3p05
https://dev.to/codebucks/how-to-build-a-personal-brand-as-a-developer-a-step-by-step-guide-3p05<p>Building a personal brand as a developer is essential in today's competitive tech landscape. It's not just about your coding skills; it's about how you present yourself to the world, showcasing your unique strengths and values. This guide will walk you through the steps to create a compelling personal brand, helping you stand out and advance your career.</p>
<p>I have been getting lots of queries from freshers and fellow developers on how to get a job or freelance clients. I always tell them to showcase their work out there, write blogs, make content that is relevant to their skills. Right now having a strong personal brand as a developer is more important than ever. It's the story you tell about who you are and what you stand for, and it can be a powerful tool in advancing your career.</p>
<p>Personal branding for developers involves creating a unique identity that encapsulates your skills, experiences, and values. It's how you differentiate yourself from the thousands of other developers, making you memorable and attractive to potential employers, clients, or collaborators. You just have to ask yourself one question, How a recruiter or client can easily find about your work?</p>
<p>Why is personal branding important? Statistics underscore its value:</p>
<ul>
<li>According to a CareerBuilder survey, 70% of recruiters use social media to screen candidates during the hiring process, emphasizing the need for a strong online presence.</li>
<li>A study by the Harvard Business Review found that employees who engage in personal branding are more likely to be promoted and receive higher salaries, illustrating career advancement benefits.</li>
</ul>
<p>Let me walk you through the steps to build a compelling personal brand, covering as much as possible to ensure a thorough understanding.</p>
<p><a href="proxy.php?url=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%2Fvz0jdlnl9xk9rz7qblv9.png" class="article-body-image-wrapper"><img src="proxy.php?url=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%2Fvz0jdlnl9xk9rz7qblv9.png" alt="building personal brand as a developer" width="800" height="450"></a></p>
<h2>
Step 1: Identify Your Unique Strengths
</h2>
<p>To build a strong personal brand, you need to identify what sets you apart from others in your field. Your unique strengths could be your expertise in a particular programming language, your ability to solve complex problems, your passion for teaching, or any other trait that makes you stand out.</p>
<p>How do you identify these strengths? Start by reflecting on your experiences. Think about projects you've worked on, challenges you've overcome, and feedback you've received from peers and supervisors. What are the common themes or skills you've consistently demonstrated? For example, if you've excelled in front-end development, that could be a key strength. If you are a beginner, start by explaining what you know through blogs, linkedIn post or tweets. You can use tools like <a href="proxy.php?url=https://devdreaming.com/ai-tools" rel="noopener noreferrer">ChatGPT</a>, Claude to form the right sentences if you are new to writing technical content.</p>
<p>If you still don't really clear about your strengths then consider taking assessments like the <a href="proxy.php?url=https://www.gallup.com/cliftonstrengths/en/252137/home.aspx" rel="noopener noreferrer">Gallup StrengthsFinder</a> to gain insights into your personality and work style. Seeking feedback from colleagues, mentors, or friends can also reveal strengths you might not recognize yourself. Keeping a journal to document your thoughts, achievements, and goals can help identify patterns over time. At the end, you know best by doing various experiments. For me it was publishing my first video on YouTube and writing first article on dev.to. By doing so I got nice feedbacks from people which lead me to create more such content.</p>
<p>Once identified, highlight these strengths in your personal brand. For instance, if you're particularly good at machine learning, showcase open-source contributions in that area on platforms like GitHub.</p>
<h2>
Step 2: Define Your Target Audience
</h2>
<p>Before effectively communicating your personal brand, know who you're trying to reach. Your target audience could be potential employers, clients, other developers, or a combination of these, each with different expectations and needs.</p>
<ul>
<li>
<strong>Potential Employers:</strong> If you're looking to advance your career or find a new job, present yourself as competent, reliable, and innovative. Highlight professional achievements, certifications, and relevant experience on your LinkedIn profile.</li>
<li>
<strong>Clients:</strong> For freelancers or consultants, focus on expertise, a portfolio of work, and testimonials from satisfied clients to attract business opportunities.</li>
<li>
<strong>Other Developers:</strong> If building a reputation within the community, share knowledge, participate in open-source projects, and engage in discussions on forums and social media.</li>
</ul>
<p>To define your audience, ask:</p>
<ul>
<li>Who do I want to influence or impress with my personal brand?</li>
<li>What are their pain points or needs that I can address?</li>
<li>How can I tailor my message to resonate with them?</li>
</ul>
<h2>
Step 3: Create Valuable Content
</h2>
<p>Creating and sharing valuable content is one of the most effective ways to build your personal brand. This could include blog posts, tutorials, videos, open-source contributions, or any content that demonstrates your expertise and passion, providing value to your target audience.</p>
<p>Choose topics that resonate with your audience. For example, if targeting other developers, write about best practices, new technologies, or common challenges. For potential employers, share thoughts on industry trends or experiences with different programming languages. Ensure content is practical and actionable, like a step-by-step guide on implementing a feature.</p>
<p>Stay up-to-date with the tech industry's evolution, keeping content current and relevant. Consistency is key, regularly publish content, whether weekly, bi-weekly, or monthly, to build momentum. Promote your content on social media, email, and other channels to increase visibility. Remember, creating valuable content isn't just about showcasing skills; it's about building relationships and establishing yourself as a thought leader.</p>
<p><a href="proxy.php?url=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%2Fc08nbf1u86xnrek6ddvb.png" class="article-body-image-wrapper"><img src="proxy.php?url=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%2Fc08nbf1u86xnrek6ddvb.png" alt="building a personal brand through content" width="800" height="450"></a></p>
<h2>
Step 4: Build Your Online Presence
</h2>
<p>Your online presence is crucial for personal branding in the digital age. As a developer, leverage platforms like LinkedIn, GitHub, Stack Overflow, Dev to, Tech Twitter and a personal website to present yourself to the world.</p>
<ul>
<li>
<strong>LinkedIn:</strong> Complete your profile with a professional photo, compelling headline, and summary highlighting unique strengths and experiences. It's the go-to platform for professional networking.</li>
<li>
<strong>GitHub:</strong> Showcase coding skills and open-source contributions, keeping your profile updated and engaging with others by commenting on issues and pull requests.</li>
<li>
<strong>Stack Overflow:</strong> Demonstrate knowledge by answering questions and providing helpful comments, building a reputation as a reliable expert.</li>
<li>
<strong>Personal Website or Blog:</strong> Control your narrative by featuring your portfolio, blog posts, and other content that supports your brand.</li>
<li>
<strong>X (Twitter):</strong> Write short, insightful posts related to development, share your journey, and engage in relevant conversations with fellow developers and industry professionals. Follow key influencers, share your work, and contribute to ongoing discussions to build your presence and network.</li>
<li>
<strong>Dev.to:</strong> Write articles about your experiences, coding tutorials, or insights into the latest technologies. Dev.to has a large community of developers that value learning and sharing knowledge.</li>
</ul>
<p>Ensure consistency across platforms, using the same profile picture and bio to create a cohesive image. Regularly update profiles with new achievements, projects, and content to keep them fresh.</p>
<h2>
Step 5: Engage with Communities
</h2>
<p>Engaging with the developer community is vital for building relationships, learning from others, and enhancing your reputation. Participate in discussions, attend events, and network with professionals to strengthen your personal brand.</p>
<p>Join online forums like Reddit's r/learnprogramming, Stack Overflow, Facebook groups and Discord servers related to your interest. Participate by asking questions, sharing knowledge, and contributing to discussions. Attend meetups, hackathons, and conferences to meet other developers, learn new skills, and present your work. Volunteer or mentor at community events to demonstrate leadership and generosity, and contribute to open-source projects for collaboration and visibility.</p>
<p>Engagement is a two-way street, build meaningful connections and contribute to the community</p>
<h2>
Step 6: Use Social Media Effectively
</h2>
<p>Social media is a powerful tool for promoting your personal brand. Use platforms like LinkedIn, X, and Instagram to share content, engage with your audience, and stay connected with the tech community.</p>
<p>Choose the right platforms based on your audience, LinkedIn for professional networking, X for real-time updates. Be consistent with your brand voice and messaging across channels. Share valuable content, not just self-promotional material, and engage with others by liking, commenting, and sharing posts. Use right keywords to increase visibility and analyze performance with analytics tools to adjust your strategy.</p>
<p>Social media is a marathon, requiring patience and persistence to build a following and establish presence, as noted in various developer branding guides.</p>
<h3>
Key Platforms for Online Presence
</h3>
<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Platform</th>
<th>Purpose</th>
<th>Tips for Optimization</th>
</tr>
</thead>
<tbody>
<tr>
<td>LinkedIn</td>
<td>Professional networking</td>
<td>Complete profile, professional photo, compelling headline</td>
</tr>
<tr>
<td>GitHub</td>
<td>Showcase coding skills</td>
<td>Update with projects, engage with community</td>
</tr>
<tr>
<td>Stack Overflow</td>
<td>Demonstrate knowledge</td>
<td>Answer questions, build reputation</td>
</tr>
<tr>
<td>Personal Website</td>
<td>Control narrative, feature portfolio</td>
<td>Include blog, portfolio, contact info</td>
</tr>
</tbody>
</table></div>
<h2>
Conclusion: Putting It All Together
</h2>
<p>Building a personal brand as a developer is a journey requiring time, effort, and dedication. It's not achieved overnight, but with a strategic approach, you can create a strong, lasting brand that sets you apart. Now to Summarize the article first identify your strengths, define your audience, create content, build online presence, engage with communities, and use social media effectively. Stay true to your values, be authentic, and continuously improve and learn.</p>
<p>Now, go out there and start building your personal brand. The tech world is waiting for your unique contribution.</p>
<p>Thanks for reading this article, I hope you found it helpful. If you are interested in learning and building project using React, Redux and Next.js you can visit my YouTube channel here: <a href="proxy.php?url=https://www.youtube.com/channel/UCeYt6blRBKuNrEg_-282fSA/" rel="noopener noreferrer">CodeBucks</a></p>
<p>Here are my other article that you might like to read:</p>
<ul>
<li><a href="proxy.php?url=https://dev.to/codebucks/website-performance-optimization-proven-techniques-for-faster-websites-1ckg">Website Performance Optimization: Proven Techniques for Faster Websites
</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/nextjs-seo-guide-for-higher-search-ranking" rel="noopener noreferrer">Next.js SEO Made Simple: Your Quick Start Guide to Higher Search Rankings
</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/videos/build-ai-saas-app-nextjs-supabase-replicate-stripe" rel="noopener noreferrer">How I Cloned a $1M AI SaaS Application Using Next.js, Supabase, Replicate and Stripe</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/simplify-state-management-with-reactjs-context-api" rel="noopener noreferrer">Simplify State Management with React.js Context API Tutorial</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/nextjs-smooth-scrolling-with-lenis-gsap" rel="noopener noreferrer">How to implement smooth scrolling in Next.js with Lenis and GSAP</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/how-to-get-user-location-in-react-js" rel="noopener noreferrer">How to Get User's Location in React.js</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/top-10-popular-vs-code-themes" rel="noopener noreferrer">Top 10 Popular VS Code Themes You Should Try</a></li>
</ul>
<p>💻Visit my personal blog website from here: <a href="proxy.php?url=https://devdreaming.com/" rel="noopener noreferrer">DevDreaming</a><br>
🐥Follow me on X: <a href="proxy.php?url=https://x.com/code_bucks" rel="noopener noreferrer">@code_bucks</a></p>
webdevdevelopercareerbeginnersNext.js SEO Made Simple: Your Quick Start Guide to Higher Search RankingsCodeBucksFri, 31 Jan 2025 18:14:49 +0000
https://dev.to/codebucks/nextjs-seo-made-simple-your-quick-start-guide-to-higher-search-rankings-56no
https://dev.to/codebucks/nextjs-seo-made-simple-your-quick-start-guide-to-higher-search-rankings-56no<p>Did you know a perfectly coded website can remain invisible in search results without proper SEO implementation?</p>
<p>SEO in Next.js is vital for developers and businesses today. Next.js 15 offers powerful server-side rendering and static site generation capabilities. These features ensure search engine crawlers receive complete HTML content and substantially improve your SEO performance.</p>
<p>Next.js's built-in features give you a head start toward better search rankings. These include metadata management, semantic HTML implementation, and Core Web Vitals optimization. You just need to configure these elements correctly to see real results.</p>
<p>This guide covers everything about implementing SEO in Next.js, from simple metadata setup to advanced optimization techniques. Your website's visibility in search results will improve whether you're starting fresh or optimizing an existing project.</p>
<p>Let's start making your Next.js website more search-engine friendly!</p>
<h2>
Understanding Next.js Metadata Basics
</h2>
<p>Metadata forms the foundations of SEO implementation in Next.js applications. They brought the <a href="proxy.php?url=https://nextjs.org/docs/app/building-your-application/optimizing/metadata" rel="noopener noreferrer">Metadata API</a> that gives developers robust tools to define and manage webpage information.</p>
<p><strong>What is Next.js Metadata</strong></p>
<p>Metadata is a vital part of information embedded in your webpage's <code><head></code> element. Users can't see it, but this data works quietly to tell search engines and social media platforms everything about your content. Next.js gives you two ways to implement metadata: config-based and file-based methods.</p>
<p><strong>Key Metadata Components</strong></p>
<p>Next.js metadata has these core elements:</p>
<ul>
<li>Title Metadata: Shows the webpage title in browser tabs and search results</li>
<li>Description Metadata: Gives a quick summary of page content</li>
<li>Keywords Metadata: Lists search terms for indexing</li>
<li>Social Tags: Makes content look better on social platforms</li>
<li>Favicon Metadata: Shows site icons in browsers</li>
</ul>
<p>On top of that, Next.js adds two default meta tags automatically: the charset tag for character encoding and the viewport tag to adjust for devices.</p>
<p><strong>Effect on SEO Rankings</strong></p>
<p>Search engines use your metadata to crawl and rank pages. The title tag plays a vital role for two main reasons: users see it in search results when they find your website, and search engines use it to understand what your page is about.</p>
<p>Google says description meta tags don't directly change ranking positions, but they substantially boost click-through rates from search results. Social tags, mainly through the Open Graph protocol, help links look better across platforms, which brings more visibility and traffic.</p>
<p>Next.js lets you handle metadata with both static and dynamic approaches. Static metadata works best for information that doesn't change, while dynamic metadata through the generateMetadata function adapts to what's happening at runtime and current route parameters.</p>
<h2>
Setting Up Static Metadata in Next.js
</h2>
<p>Static metadata implementation in Next.js is the quickest way to improve your website's search engine visibility. Let's look at how you can set up these SEO elements to work well.</p>
<h3>
Configuring Basic Meta Tags
</h3>
<p>Next.js gives you a simple method to implement static metadata through the metadata object export. You can configure basic meta tags by creating a metadata object in your <code>layout.js</code> or <code>page.js</code> file:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">export</span> <span class="kd">const</span> <span class="nx">metadata</span> <span class="o">=</span> <span class="p">{</span>
<span class="na">title</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Your Website Title</span><span class="dl">"</span><span class="p">,</span>
<span class="na">description</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Your website description</span><span class="dl">"</span><span class="p">,</span>
<span class="na">keywords</span><span class="p">:</span> <span class="dl">"</span><span class="s2">nextjs, seo, metadata</span><span class="dl">"</span><span class="p">,</span>
<span class="na">robots</span><span class="p">:</span> <span class="dl">"</span><span class="s2">index, follow</span><span class="dl">"</span>
<span class="p">}</span>
</code></pre>
</div>
<h3>
Implementing OpenGraph Tags
</h3>
<p>We used OpenGraph tags to make your content look better on social media platforms. Next.js makes OpenGraph implementation easy through a dedicated configuration object:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">export</span> <span class="kd">const</span> <span class="nx">metadata</span> <span class="o">=</span> <span class="p">{</span>
<span class="na">openGraph</span><span class="p">:</span> <span class="p">{</span>
<span class="na">title</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Page Title</span><span class="dl">"</span><span class="p">,</span>
<span class="na">description</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Page Description</span><span class="dl">"</span><span class="p">,</span>
<span class="na">url</span><span class="p">:</span> <span class="dl">"</span><span class="s2">https://yourwebsite.com</span><span class="dl">"</span><span class="p">,</span>
<span class="na">siteName</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Your Site</span><span class="dl">"</span><span class="p">,</span>
<span class="na">images</span><span class="p">:</span> <span class="p">[{</span>
<span class="na">url</span><span class="p">:</span> <span class="dl">"</span><span class="s2">https://yourwebsite.com/og-image.jpg</span><span class="dl">"</span><span class="p">,</span>
<span class="na">width</span><span class="p">:</span> <span class="mi">1200</span><span class="p">,</span>
<span class="na">height</span><span class="p">:</span> <span class="mi">630</span><span class="p">,</span>
<span class="na">alt</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Page Preview</span><span class="dl">"</span>
<span class="p">}],</span>
<span class="na">type</span><span class="p">:</span> <span class="dl">"</span><span class="s2">website</span><span class="dl">"</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre>
</div>
<p>The ideal image size for OpenGraph images is 1200x630 pixels. Your OpenGraph images should stay under 8MB in size.</p>
<h3>
Adding Twitter Cards
</h3>
<p>Twitter Cards need specific meta tags to control your content's appearance on the platform. Next.js provides a dedicated twitter object within the metadata configuration:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">export</span> <span class="kd">const</span> <span class="nx">metadata</span> <span class="o">=</span> <span class="p">{</span>
<span class="na">twitter</span><span class="p">:</span> <span class="p">{</span>
<span class="na">card</span><span class="p">:</span> <span class="dl">"</span><span class="s2">summary_large_image</span><span class="dl">"</span><span class="p">,</span>
<span class="na">title</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Your Title</span><span class="dl">"</span><span class="p">,</span>
<span class="na">description</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Your Description</span><span class="dl">"</span><span class="p">,</span>
<span class="na">creator</span><span class="p">:</span> <span class="dl">"</span><span class="s2">@yourusername</span><span class="dl">"</span><span class="p">,</span>
<span class="na">images</span><span class="p">:</span> <span class="p">[</span><span class="dl">"</span><span class="s2">https://yourwebsite.com/twitter-image.jpg</span><span class="dl">"</span><span class="p">]</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre>
</div>
<p><a href="proxy.php?url=https://nextjs.org/docs/app/api-reference/file-conventions/metadata/opengraph-image" rel="noopener noreferrer">Twitter image files must stay under 5MB</a>. Next.js will generate the appropriate <code><meta></code> and <code><link></code> tags in your HTML <head> element based on these configurations automatically.</p>
<p>Your metadata should be unique and relevant for each page. This helps search engines and social media platforms understand and present your content better to potential visitors.</p>
<h2>
Implementing Dynamic Metadata
</h2>
<p>Dynamic metadata helps Next.js applications adjust their SEO elements based on runtime conditions and route parameters. This advanced approach lets you discover the full potential of content-driven websites and applications.</p>
<h3>
Using generateMetadata Function
</h3>
<p>The generateMetadata function is the life-blood of implementing dynamic metadata in Next.js. The function takes route parameters and parent metadata as inputs and returns a metadata object. Here's a practical implementation:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">export</span> <span class="k">async</span> <span class="kd">function</span> <span class="nf">generateMetadata</span><span class="p">({</span> <span class="nx">params</span> <span class="p">})</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">product</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">fetch</span><span class="p">(</span><span class="s2">`https://api.example.com/</span><span class="p">${(</span><span class="k">await</span> <span class="nx">params</span><span class="p">).</span><span class="nx">id</span><span class="p">}</span><span class="s2">`</span><span class="p">)</span>
<span class="p">.</span><span class="nf">then</span><span class="p">((</span><span class="nx">res</span><span class="p">)</span> <span class="o">=></span> <span class="nx">res</span><span class="p">.</span><span class="nf">json</span><span class="p">())</span>
<span class="k">return</span> <span class="p">{</span>
<span class="na">title</span><span class="p">:</span> <span class="nx">product</span><span class="p">.</span><span class="nx">title</span><span class="p">,</span>
<span class="na">description</span><span class="p">:</span> <span class="nx">product</span><span class="p">.</span><span class="nx">description</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre>
</div>
<p>Next.js automatically caches the fetch results to avoid multiple requests and streamline processes.</p>
<h3>
Dynamic Title and Description Strategies
</h3>
<p>We used dynamic titles and descriptions to boost user experience by providing context-specific information. Titles should be 50-60 characters long to ensure complete visibility in search results.</p>
<p>The metadata generation process follows these essential principles:</p>
<ul>
<li>Fetch data based on route parameters</li>
<li>Access and extend parent metadata when needed</li>
<li>Generate unique metadata for each page</li>
<li>Cache results to improve performance</li>
</ul>
<p>Learn more about it from <a href="proxy.php?url=https://nextjs.org/docs/app/api-reference/functions/generate-metadata#generatemetadata-function" rel="noopener noreferrer">Next.js official documentation</a>.</p>
<h3>
Handling Dynamic Images
</h3>
<p>Next.js provides the <code>ImageResponse</code> constructor to generate dynamic images through JSX and CSS. This feature is a great way to get:</p>
<ul>
<li>Social media cards</li>
<li>Open Graph images</li>
<li>Twitter card images</li>
</ul>
<p>The implementation needs specific configuration:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight typescript"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">ImageResponse</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">next/og</span><span class="dl">'</span>
<span class="k">new</span> <span class="nc">ImageResponse</span><span class="p">(</span>
<span class="nx">element</span><span class="p">:</span> <span class="nx">ReactElement</span><span class="p">,</span>
<span class="nx">options</span><span class="p">:</span> <span class="p">{</span>
<span class="nl">width</span><span class="p">?:</span> <span class="kr">number</span> <span class="o">=</span> <span class="mi">1200</span>
<span class="nx">height</span><span class="p">?:</span> <span class="kr">number</span> <span class="o">=</span> <span class="mi">630</span>
<span class="nx">emoji</span><span class="p">?:</span> <span class="dl">'</span><span class="s1">twemoji</span><span class="dl">'</span> <span class="o">|</span> <span class="dl">'</span><span class="s1">blobmoji</span><span class="dl">'</span> <span class="o">|</span> <span class="dl">'</span><span class="s1">noto</span><span class="dl">'</span> <span class="o">|</span> <span class="dl">'</span><span class="s1">openmoji</span><span class="dl">'</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">twemoji</span><span class="dl">'</span><span class="p">,</span>
<span class="nx">fonts</span><span class="p">?:</span> <span class="p">{</span>
<span class="na">name</span><span class="p">:</span> <span class="kr">string</span><span class="p">,</span>
<span class="na">data</span><span class="p">:</span> <span class="nb">ArrayBuffer</span><span class="p">,</span>
<span class="na">weight</span><span class="p">:</span> <span class="kr">number</span><span class="p">,</span>
<span class="na">style</span><span class="p">:</span> <span class="dl">'</span><span class="s1">normal</span><span class="dl">'</span> <span class="o">|</span> <span class="dl">'</span><span class="s1">italic</span><span class="dl">'</span>
<span class="p">}[]</span>
<span class="nx">debug</span><span class="p">?:</span> <span class="nx">boolean</span> <span class="o">=</span> <span class="kc">false</span>
<span class="c1">// Options that will be passed to the HTTP response</span>
<span class="nx">status</span><span class="p">?:</span> <span class="kr">number</span> <span class="o">=</span> <span class="mi">200</span>
<span class="nx">statusText</span><span class="p">?:</span> <span class="kr">string</span>
<span class="nx">headers</span><span class="p">?:</span> <span class="nb">Record</span> <span class="o"><</span> <span class="kr">string</span><span class="p">,</span> <span class="kr">string</span><span class="o">></span>
<span class="p">},</span>
<span class="p">)</span>
</code></pre>
</div>
<p>Dynamic images work with common CSS properties, including flexbox and absolute positioning. Developers can create sophisticated image layouts that adapt to content changes automatically.</p>
<p>Route-specific images need their generation logic in opengraph-image or twitter-image routes. This approach makes sure images are optimized and delivered based on the current page's context.</p>
<h2>
Advanced Metadata Configuration
</h2>
<p>The right setup of advanced metadata elements will boost your Next.js application's search engine presence. Here are three significant components that will improve your website's SEO performance.</p>
<h3>
JSON-LD Implementation
</h3>
<p>JSON-LD (JavaScript Object Notation for Linked Data) helps search engines better understand your content through structured data. Note that JSON-LD should be rendered as a <code><script></code> tag in your <code>layout.js</code> or <code>page.js</code> components. Here's an example implementation:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">export</span> <span class="k">default</span> <span class="k">async</span> <span class="kd">function</span> <span class="nf">Page</span><span class="p">({</span> <span class="nx">params</span> <span class="p">})</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">product</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">getProduct</span><span class="p">(</span><span class="nx">params</span><span class="p">.</span><span class="nx">id</span><span class="p">)</span>
<span class="kd">const</span> <span class="nx">jsonLd</span> <span class="o">=</span> <span class="p">{</span>
<span class="dl">'</span><span class="s1">@context</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">https://schema.org</span><span class="dl">'</span><span class="p">,</span>
<span class="dl">'</span><span class="s1">@type</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">Product</span><span class="dl">'</span><span class="p">,</span>
<span class="na">name</span><span class="p">:</span> <span class="nx">product</span><span class="p">.</span><span class="nx">name</span><span class="p">,</span>
<span class="na">image</span><span class="p">:</span> <span class="nx">product</span><span class="p">.</span><span class="nx">image</span><span class="p">,</span>
<span class="na">description</span><span class="p">:</span> <span class="nx">product</span><span class="p">.</span><span class="nx">description</span>
<span class="p">}</span>
<span class="k">return </span><span class="p">(</span>
<span class="o"><</span><span class="nx">section</span><span class="o">></span>
<span class="o"><</span><span class="nx">script</span>
<span class="nx">type</span><span class="o">=</span><span class="dl">"</span><span class="s2">application/ld+json</span><span class="dl">"</span>
<span class="nx">dangerouslySetInnerHTML</span><span class="o">=</span><span class="p">{{</span> <span class="na">__html</span><span class="p">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">stringify</span><span class="p">(</span><span class="nx">jsonLd</span><span class="p">)</span> <span class="p">}}</span>
<span class="sr">/</span><span class="err">>
</span> <span class="o"><</span><span class="sr">/section</span><span class="err">>
</span> <span class="p">)</span>
<span class="p">}</span>
</code></pre>
</div>
<p>You can verify your structured data using Google's Rich Results Test or Schema Markup Validator, just like other metadata elements.</p>
<h3>
Canonical URLs Setup
</h3>
<p>Canonical URLs help you avoid duplicate content problems by pointing to the preferred version of a webpage. Next.js needs specific configuration for canonical URLs. You can add them to your metadata configuration:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">export</span> <span class="kd">const</span> <span class="nx">metadata</span> <span class="o">=</span> <span class="p">{</span>
<span class="na">alternates</span><span class="p">:</span> <span class="p">{</span>
<span class="na">canonical</span><span class="p">:</span> <span class="dl">'</span><span class="s1">https://example.com/your-page</span><span class="dl">'</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre>
</div>
<p>Next.js will automatically generate canonical URLs for all your pages when you combine this with metadataBase in your root layout.</p>
<h3>
robots.txt and sitemap.xml Configuration
</h3>
<p>Search engine crawlers rely on these files to navigate your website. You can create them either statically or dynamically.</p>
<p>Your robots.txt configuration should specify crawler access rules, create robots.js file in your app directory and use the following code.<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">export</span> <span class="k">default</span> <span class="kd">function</span> <span class="nf">robots</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="p">{</span>
<span class="na">rules</span><span class="p">:</span> <span class="p">{</span>
<span class="na">userAgent</span><span class="p">:</span> <span class="dl">'</span><span class="s1">*</span><span class="dl">'</span><span class="p">,</span>
<span class="na">allow</span><span class="p">:</span> <span class="dl">'</span><span class="s1">/</span><span class="dl">'</span><span class="p">,</span>
<span class="na">disallow</span><span class="p">:</span> <span class="dl">'</span><span class="s1">/private/</span><span class="dl">'</span>
<span class="p">},</span>
<span class="na">sitemap</span><span class="p">:</span> <span class="dl">'</span><span class="s1">https://example.com/sitemap.xml</span><span class="dl">'</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre>
</div>
<p>Next.js gives you two options for <code>sitemap.xml</code>:</p>
<ul>
<li>Static Configuration:
</li>
</ul>
<div class="highlight js-code-highlight">
<pre class="highlight xml"><code><span class="nt"><urlset</span> <span class="na">xmlns=</span><span class="s">"http://www.sitemaps.org/schemas/sitemap/0.9"</span><span class="nt">></span>
<span class="nt"><url></span>
<span class="nt"><loc></span>https://example.com<span class="nt"></loc></span>
<span class="nt"><lastmod></span>2024-01-24<span class="nt"></lastmod></span>
<span class="nt"><changefreq></span>yearly<span class="nt"></changefreq></span>
<span class="nt"><priority></span>1<span class="nt"></priority></span>
<span class="nt"></url></span>
<span class="nt"></urlset></span>
</code></pre>
</div>
<ul>
<li>Dynamic Generation:
</li>
</ul>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">export</span> <span class="k">default</span> <span class="k">async</span> <span class="kd">function</span> <span class="nf">sitemap</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">posts</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">getPosts</span><span class="p">()</span>
<span class="k">return</span> <span class="nx">posts</span><span class="p">.</span><span class="nf">map</span><span class="p">((</span><span class="nx">post</span><span class="p">)</span> <span class="o">=></span> <span class="p">({</span>
<span class="na">url</span><span class="p">:</span> <span class="s2">`https://example.com/posts/</span><span class="p">${</span><span class="nx">post</span><span class="p">.</span><span class="nx">slug</span><span class="p">}</span><span class="s2">`</span><span class="p">,</span>
<span class="na">lastModified</span><span class="p">:</span> <span class="nx">post</span><span class="p">.</span><span class="nx">updatedAt</span>
<span class="p">}))</span>
<span class="p">}</span>
</code></pre>
</div>
<p>Your sitemap should include all important URLs and stay updated regularly. Without doubt, a good setup of these advanced metadata elements will improve your website's visibility in search results.</p>
<h2>
Troubleshooting Common Issues
</h2>
<p>Next.js metadata implementation can be tricky. Let's look at common problems and their solutions to help you optimize your SEO smoothly.</p>
<h3>
Metadata Not Updating
</h3>
<p>Your metadata might stop updating during client-side navigation. This problem shows up in two main cases:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="c1">// Common problematic pattern</span>
<span class="dl">"</span><span class="s2">use client</span><span class="dl">"</span>
<span class="k">export</span> <span class="kd">const</span> <span class="nx">metadata</span> <span class="o">=</span> <span class="p">{</span>
<span class="na">title</span><span class="p">:</span> <span class="dl">"</span><span class="s2">My Page</span><span class="dl">"</span> <span class="c1">// Won't work in client components</span>
<span class="p">}</span>
</code></pre>
</div>
<p>Here's how to solve the problems of metadata updates:</p>
<ol>
<li>Move metadata configuration to server components</li>
<li>Ensure proper route segment configuration</li>
<li>Verify metadata object structure</li>
</ol>
<p>The metadata updates usually fail because the component has a "use client" directive. Moving the metadata configuration to a server component will fix this issue.</p>
<h3>
Social Media Preview Problems
</h3>
<p>Open Graph implementation errors often cause social media preview issues. These problems happen because crawlers can't run JavaScript to get preview information.</p>
<p>You can get better social preview rendering with:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">export</span> <span class="kd">const</span> <span class="nx">metadata</span> <span class="o">=</span> <span class="p">{</span>
<span class="na">openGraph</span><span class="p">:</span> <span class="p">{</span>
<span class="na">title</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Page Title</span><span class="dl">"</span><span class="p">,</span>
<span class="na">images</span><span class="p">:</span> <span class="p">[{</span>
<span class="na">url</span><span class="p">:</span> <span class="dl">"</span><span class="s2">https://example.com/og.png</span><span class="dl">"</span><span class="p">,</span>
<span class="na">width</span><span class="p">:</span> <span class="mi">1200</span><span class="p">,</span>
<span class="na">height</span><span class="p">:</span> <span class="mi">630</span>
<span class="p">}]</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre>
</div>
<p>Test your implementation with these platform tools:</p>
<ul>
<li>Facebook's debugging tool</li>
<li>Twitter's card validator</li>
<li>LinkedIn's post inspector</li>
</ul>
<p>Server-side rendering works better than client-side data fetching for social previews. Crawlers can get complete metadata in their first page scan this way.</p>
<h3>
SEO Validation Errors
</h3>
<p>Next.js applications often face these SEO validation issues:</p>
<ul>
<li>Missing or duplicate meta tags</li>
<li>Incorrect status code returns</li>
<li>Inconsistent canonical URLs</li>
<li>Improper robots.txt configuration</li>
</ul>
<p>A recent study showed all but one of these Next.js websites handled 404 status codes incorrectly. Here's how to fix this:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="c1">// Proper 404 page implementation</span>
<span class="c1">// pages/404.js</span>
<span class="k">export</span> <span class="k">default</span> <span class="kd">function</span> <span class="nf">Custom404</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="o"><</span><span class="nx">h1</span><span class="o">></span><span class="mi">404</span> <span class="o">-</span> <span class="nx">Page</span> <span class="nx">Not</span> <span class="nx">Found</span><span class="o"><</span><span class="sr">/h1</span><span class="err">>
</span><span class="p">}</span>
</code></pre>
</div>
<p>Only half of the Next.js websites we analyzed had proper canonical tags. You can set up canonical URLs through metadata configuration:<br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">export</span> <span class="kd">const</span> <span class="nx">metadata</span> <span class="o">=</span> <span class="p">{</span>
<span class="na">alternates</span><span class="p">:</span> <span class="p">{</span>
<span class="na">canonical</span><span class="p">:</span> <span class="dl">'</span><span class="s1">https://yoursite.com/current-page</span><span class="dl">'</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre>
</div>
<p>These tools help debug SEO issues:</p>
<ul>
<li>Google Search Console</li>
<li>Lighthouse reports</li>
<li>Schema validation tools</li>
</ul>
<p>Most validation errors come from wrong server-side rendering setup or incomplete metadata. Next.js's built-in SEO features and best practices can help you solve these issues effectively.</p>
<h3>
Conclusion
</h3>
<p>Mastering Next.js Metadata API unlocks superior search engine optimization outcomes. By combining config-based metadata for global settings and <code>generateMetadata</code> for dynamic pages, you ensure proper metadata inheritance and metadata merging. Don’t overlook JSON-LD structured data for rich snippets or Nextjs og image customization for social traction. Implement these metadata best practices to transform your Next.js app into an SEO powerhouse.</p>
nextjsseowebdevreactTop 10 Best Open Source Next.js Projects to Learn FromCodeBucksMon, 23 Dec 2024 16:00:00 +0000
https://dev.to/codebucks/top-10-best-open-source-nextjs-projects-to-learn-from-217h
https://dev.to/codebucks/top-10-best-open-source-nextjs-projects-to-learn-from-217h<p>Hi There👋,</p>
<p>I really like Next.js. It has become a favorite among developers for building fast, scalable, and user-friendly web applications. Its features like server-side rendering, static site generation, and API routes make it a powerful tool for creating modern web experiences.</p>
<p>You know basics of Next.js and you might have created few projects but now what? One of the best ways to learn and improve your Next.js skills is by exploring open source projects. By diving into real-world codebases, you can gain valuable insights into best practices, architectural patterns, and problem-solving techniques.</p>
<p>Here are 10 excellent open source projects built with Next.js that can help you level up your development skills:</p>
<h2>
1. Cal.com
</h2>
<p><a href="proxy.php?url=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%2Fq8852y1dbvvnw6nll67p.png" class="article-body-image-wrapper"><img src="proxy.php?url=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%2Fq8852y1dbvvnw6nll67p.png" alt="Cal.com" width="800" height="488"></a></p>
<p><strong>Description:</strong> An open-source scheduling infrastructure platform. It provides a customizable and extensible alternative to Calendly.</p>
<p><strong>Key Features:</strong></p>
<ul>
<li>Booking pages</li>
<li>Team scheduling</li>
<li>Integrations with various calendars and video conferencing tools</li>
</ul>
<p><strong>Technologies:</strong> Next.js, Tailwind CSS, Prisma, tRPC</p>
<p><strong>GitHub Stars:</strong> ~33k+ <a href="proxy.php?url=https://github.com/calcom/cal.com" rel="noopener noreferrer">Check it out from here</a></p>
<p><strong>Why it's great for learning:</strong> Cal.com is a well-structured project that demonstrates how to build a complex web application with Next.js. It showcases advanced concepts like data fetching, API integrations, and UI component design.</p>
<h2>
2. Rallly
</h2>
<p><a href="proxy.php?url=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%2F4275jgv7bi9zrk9waepg.png" class="article-body-image-wrapper"><img src="proxy.php?url=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%2F4275jgv7bi9zrk9waepg.png" alt="Rallly" width="800" height="363"></a></p>
<p><strong>Description:</strong> A web application for scheduling group meetings with a focus on simplicity and privacy.</p>
<p><strong>Key Features:</strong></p>
<ul>
<li>Meeting polls based on participant availability</li>
<li>No sign-up/login required</li>
<li>Customization options</li>
</ul>
<p><strong>Technologies:</strong> Next.js, Tailwind CSS, Radix UI, tRPC, Prisma</p>
<p><strong>GitHub Stars:</strong> ~3.8k+ <a href="proxy.php?url=https://github.com/lukevella/rallly" rel="noopener noreferrer">Check it out from here</a></p>
<p><strong>Why it's great for learning:</strong> Rallly is a good example of how to build a user-friendly application with a focus on UX. It utilizes modern tools and libraries and provides a clean and maintainable codebase.</p>
<h2>
3.Photoshot
</h2>
<p><a href="proxy.php?url=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%2Fy9davo5ht1hierco17pj.png" class="article-body-image-wrapper"><img src="proxy.php?url=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%2Fy9davo5ht1hierco17pj.png" alt="Photoshot" width="800" height="348"></a></p>
<p><strong>Description:</strong> An open-source AI avatar generator.</p>
<p><strong>Key Features:</strong></p>
<ul>
<li>AI-powered avatar generation</li>
<li>Customization options</li>
</ul>
<p><strong>Technologies:</strong> React, Next.js, Chakra UI, Prisma, Replicate, Stripe, Flux</p>
<p><strong>GitHub Stars:</strong> ~3.6k+ <a href="proxy.php?url=https://github.com/baptadn/photoshot" rel="noopener noreferrer">Check it out from here</a></p>
<p><strong>Why it's great for learning:</strong> Photoshot showcases how to integrate AI models into a Next.js application and create a fun and engaging user experience.</p>
<h2>
Learn to Build a Full-Stack AI SaaS Application
</h2>
<p>If you're looking to take your Next.js skills to the next level and build a real-world, revenue-generating application, I highly recommend checking out my new YouTube tutorial. In this tutorial, you'll learn how to build a complete AI SaaS platform using Next.js 15, Supabase, Replicate, and Stripe. 👇👇👇👇</p>
<p><iframe width="710" height="399" src="proxy.php?url=https://www.youtube.com/embed/7AQNeii5K7E">
</iframe>
</p>
<h2>
4. Documenso
</h2>
<p><a href="proxy.php?url=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%2Fq6aicgrrwcswvftub47i.png" class="article-body-image-wrapper"><img src="proxy.php?url=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%2Fq6aicgrrwcswvftub47i.png" alt="Documenso" width="800" height="350"></a></p>
<p><strong>Description:</strong> An open-source alternative to DocuSign for handling digital signatures and document workflows.</p>
<p><strong>Key Features:</strong></p>
<ul>
<li>Document signing</li>
<li>Template creation</li>
<li>Audit trails</li>
</ul>
<p><strong>Technologies:</strong> Next.js, Tailwind CSS, NextAuth.js, Prisma, Zod, Vitest, Shadcn/ui, React Email, Stripe, PDF-lib</p>
<p><strong>GitHub Stars:</strong> ~8.9k+ <a href="proxy.php?url=https://github.com/documenso/documenso" rel="noopener noreferrer">Check it out from here</a></p>
<p><strong>Why it's great for learning:</strong> Documenso demonstrates how to build a secure and reliable application for handling sensitive data and implementing complex workflows.</p>
<h2>
5. Inbox Zero
</h2>
<p><a href="proxy.php?url=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%2F7jwb7jtcey0u0nnrfabd.png" class="article-body-image-wrapper"><img src="proxy.php?url=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%2F7jwb7jtcey0u0nnrfabd.png" alt="Inbox Zero" width="800" height="332"></a></p>
<p><strong>Description:</strong> An open-source email app with AI assistance to help you achieve inbox zero.</p>
<p><strong>Key Features:</strong></p>
<ul>
<li>Email management</li>
<li>AI-powered features for email organization and prioritization</li>
</ul>
<p><strong>Technologies:</strong> Next.js, Tailwind CSS, Tinybird, Prisma, Upstash, Turbo, Shadcn/ui</p>
<p><strong>GitHub Stars:</strong> ~3.1k+ <a href="proxy.php?url=https://github.com/elie222/inbox-zero" rel="noopener noreferrer">Check it out from here</a></p>
<p><strong>Why it's great for learning:</strong> Inbox Zero provides insights into building a feature-rich web application with Next.js and integrating AI capabilities.</p>
<h2>
6. OpenResume
</h2>
<p><a href="proxy.php?url=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%2Fwzqmpv5v7oh49pgngvt1.png" class="article-body-image-wrapper"><img src="proxy.php?url=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%2Fwzqmpv5v7oh49pgngvt1.png" alt="OpenResume" width="800" height="348"></a></p>
<p><strong>Description:</strong> An open-source resume builder that helps you create professional resumes.</p>
<p><strong>Key Features:</strong></p>
<ul>
<li>Resume templates</li>
<li>Customization options</li>
<li>PDF export</li>
</ul>
<p><strong>Technologies:</strong> React, Next.js, Redux Toolkit, Tailwind CSS, PDF.js, React-PDF</p>
<p><strong>GitHub Stars:</strong> ~7k+ <a href="proxy.php?url=https://github.com/xitanggg/open-resume" rel="noopener noreferrer">Check it out from here</a></p>
<p><strong>Why it's great for learning:</strong> OpenResume is a good example of how to build a tool with a focus on user experience and design.</p>
<h2>
7. Formbricks
</h2>
<p><a href="proxy.php?url=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%2Fs4ipli5oyfqz7qzd5741.png" class="article-body-image-wrapper"><img src="proxy.php?url=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%2Fs4ipli5oyfqz7qzd5741.png" alt="Formbricks" width="800" height="344"></a></p>
<p><strong>Description:</strong> An open-source survey platform that allows you to create and analyze surveys.</p>
<p><strong>Key Features:</strong></p>
<ul>
<li>Drag-and-drop survey builder</li>
<li>Various question types</li>
<li>Data analytics and reporting</li>
</ul>
<p><strong>Technologies:</strong> Next.js, Tailwind CSS, Auth.js, Prisma, Zod, Vitest</p>
<p><strong>GitHub Stars:</strong> ~9.4k+ <a href="proxy.php?url=https://github.com/formbricks/formbricks" rel="noopener noreferrer">Check it out from here</a></p>
<p><strong>Why it's great for learning:</strong> Formbricks provides insights into building interactive forms and handling user input in Next.js applications.</p>
<h2>
8. Infisical
</h2>
<p><a href="proxy.php?url=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%2Fkwmh92yje2v2hglu8wgd.png" class="article-body-image-wrapper"><img src="proxy.php?url=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%2Fkwmh92yje2v2hglu8wgd.png" alt="Infisical" width="800" height="395"></a></p>
<p><strong>Description:</strong> An open-source secret management platform similar to HashiCorp Vault.</p>
<p><strong>Key Features:</strong></p>
<ul>
<li>Secure storage of sensitive information</li>
<li>Access control</li>
</ul>
<p><strong>Technologies:</strong> React, Next.js, Tailwind CSS, Stripe, Node.js, AWS</p>
<p><strong>GitHub Stars:</strong> ~16k+ <a href="proxy.php?url=https://github.com/Infisical/infisical" rel="noopener noreferrer">Check it out from here</a></p>
<p><strong>Why it's great for learning:</strong> Infisical provides insights into building a secure application with Next.js and handling sensitive data.</p>
<h2>
9. Plane
</h2>
<p><a href="proxy.php?url=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%2F5buun7kf0x7x2l58y4z9.png" class="article-body-image-wrapper"><img src="proxy.php?url=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%2F5buun7kf0x7x2l58y4z9.png" alt="Plane" width="800" height="365"></a></p>
<p><strong>Description:</strong> An open-source Jira alternative for project management.</p>
<p><strong>Key Features:</strong></p>
<ul>
<li>Task management</li>
<li>Issue tracking</li>
<li>Project planning</li>
</ul>
<p><strong>Technologies:</strong> React, Next.js, Tailwind CSS, Node.js, Docker, Django</p>
<p><strong>GitHub Stars:</strong> ~31.3k+ <a href="proxy.php?url=https://github.com/makeplane/plane" rel="noopener noreferrer">Check it out from here</a></p>
<p><strong>Why it's great for learning:</strong> Plane demonstrates how to build a complex web application for project management with Next.js.</p>
<h2>
10. Payload CMS
</h2>
<p><a href="proxy.php?url=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%2Fpn8qfmbbjvy4hptpo9j4.png" class="article-body-image-wrapper"><img src="proxy.php?url=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%2Fpn8qfmbbjvy4hptpo9j4.png" alt="Payload CMS" width="800" height="397"></a></p>
<p><strong>Description:</strong> An open-source, headless CMS built with Node.js, React, and MongoDB. It provides a flexible and powerful way to manage content for your Next.js applications.</p>
<p><strong>Key Features:</strong></p>
<ul>
<li>Intuitive admin panel</li>
<li>Flexible data modeling</li>
<li>GraphQL and REST APIs</li>
<li>Authentication and authorization</li>
</ul>
<p><strong>Technologies:</strong> Next.js, React, Node.js, MongoDB</p>
<p><strong>GitHub Stars:</strong> ~30.4k+ <a href="proxy.php?url=https://github.com/payloadcms/payload" rel="noopener noreferrer">Check it out from here</a></p>
<p><strong>Why it's great for learning:</strong> Payload CMS is a robust project that demonstrates how to build a full-stack application with Next.js and integrate it with a database and a CMS. It showcases advanced concepts like data modeling, API development, and user authentication. It's particularly valuable for learning how to build content-driven websites and web applications.</p>
<p>Thanks for reading this article, I hope you found it helpful. If you are interested in learning and building project using React, Redux and Next.js you can visit my YouTube channel here: <a href="proxy.php?url=https://www.youtube.com/channel/UCeYt6blRBKuNrEg_-282fSA/" rel="noopener noreferrer">CodeBucks</a></p>
<p>Here are my other article that you might like to read:</p>
<ul>
<li><a href="proxy.php?url=https://devdreaming.com/videos/build-ai-saas-app-nextjs-supabase-replicate-stripe" rel="noopener noreferrer">How I Cloned a $1M AI SaaS Application Using Next.js, Supabase, Replicate and Stripe</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/simplify-state-management-with-reactjs-context-api" rel="noopener noreferrer">Simplify State Management with React.js Context API Tutorial</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/nextjs-smooth-scrolling-with-lenis-gsap" rel="noopener noreferrer">How to implement smooth scrolling in Next.js with Lenis and GSAP</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/how-to-get-user-location-in-react-js" rel="noopener noreferrer">How to Get User's Location in React.js</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/top-10-popular-vs-code-themes" rel="noopener noreferrer">Top 10 Popular VS Code Themes You Should Try</a></li>
</ul>
<p>💻Visit my personal blog website from here: <a href="proxy.php?url=https://devdreaming.com/" rel="noopener noreferrer">DevDreaming</a><br>
🐥Follow me on X: <a href="proxy.php?url=https://x.com/code_bucks" rel="noopener noreferrer">@code_bucks</a></p>
webdevprogrammingjavascriptnextjsHow I Cloned a $1M AI SaaS Application Using Next.js, Supabase, Replicate and StripeCodeBucksTue, 10 Dec 2024 14:13:03 +0000
https://dev.to/codebucks/how-i-cloned-a-1m-ai-saas-application-using-nextjs-supabase-replicate-and-stripe-3f8
https://dev.to/codebucks/how-i-cloned-a-1m-ai-saas-application-using-nextjs-supabase-replicate-and-stripe-3f8<p>Have you heard about Pieter Levels’ PhotoAI app making $120k/month? It’s a game-changer in AI-powered professional photography. Inspired by its success, I set out to replicate its core features in a tutorial that combines cutting-edge tech with practical development skills.</p>
<p>This project combines state-of-the-art technologies with practical implementation to help you create a modern, scalable platform for generating professional AI-powered photos.</p>
<p>Watch the full tutorial from here👇</p>
<p><iframe width="710" height="399" src="proxy.php?url=https://www.youtube.com/embed/7AQNeii5K7E">
</iframe>
</p>
<h2>
Key Features of My Clone🔑:
</h2>
<ul>
<li>
<strong>AI-Driven Creativity</strong>: Train custom AI models to generate stunning headshots and social media content. We will use latest image generation model called FLUX. </li>
<li>
<strong>User-Friendly Design</strong>: Clean, modern UI built with shadcn-ui and Tailwind CSS.</li>
<li>
<strong>Business-Ready</strong>: Integrated Stripe payments and Supabase for database/authentication needs.</li>
</ul>
<h2>
What You’ll Learn🛠️:
</h2>
<p>This step-by-step guide will walk you through the entire process of building and deploying Pictoria AI:</p>
<p>🌟 UI Development with Modern Tools:</p>
<ul>
<li>Set up your development environment using Next.js 15, Tailwind CSS, and Shadcn UI to craft a sleek, responsive user interface.</li>
</ul>
<p>🌟 Database Management with Supabase:</p>
<ul>
<li>Implement authentication, storage, and a robust database system with Supabase.</li>
</ul>
<p>🌟 AI Model Training:</p>
<ul>
<li>Use Replicate AI API to train custom AI models on personal images and understand how techniques like LoRA (Low-Rank Adaptation) work to enhance performance. We will use latest image generation model called FLUX. </li>
</ul>
<p>🌟 Payments and Monetization:</p>
<ul>
<li>Set up secure, efficient payment processing with Stripe, and learn how to integrate it seamlessly into your platform.</li>
</ul>
<p>🌟 State Management & Notifications:</p>
<ul>
<li>Efficiently handle application state using Zustand and implement email notifications with Resend to improve user experience.</li>
</ul>
<p>🌟 Handling Long-Running Tasks:</p>
<ul>
<li>Configure webhooks to manage complex tasks in the background without impacting user workflows.</li>
</ul>
<h2>
What Sets This Tutorial Apart?
</h2>
<p>Whether you’re a beginner eager to build your first full-stack app or an experienced developer looking to sharpen your skills, this tutorial has something for everyone. By the end, you’ll have a deployable AI SaaS platform and a deeper understanding of the technologies driving the future of software development.</p>
<h2>
Watch the Demo & Start Building🎥
</h2>
<p>I’ve included a full video walkthrough to make it easy for you to follow along. Whether you’re looking to level up your development skills or create a marketable SaaS, this project is your blueprint.</p>
<h2>
Thanks For Reading😄
</h2>
<p>Checkout my other tutorials:</p>
<ul>
<li><a href="proxy.php?url=https://youtu.be/T5t46vuW8fo" rel="noopener noreferrer">Build a 3D Portfolio Website with Next.js, Three.js & Tailwind CSS</a></li>
<li><a href="proxy.php?url=https://youtu.be/1QGLHOaRLwM" rel="noopener noreferrer">Next.js Blog Tutorial: Build SEO Optimized Blog with Next.js, Contentlayer, and Tailwind CSS 🔥</a></li>
<li><a href="proxy.php?url=https://youtu.be/Yw7yWHigGKI" rel="noopener noreferrer">How to Create a Stunning Portfolio Website with Nextjs, Tailwind CSS and Framer-motion🌟</a></li>
<li><a href="proxy.php?url=https://youtu.be/JPlVb3t6kx8" rel="noopener noreferrer">React Website Tutorial: ⭐Build Feature Rich Crypto Screener App with Tailwind CSS</a></li>
</ul>
<p>Feel free to visit my youtube channel: <a href="proxy.php?url=https://www.youtube.com/channel/UCeYt6blRBKuNrEg_-282fSA" rel="noopener noreferrer">@CodeBucks</a></p>
<p>Checkout my personal blog website: <a href="proxy.php?url=https://devdreaming.com" rel="noopener noreferrer">DevDreaming</a></p>
webdevnextjsaiprogrammingCursor AI Crash Course⚡: boost Your Productivity with AI-Powered CodingCodeBucksTue, 17 Sep 2024 11:32:00 +0000
https://dev.to/codebucks/cursor-ai-crash-course-boost-your-productivity-with-ai-powered-coding-57c9
https://dev.to/codebucks/cursor-ai-crash-course-boost-your-productivity-with-ai-powered-coding-57c9<p>Hey folks! 👋</p>
<p>I've been using Cursor AI since last few weeks, and it's really great for those of us working on webdevelopment projects. This Cursor AI code editor makes coding feel more intuitive, offering multi-file editing, AI code suggestions, and chat assistance that understands your project context. In the tutorial I have created one small Ecom website within few minutes with the help of cursor AI composer. </p>
<p>In this crash course, I explored how you can use Cursor AI to optimize your web-development workflow. </p>
<p>You can checkout the tutorial from here:<br>
<iframe width="710" height="399" src="proxy.php?url=https://www.youtube.com/embed/DZDwnTWig9c">
</iframe>
</p>
<p>Here are few features that I have covered in the video:</p>
<ul>
<li>Multi-line Autocomplete: Easily scaffold pages and components.</li>
<li>AI Chat Debugging: Ask questions about bugs, performance issues, and even best practices!</li>
<li>Multi-file Refactoring: Make changes across multiple files seamlessly.</li>
<li>Cursor AI Composer: This one is my fabourite feature. Basically it can create whole boilerplate code for you based on your text prompt. You can provide the latest documentations and it will give more accurate results. </li>
</ul>
<p>I also demonstrate a few real-world Next.js examples, like setting up dynamic routes and optimizing API calls, creating an ECOM website within few minutes. If you're curious about AI in code, this might be worth a look.</p>
<p>What are your thoughts on using AI in development? Have you tried something like Cursor yet?</p>
<p>Here are my other article that you might like to read:</p>
<ul>
<li><a href="proxy.php?url=https://dev.to/codebucks/simplify-state-management-with-reactjs-context-api-full-guide-20pf">Simplify State Management with React.js Context API Tutorial</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/nextjs-smooth-scrolling-with-lenis-gsap" rel="noopener noreferrer">How to implement smooth scrolling in Next.js with Lenis and GSAP</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/how-to-get-user-location-in-react-js" rel="noopener noreferrer">How to Get User's Location in React.js</a></li>
<li><a href="proxy.php?url=https://devdreaming.com/blogs/top-10-popular-vs-code-themes" rel="noopener noreferrer">Top 10 Popular VS Code Themes You Should Try</a></li>
</ul>
<p>Visit my personal blog website from here: <a href="proxy.php?url=https://devdreaming.com/" rel="noopener noreferrer">DevDreaming</a><br>
Visit my YouTube channel from here: <a href="proxy.php?url=https://www.youtube.com/@CodeBucks" rel="noopener noreferrer">CodeBucks</a></p>
webdevainextjstutorial