<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gazi Nahian </title>
    <description>The latest articles on DEV Community by Gazi Nahian  (@gazi2050).</description>
    <link>https://dev.to/gazi2050</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1225801%2F7166b518-50e9-403f-9d4f-68202714bd1f.jpg</url>
      <title>DEV Community: Gazi Nahian </title>
      <link>https://dev.to/gazi2050</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gazi2050"/>
    <language>en</language>
    <item>
      <title>The 2025 API List Handbook: Just Dive Into What You Need</title>
      <dc:creator>Gazi Nahian </dc:creator>
      <pubDate>Fri, 20 Jun 2025 10:50:51 +0000</pubDate>
      <link>https://dev.to/gazi2050/the-2025-api-list-handbook-just-dive-into-what-you-need-n6n</link>
      <guid>https://dev.to/gazi2050/the-2025-api-list-handbook-just-dive-into-what-you-need-n6n</guid>
      <description>&lt;p&gt;Whether you're building a blazing-fast microservice, a real-time multiplayer app, or just trying to make two legacy systems shake hands your API choices matter.&lt;/p&gt;

&lt;p&gt;But with so many options — REST, GraphQL, gRPC, WebSockets, JSON-RPC, SSE, and even SOAP — it’s easy to get lost in the buzzwords.&lt;/p&gt;

&lt;p&gt;This blog cuts through the noise.&lt;/p&gt;

&lt;p&gt;We’ll walk you through every major API style in 2025 — what they are, when to use them, why they matter, and what tools can help you ship faster.&lt;/p&gt;

&lt;p&gt;Let’s get into it.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧩 API Styles at a Glance
&lt;/h2&gt;

&lt;p&gt;Let’s start with a birds-eye comparison of today’s API flavors.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API Style&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Realtime&lt;/th&gt;
&lt;th&gt;Popularity (2025)&lt;/th&gt;
&lt;th&gt;Trend&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Resource-based&lt;/td&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;🔁 Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GraphQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Query language&lt;/td&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;⚠️ (via Subscriptions)&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐☆&lt;/td&gt;
&lt;td&gt;🔼 Growing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;gRPC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RPC&lt;/td&gt;
&lt;td&gt;Protobuf&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;🔼 Growing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WebSockets&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Event-driven&lt;/td&gt;
&lt;td&gt;Any (JSON/msg)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;🔁 Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SOAP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Protocol-based&lt;/td&gt;
&lt;td&gt;XML&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;td&gt;🔽 Declining&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stream-based&lt;/td&gt;
&lt;td&gt;Text/JSON&lt;/td&gt;
&lt;td&gt;✅ (1-way)&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;td&gt;🔁 Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JSON-RPC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RPC&lt;/td&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;td&gt;🔽 Fading&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Falcor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Virtual JSON graph&lt;/td&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌ (inactive)&lt;/td&gt;
&lt;td&gt;🔻 Obsolete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OData&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Queryable REST&lt;/td&gt;
&lt;td&gt;JSON/XML&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;⭐⭐☆&lt;/td&gt;
&lt;td&gt;🔁 Stable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  🔍 API Styles in Detail (With Dev Opinions)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 🧱 &lt;strong&gt;REST — The OG&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Works everywhere, everyone knows it, won’t die anytime soon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it for&lt;/strong&gt;: Anything web/mobile. Public APIs. Quick MVPs. Stable backends.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Go-to tools&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://expressjs.com/" rel="noopener noreferrer"&gt;Express.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fastapi.tiangolo.com/" rel="noopener noreferrer"&gt;FastAPI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://spring.io/projects/spring-boot" rel="noopener noreferrer"&gt;Spring Boot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.django-rest-framework.org/" rel="noopener noreferrer"&gt;Django REST Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://axios-http.com/" rel="noopener noreferrer"&gt;Axios&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dev vibe&lt;/strong&gt;: Boring but battle-tested.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 🧠 &lt;strong&gt;GraphQL — Query Only What You Need&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Stop overfetching and underfetching. Write one query, get exactly what you need. No more, no less.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it for&lt;/strong&gt;: SPAs, mobile apps, headless CMSs, custom UIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Awesome tools&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.apollographql.com/docs/apollo-server/" rel="noopener noreferrer"&gt;Apollo Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://the-guild.dev/graphql/yoga-server" rel="noopener noreferrer"&gt;GraphQL Yoga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nexusjs.org/" rel="noopener noreferrer"&gt;Nexus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.apollographql.com/docs/react/" rel="noopener noreferrer"&gt;Apollo Client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://formidable.com/open-source/urql/" rel="noopener noreferrer"&gt;urql&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dev vibe&lt;/strong&gt;: Elegant but occasionally finicky. Not great for simple CRUD.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. 🚀 &lt;strong&gt;gRPC — Fast, Binary, and a Bit Nerdy&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: If your services are chatting 24/7, gRPC is your friend. It’s fast, efficient, and made for microservices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it for&lt;/strong&gt;: Backend-to-backend, real-time pipelines, internal APIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you’ll use&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grpc.io/docs/" rel="noopener noreferrer"&gt;gRPC Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://protobuf.dev/" rel="noopener noreferrer"&gt;Protobuf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grpc.io/docs/languages/node/" rel="noopener noreferrer"&gt;gRPC for Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grpc.io/docs/languages/go/" rel="noopener noreferrer"&gt;gRPC for Go&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dev vibe&lt;/strong&gt;: Low-level power user mode. Not for hobbyists.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. 💬 &lt;strong&gt;WebSockets — Real-time All the Time&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Two-way communication that’s &lt;em&gt;actually&lt;/em&gt; real-time. Great for anything live.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it for&lt;/strong&gt;: Chat apps, multiplayer games, dashboards, collab tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Top tools&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/websockets/ws" rel="noopener noreferrer"&gt;ws&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://socket.io/" rel="noopener noreferrer"&gt;Socket.IO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/uNetworking/uWebSockets" rel="noopener noreferrer"&gt;uWebSockets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/aspnet/core/signalr/introduction" rel="noopener noreferrer"&gt;SignalR (ASP.NET)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dev vibe&lt;/strong&gt;: Feels magical when it works. Nightmare when it doesn’t.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. 🏛️ &lt;strong&gt;SOAP — Still Haunting Enterprises in 2025&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Verbose, rigid, XML-powered — but still clinging on in gov/finance sectors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it for&lt;/strong&gt;: Legacy enterprise systems, banking, bureaucracy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Old-school gear&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cxf.apache.org/" rel="noopener noreferrer"&gt;Apache CXF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://spring.io/projects/spring-ws" rel="noopener noreferrer"&gt;Spring WS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/framework/wcf/" rel="noopener noreferrer"&gt;.NET WCF&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dev vibe&lt;/strong&gt;: XML PTSD.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. 📡 &lt;strong&gt;SSE — Server Push, No Frills&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Simple one-way communication. Just enough for stock tickers or updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it for&lt;/strong&gt;: Dashboards, price feeds, notifications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minimal tooling&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/EventSource" rel="noopener noreferrer"&gt;EventSource API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dpskvn/express-sse" rel="noopener noreferrer"&gt;Express SSE Example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.baeldung.com/spring-server-sent-events" rel="noopener noreferrer"&gt;Spring SSE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dev vibe&lt;/strong&gt;: Lightweight, no reconnection magic, but gets the job done.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. 📜 &lt;strong&gt;JSON-RPC — The Quiet One&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Lightweight, underrated, still alive thanks to crypto APIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it for&lt;/strong&gt;: Blockchain, lightweight internal comms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Helpful tools&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.jsonrpc.org/specification" rel="noopener noreferrer"&gt;JSON-RPC Spec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/json-rpc/" rel="noopener noreferrer"&gt;json-rpc-python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dev vibe&lt;/strong&gt;: Sleek and silent. Not cool, but effective.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. 🪦 &lt;strong&gt;Falcor — Netflix’s Ghost&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Neat idea. Didn’t stick. Basically replaced by GraphQL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Was used for&lt;/strong&gt;: Virtual JSON graph querying.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project links&lt;/strong&gt; (for archaeology):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Netflix/falcor" rel="noopener noreferrer"&gt;Falcor GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Netflix/falcor-router" rel="noopener noreferrer"&gt;Falcor Router&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dev vibe&lt;/strong&gt;: R.I.P.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. 🧾 &lt;strong&gt;OData — REST with a Query Language&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: SQL-ish query power over HTTP. Used where Microsoft walks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it for&lt;/strong&gt;: Dynamics, SAP, .NET heavy systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Go-to resources&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.odata.org/" rel="noopener noreferrer"&gt;OData.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/odata/" rel="noopener noreferrer"&gt;OData .NET&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dev vibe&lt;/strong&gt;: Niche but powerful — if you’re stuck with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  📊 TL;DR Developer Cheat Sheet
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you're building...&lt;/th&gt;
&lt;th&gt;Use this API style 👇&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;General-purpose web/mobile app&lt;/td&gt;
&lt;td&gt;REST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend-heavy SPA / CMS&lt;/td&gt;
&lt;td&gt;GraphQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internal service-to-service&lt;/td&gt;
&lt;td&gt;gRPC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live chat, dashboards, games&lt;/td&gt;
&lt;td&gt;WebSockets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise or legacy integrations&lt;/td&gt;
&lt;td&gt;SOAP / OData&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crypto &amp;amp; blockchain&lt;/td&gt;
&lt;td&gt;JSON-RPC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  📌 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Choosing the right API method in 2025 is like picking your weapon in a boss fight. Each has strengths, quirks, and ideal scenarios.&lt;/p&gt;

&lt;p&gt;Whether you’re launching the next unicorn startup or keeping old systems alive, the right protocol can make or break your architecture. Stay informed, pick what works, and don't be afraid to mix-and-match.&lt;/p&gt;

&lt;p&gt;👉 Happy coding. May your 200s be plentiful and your payloads always valid.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why I Love Svelte: A Developer’s Perspective</title>
      <dc:creator>Gazi Nahian </dc:creator>
      <pubDate>Mon, 09 Jun 2025 19:19:34 +0000</pubDate>
      <link>https://dev.to/gazi2050/why-i-love-svelte-a-developers-perspective-4816</link>
      <guid>https://dev.to/gazi2050/why-i-love-svelte-a-developers-perspective-4816</guid>
      <description>&lt;p&gt;Hey fellow developers,&lt;/p&gt;

&lt;p&gt;If you’re a web developer, you’ve probably heard of &lt;strong&gt;Svelte&lt;/strong&gt;&lt;br&gt;
the modern framework that’s rewriting how we build user interfaces. Unlike traditional frontend frameworks, Svelte compiles your app into highly optimized JavaScript at build time, delivering lightning-fast performance with minimal runtime overhead.&lt;/p&gt;

&lt;p&gt;And with &lt;strong&gt;SvelteKit&lt;/strong&gt;, it’s not just UI anymore. It’s a full-stack framework that handles routing, server-side rendering, API routes, static site generation, and more — all while keeping things simple and fast.&lt;/p&gt;
&lt;h2&gt;
  
  
  My Svelte Journey
&lt;/h2&gt;

&lt;p&gt;I’ve been working with Svelte for over six months, from just before Svelte 4 through Svelte 5. Honestly, it’s been one of the most refreshing developer experiences I’ve had.&lt;/p&gt;

&lt;p&gt;Why? Because Svelte doesn’t trap you in heavy ecosystems or rigid patterns. It’s just clean JavaScript, enhanced by features like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reactive variables that feel natural&lt;/li&gt;
&lt;li&gt;Scoped CSS with zero fuss&lt;/li&gt;
&lt;li&gt;Built-in animations&lt;/li&gt;
&lt;li&gt;Simple state management without extra libraries&lt;/li&gt;
&lt;li&gt;Full-stack power through SvelteKit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It really feels like it was built &lt;strong&gt;for developers&lt;/strong&gt; — focused on speed, simplicity, and productivity.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Makes Svelte Different?
&lt;/h2&gt;

&lt;p&gt;Unlike React or Vue, which use virtual DOMs, Svelte is a &lt;strong&gt;compiler&lt;/strong&gt;. It transforms your components into plain JavaScript that updates the DOM directly. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smaller bundles&lt;/li&gt;
&lt;li&gt;Faster performance&lt;/li&gt;
&lt;li&gt;Less runtime complexity&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  SvelteKit: Full-Stack Made Simple
&lt;/h2&gt;

&lt;p&gt;Think of SvelteKit as Svelte’s big sibling — a full-stack framework similar to Next.js. It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File-based routing&lt;/li&gt;
&lt;li&gt;Server-side rendering (SSR)&lt;/li&gt;
&lt;li&gt;Static site generation (SSG)&lt;/li&gt;
&lt;li&gt;API routes&lt;/li&gt;
&lt;li&gt;Deployment adapters for platforms like Vercel and Netlify&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes building modern web apps — frontend and backend — a breeze.&lt;/p&gt;
&lt;h2&gt;
  
  
  Who’s Using Svelte?
&lt;/h2&gt;

&lt;p&gt;Svelte isn’t just a niche tool — it’s gaining traction among some of the biggest names in tech. According to &lt;a href="https://www.linkedin.com/posts/eldadfux_notable-companies-using-svelte-apple-ikea-activity-7264365395480887296-2d-p/" rel="noopener noreferrer"&gt;this LinkedIn post by Eldad Fux&lt;/a&gt;, companies like Apple, IKEA, and others are using Svelte in production.&lt;/p&gt;

&lt;p&gt;This proves Svelte is &lt;strong&gt;production-ready&lt;/strong&gt; and trusted by industry leaders.&lt;/p&gt;
&lt;h2&gt;
  
  
  React vs Svelte: State Management Made Easy
&lt;/h2&gt;

&lt;p&gt;Check out how simple managing state is in Svelte compared to React:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;React:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      Clicked &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; times
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Svelte:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight svelte"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onClick=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Clicked &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; times
&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Svelte’s reactivity is automatic — simply update the variable, and the UI updates instantly. No hooks or setters are needed. Plus, with Svelte 5, you can take advantage of runes, a powerful new feature that adds even more flexibility and magic to reactive programming.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Svelte Stands Out
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No virtual DOM overhead&lt;/strong&gt; — direct DOM updates for better speed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Readable, minimal code&lt;/strong&gt; with built-in reactivity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast load times&lt;/strong&gt; thanks to smaller bundles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in animations&lt;/strong&gt; without extra dependencies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SvelteKit&lt;/strong&gt; seamlessly handles frontend and backend&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Developer Experience Matters
&lt;/h2&gt;

&lt;p&gt;What I love most about Svelte is how it improves the developer experience. When coding feels smooth and intuitive, your work becomes more enjoyable — and the apps you build get better.&lt;/p&gt;

&lt;p&gt;With clean syntax and minimal boilerplate, Svelte lets you focus on solving problems instead of wrestling the framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;After working with React and Svelte, Svelte is the first framework that truly feels intuitive and empowering. Big names like Apple, IKEA, Cloudflare, and Stack Overflow use it in production — it’s not just hype.&lt;/p&gt;

&lt;p&gt;If you haven’t tried Svelte yet, give it a go. You might just fall in love.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>PackSmith: A minimal library for building packages.🚀</title>
      <dc:creator>Gazi Nahian </dc:creator>
      <pubDate>Thu, 15 May 2025 19:57:21 +0000</pubDate>
      <link>https://dev.to/gazi2050/packsmith-a-minimal-library-for-building-packages-4o6a</link>
      <guid>https://dev.to/gazi2050/packsmith-a-minimal-library-for-building-packages-4o6a</guid>
      <description>&lt;h2&gt;
  
  
  🚀 Build Lightning-Fast JavaScript/TypeScript Packages — Minus the Boilerplate
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tired of wasting hours setting up the same configs over and over again?&lt;/strong&gt;&lt;br&gt;
You're not alone.&lt;/p&gt;

&lt;p&gt;Creating clean, reusable JS/TS packages &lt;strong&gt;should&lt;/strong&gt; be easy — but it often turns into a slog: wiring up TypeScript, ESLint, test runners, bundlers, folder structures... every time. 😩&lt;/p&gt;

&lt;p&gt;What if you could skip all of that and jump straight into coding?&lt;/p&gt;
&lt;h3&gt;
  
  
  Meet &lt;strong&gt;PackSmith&lt;/strong&gt; — a minimal, opinionated library for building modern JS/TS packages.
&lt;/h3&gt;

&lt;p&gt;No framework lock-in. No fluff. Just fast, clean, production-ready packages.&lt;/p&gt;
&lt;h2&gt;
  
  
  ⚒️ What Is PackSmith?
&lt;/h2&gt;

&lt;p&gt;PackSmith is a lightweight &lt;strong&gt;CLI + library&lt;/strong&gt; that helps you scaffold and build framework-agnostic packages — ideal for utilities, SDKs, helpers, and core modules.&lt;/p&gt;

&lt;p&gt;Run one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-packsmith &amp;lt;project-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you're ready to go with:&lt;/p&gt;

&lt;p&gt;✅ TypeScript + ESLint + Vitest + TSUP&lt;br&gt;
✅ Clean folder structure&lt;br&gt;
✅ Handy &lt;code&gt;build&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, and &lt;code&gt;lint&lt;/code&gt; scripts&lt;br&gt;
✅ Built-in utilities (no extra dependencies needed!)&lt;br&gt;
✅ Zero clutter — just your code&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 Why PackSmith?
&lt;/h2&gt;

&lt;p&gt;Most tools today are built for apps using frameworks like React, Vue, or Svelte. But if you're building &lt;strong&gt;reusable libraries&lt;/strong&gt; — especially for backend or cross-platform environments — the setup can be repetitive and frustrating.&lt;/p&gt;

&lt;p&gt;PackSmith is built specifically for &lt;strong&gt;library authors&lt;/strong&gt; who want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Preconfigured TypeScript and linting&lt;/li&gt;
&lt;li&gt;A test runner that just works&lt;/li&gt;
&lt;li&gt;No need to copy configs from old repos&lt;/li&gt;
&lt;li&gt;A clean structure with no extra fluff&lt;/li&gt;
&lt;li&gt;Minimal, type-safe utility functions built in&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧰 Comes With Built-in Utilities
&lt;/h2&gt;

&lt;p&gt;PackSmith includes type-safe, dependency-free utilities to speed up development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Validation helpers&lt;/li&gt;
&lt;li&gt;✅ Array and string manipulation functions&lt;/li&gt;
&lt;li&gt;✅ Small, focused functions — no bloat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fewer dependencies = smaller bundles + less to maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  🗂️ Example Project Layout
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-package/
├── .gitignore            # Git ignore rules
├── .npmignore            # Controls which files are published
├── eslint.config.mjs     # ESLint configuration
├── node_modules/         # Installed dependencies
├── package-lock.json     # npm lockfile
├── package.json          # Project metadata and scripts
├── README.md             # Project documentation
├── src/                  # Source code lives here
│   └── index.ts          # Entry point of your package
├── test/                 # Unit tests
│   └── index.test.ts     # Example test with Vitest
├── dist/                 # Build output (auto-generated by TSUP)
├── tsconfig.json         # TypeScript configuration
├── tsup.config.ts        # Build setup (TSUP)
└── vitest.config.ts      # Test runner config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clean. Predictable. Production-ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  👤 Who Should Use This?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Solo developers who want to skip boilerplate&lt;/li&gt;
&lt;li&gt;Open-source maintainers who value clean tooling&lt;/li&gt;
&lt;li&gt;Teams that need a repeatable, lightweight foundation for internal libraries&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;PackSmith&lt;/strong&gt; helps you build framework-agnostic JavaScript/TypeScript packages quickly — so you spend less time configuring, and more time creating.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://packsmith.vercel.app/" rel="noopener noreferrer"&gt;Read the Docs&lt;/a&gt;&lt;br&gt;
⭐ &lt;a href="https://github.com/pack-smith/PackSmith" rel="noopener noreferrer"&gt;Star PackSmith on GitHub&lt;/a&gt;&lt;br&gt;
💬 Got feedback or ideas? Drop a comment or open an issue!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let’s build smarter, not harder. Say goodbye to setup hell — and hello to PackSmith. ✨&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Dive into APIs: REST, SOAP, GraphQL &amp; WebSocket</title>
      <dc:creator>Gazi Nahian </dc:creator>
      <pubDate>Wed, 26 Feb 2025 15:53:33 +0000</pubDate>
      <link>https://dev.to/gazi2050/dive-into-apis-rest-soap-graphql-websocket-k1</link>
      <guid>https://dev.to/gazi2050/dive-into-apis-rest-soap-graphql-websocket-k1</guid>
      <description>&lt;p&gt;APIs are the magic bridges connecting apps and data! But which one should you use? Let's break it down with code examples that’ll make you go, “Oh, that’s cool!” 😃&lt;/p&gt;




&lt;h2&gt;
  
  
  1️⃣ REST API – The Classic
&lt;/h2&gt;

&lt;p&gt;A widely used web API architecture that operates over HTTP and uses URLs for resource identification. It primarily relies on standard HTTP methods like &lt;strong&gt;GET, POST, PUT, DELETE&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Quick REST API (Node.js &amp;amp; Express)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;books&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;JavaScript Magic&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; }];&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/books&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;books&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;📡 REST API running on port 8080!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2️⃣ SOAP API – Old but Gold 💎
&lt;/h2&gt;

&lt;p&gt;SOAP is a protocol for exchanging structured information, often used in &lt;strong&gt;enterprise applications&lt;/strong&gt;. It uses &lt;strong&gt;XML&lt;/strong&gt; for messages and enforces a strict structure, making it &lt;strong&gt;secure and reliable&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Sample SOAP Request
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;soapenv:Envelope&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;soapenv:Body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;GetBook&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;ID&amp;gt;&lt;/span&gt;1&lt;span class="nt"&gt;&amp;lt;/ID&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/GetBook&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/soapenv:Body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/soapenv:Envelope&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3️⃣ GraphQL – The Customizer 🛠️
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;query language&lt;/strong&gt; for APIs that allows clients to request specific data, avoiding over-fetching. Clients define the structure of the response, making it &lt;strong&gt;flexible and efficient&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Query Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📝 Tiny GraphQL API (Node.js)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ApolloServer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;gql&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;apollo-server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;typeDefs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;gql&lt;/span&gt;&lt;span class="s2"&gt;`
  type Book { id: ID, title: String }
  type Query { books: [Book] }
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resolvers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;books&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JavaScript Magic&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ApolloServer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;typeDefs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;resolvers&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;⚡ GraphQL API running on port 4000!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4️⃣ WebSocket – Real-time Magic! 🎩✨
&lt;/h2&gt;

&lt;p&gt;Enables &lt;strong&gt;real-time, two-way communication&lt;/strong&gt; between the client and server over a persistent connection. Commonly used in &lt;strong&gt;chat apps, gaming, and live notifications&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 WebSocket Server (Node.js)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;WebSocket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ws&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;connection&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;socket&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🎉 Welcome to WebSocket!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📝 WebSocket Client
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;socket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ws://localhost:8080&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;📩 Message received:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎯 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Each API has its &lt;strong&gt;superpowers&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;REST&lt;/strong&gt; – Simple &amp;amp; scalable 🏗️&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SOAP&lt;/strong&gt; – Secure &amp;amp; reliable 🔒&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GraphQL&lt;/strong&gt; – Flexible &amp;amp; efficient 🎛️&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebSocket&lt;/strong&gt; – Real-time &amp;amp; interactive ⚡&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choose the right tool for the job! 🔥&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Make Voting Fun With Code</title>
      <dc:creator>Gazi Nahian </dc:creator>
      <pubDate>Sat, 23 Nov 2024 18:17:33 +0000</pubDate>
      <link>https://dev.to/gazi2050/make-voting-fun-with-code-30ap</link>
      <guid>https://dev.to/gazi2050/make-voting-fun-with-code-30ap</guid>
      <description>&lt;h2&gt;
  
  
  🚀 &lt;strong&gt;Say Hello to react-votecom!&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Need an easy way to add voting features to your React app? Look no further! &lt;strong&gt;react-votecom&lt;/strong&gt; is here to make your life simpler. Whether you're building a voting system or anything with upvotes and downvotes, this package has you covered.  &lt;/p&gt;




&lt;h2&gt;
  
  
  📦 &lt;strong&gt;Getting Started in Seconds!&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;First, install the package:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Done? Awesome. You’re ready to roll!  &lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 &lt;strong&gt;What is react-votecom?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Think of &lt;strong&gt;react-votecom&lt;/strong&gt; as your personal voting assistant. It’s a package with smart, reusable functions that take care of all the messy logic for managing votes.  &lt;/p&gt;

&lt;p&gt;Here’s what you can do:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🟢 &lt;strong&gt;Upvotes&lt;/strong&gt; and 🔴 &lt;strong&gt;Downvotes&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;🎯 Calculate percentages of votes.
&lt;/li&gt;
&lt;li&gt;🧮 Keep track of total counts effortlessly.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 &lt;strong&gt;Demo Time!&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Want to see it in action? &lt;a href="https://react-votecom-demo1.surge.sh" rel="noopener noreferrer"&gt;Check out the demo&lt;/a&gt;.  &lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ &lt;strong&gt;How Does It Work?&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🌟 &lt;strong&gt;Two Main Functions&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;separateVotingFunction&lt;/code&gt;&lt;/strong&gt;: Tracks upvotes and downvotes separately.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;combinedVotingFunction&lt;/code&gt;&lt;/strong&gt;: Combines votes into a total count and calculates percentages.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For more exciting features and detailed documentation, visit our &lt;a href="https://github.com/Gazi2050/react-votecom" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; or &lt;a href="https://www.npmjs.com/package/react-votecom" rel="noopener noreferrer"&gt;npm site&lt;/a&gt;  &lt;/p&gt;




&lt;h2&gt;
  
  
  🖥️ &lt;strong&gt;How to Use react-votecom&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🛠️ &lt;strong&gt;Option 1: Combined Voting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;One function, all the votes, plus dynamic percentages.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;combinedVotingFunction&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-votecom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setStats&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;  
    &lt;span class="na"&gt;upvotes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
    &lt;span class="na"&gt;downvotes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
    &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
    &lt;span class="na"&gt;upvotePercentage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
    &lt;span class="na"&gt;downvotePercentage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
  &lt;span class="p"&gt;});&lt;/span&gt;  

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;savedStats&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;votingStats&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;savedStats&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;setStats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;savedStats&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;  

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;votingStats&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;  

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleVote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;updatedStats&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;combinedVotingFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
    &lt;span class="nf"&gt;setStats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;updatedStats&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
  &lt;span class="p"&gt;};&lt;/span&gt;  

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;  
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;  
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;React Voting Made Easy&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;  
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleVote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;upvote&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;👍 Upvote&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;  
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleVote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;downvote&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;👎 Downvote&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;  
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Total Votes: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;  
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Upvotes: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;upvotePercentage&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;%&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;  
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Downvotes: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;downvotePercentage&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;%&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;  
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;  
  &lt;span class="p"&gt;);&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🛠️ &lt;strong&gt;Option 2: Separate Voting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Handle upvotes and downvotes individually.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;separateVotingFunction&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-votecom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setStats&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;upvotes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;downvotes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;  

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;savedStats&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;votingStats&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;savedStats&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;setStats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;savedStats&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;  

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;votingStats&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;  

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleUpvote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setStats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;separateVotingFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;upvote&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleDownvote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setStats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;separateVotingFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;downvote&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;  
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;  
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;React Voting Made Easy&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;  
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleUpvote&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;👍 Upvote&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;  
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleDownvote&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;👎 Downvote&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;  
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Upvotes: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;upvotes&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;  
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Downvotes: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;downvotes&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;  
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;  
  &lt;span class="p"&gt;);&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎉 &lt;strong&gt;What Are You Waiting For?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Add &lt;strong&gt;react-votecom&lt;/strong&gt; to your project today and say goodbye to the hassle of managing votes manually.  &lt;/p&gt;

&lt;p&gt;✨ Happy coding! ✨  &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Clean Up Your Code: No More Try-Catch!</title>
      <dc:creator>Gazi Nahian </dc:creator>
      <pubDate>Mon, 07 Oct 2024 13:57:05 +0000</pubDate>
      <link>https://dev.to/gazi2050/clean-up-your-code-no-more-try-catch-109m</link>
      <guid>https://dev.to/gazi2050/clean-up-your-code-no-more-try-catch-109m</guid>
      <description>&lt;h2&gt;
  
  
  No More Try-Catch in JavaScript
&lt;/h2&gt;

&lt;p&gt;Error Handling Made Easy If you’ve ever had to deal with try-catch in JavaScript, you know it can quickly get messy, especially when working with async operations like fetch. It clutters your code and doesn’t feel as elegant as modern JavaScript should. What if I told you that there’s a cleaner, more readable approach? And what if we could write async code without the hassle of wrapping everything in try-catch?&lt;/p&gt;

&lt;p&gt;Let’s dive into an alternative pattern that simplifies error handling in JavaScript, using a concept we could call "error-first destructuring."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; Try-Catch Everywhere&lt;br&gt;
Take a look at a typical async operation using try-catch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error fetching data:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s not terrible, but as the number of async calls grows, so do the try-catch blocks. Your code becomes cluttered with repetitive patterns, making it harder to read and maintain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; Error-First Destructuring with a New Operator&lt;br&gt;
Let’s imagine we could improve the pattern. What if you could destructure your fetch result into error and response values, skipping the try-catch and focusing only on handling the outcome? Something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looks cleaner, right? We’re imagining a new operator here, the ?= (safe assignment operator for destructuring), which assigns values while keeping potential errors separate. The idea is that the left side could hold [error, result] without needing a bulky try-catch block.&lt;/p&gt;

&lt;p&gt;Now, this isn’t real JavaScript syntax (yet!), but let’s break down how this could work and why it’s interesting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it Could Work&lt;/strong&gt;&lt;br&gt;
Imagine fetch returns either an error or a result, wrapped in a tuple-like structure. Using ?=, you could destructure both the error and the response in one clean line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Success:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Here’s the magic&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the fetch call fails, err is populated with the error, and res is undefined.&lt;br&gt;
If it succeeds, res holds the data, and err remains undefined.&lt;br&gt;
No need for try-catch. It’s concise, easy to follow, and, dare I say, elegant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-World Example with Promise Wrapper&lt;/strong&gt;&lt;br&gt;
While the ?= operator isn’t yet part of JavaScript, you can mimic this behavior by wrapping your async calls in a utility function. Let’s write a simple wrapper function that returns [error, result] for any promise.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;promise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;promise&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you can use it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error fetching data:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Fetched data:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s already a lot cleaner! No more cluttered try-catch blocks, and the code is still easy to read and maintain. If there’s an error, you deal with it explicitly without wrapping everything in try-catch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why You’ll Love This Approach
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Cleaner code:&lt;/strong&gt; By separating concerns (error handling vs. result handling), your code becomes more readable and maintainable.&lt;br&gt;
Less nesting: With this approach, there’s no need for nested try-catch blocks or chained .then calls that can make code harder to follow.&lt;br&gt;
&lt;strong&gt;Focus on logic:&lt;/strong&gt; Your code focuses on the logic itself, rather than constantly switching context to handle errors.&lt;br&gt;
Is This the Future of JavaScript?&lt;br&gt;
While ?= isn’t an official part of JavaScript (yet!), the concept behind it is worth exploring. JavaScript is constantly evolving, and with the growing desire for cleaner and more concise syntax, who knows what’s coming next? In the meantime, using utility functions like to is a powerful pattern you can adopt today for a cleaner async experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrapping Up&lt;/strong&gt;&lt;br&gt;
By adopting patterns like error-first destructuring, you can say goodbye to the clutter of try-catch blocks and welcome a more readable, elegant codebase. While ?= remains a fun "what if?" for now, you can start using the to() utility function to mimic this behavior and transform the way you handle errors in your async JavaScript code.&lt;/p&gt;

&lt;p&gt;Happy coding, and may your fetch calls always be error-free! 😎&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
