<?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: Delpi Kye</title>
    <description>The latest articles on DEV Community by Delpi Kye (@delpi).</description>
    <link>https://dev.to/delpi</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%2F3785444%2Ff10c9e85-aff3-4462-a15e-88285bfb214e.jpg</url>
      <title>DEV Community: Delpi Kye</title>
      <link>https://dev.to/delpi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/delpi"/>
    <language>en</language>
    <item>
      <title>Rethinking React routing: a simpler, more predictable approach</title>
      <dc:creator>Delpi Kye</dc:creator>
      <pubDate>Fri, 27 Mar 2026 04:26:55 +0000</pubDate>
      <link>https://dev.to/delpi/rethinking-react-routing-a-simpler-more-predictable-approach-5eog</link>
      <guid>https://dev.to/delpi/rethinking-react-routing-a-simpler-more-predictable-approach-5eog</guid>
      <description>&lt;h1&gt;
  
  
  I built a modern React router because I was tired of existing ones
&lt;/h1&gt;

&lt;p&gt;Routing in React has always felt… either too simple or too complicated.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some routers feel too minimal — you end up building everything yourself&lt;/li&gt;
&lt;li&gt;Others feel over-engineered — great power, but heavy mental overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built my own.&lt;/p&gt;

&lt;p&gt;👉 Introducing &lt;strong&gt;routexiz&lt;/strong&gt; — a lightweight, modern router for React with a clean mental model.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 The idea: routing as a tree
&lt;/h2&gt;

&lt;p&gt;Instead of thinking in flat routes, &lt;code&gt;routexiz&lt;/code&gt; models your app like a tree.&lt;/p&gt;

&lt;p&gt;Each route is a node.&lt;br&gt;
Navigation resolves a &lt;strong&gt;single path from root to leaf&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Layout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;root&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;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/dashboard&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Dashboard&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dash&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;dash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;guard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;authGuard&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;dash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;trackPageView&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;This gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Natural nested layouts&lt;/li&gt;
&lt;li&gt;Predictable execution&lt;/li&gt;
&lt;li&gt;Clear structure as your app grows&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ Navigation that understands your route
&lt;/h2&gt;

&lt;p&gt;Instead of this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;navigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users/1&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;You write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;navigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users/:id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&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="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No string guessing.&lt;br&gt;
No mismatched paths.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 What makes it different?
&lt;/h2&gt;

&lt;p&gt;I focused on combining things I always wanted in one place:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Suspense-first data loading&lt;/li&gt;
&lt;li&gt;Route-level guards (block navigation)&lt;/li&gt;
&lt;li&gt;Middleware (side effects)&lt;/li&gt;
&lt;li&gt;Prefetch (hover + viewport)&lt;/li&gt;
&lt;li&gt;Loader caching with TTL&lt;/li&gt;
&lt;li&gt;Error boundaries per route&lt;/li&gt;
&lt;li&gt;Built-in transitions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All without making the API complex.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Example: data loading
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users/:id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;params&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;fetchUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useLoaderData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple, predictable, and works with React Suspense.&lt;/p&gt;




&lt;h2&gt;
  
  
  🆚 How is this different?
&lt;/h2&gt;

&lt;p&gt;Very roughly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traditional routers → string-based navigation&lt;/li&gt;
&lt;li&gt;Some modern routers → very powerful, but complex mental model&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;routexiz → tries to balance power + simplicity&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to compete on features alone, but on &lt;strong&gt;developer experience and clarity&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Mental model
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Guard → &lt;em&gt;“Can we enter?”&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Middleware → &lt;em&gt;“Do something while entering”&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This separation keeps things clean as your app grows.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Where I think it shines
&lt;/h2&gt;

&lt;p&gt;From my own usage, this approach feels especially nice when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building dashboards with nested layouts&lt;/li&gt;
&lt;li&gt;Handling auth / permissions cleanly&lt;/li&gt;
&lt;li&gt;Prefetching data for smoother navigation&lt;/li&gt;
&lt;li&gt;Keeping routing logic predictable as the app scales&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚧 Current state
&lt;/h2&gt;

&lt;p&gt;I’ve built most of the core features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Type-safe params&lt;/li&gt;
&lt;li&gt;Nested routing builder&lt;/li&gt;
&lt;li&gt;Devtools (basic)&lt;/li&gt;
&lt;li&gt;React adapter&lt;/li&gt;
&lt;li&gt;Documentation &amp;amp; examples&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But…&lt;/p&gt;

&lt;p&gt;👉 The ecosystem is still very early.&lt;/p&gt;




&lt;h2&gt;
  
  
  🙌 Looking for feedback (and contributors)
&lt;/h2&gt;

&lt;p&gt;If this approach resonates with you, I’d love your feedback:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What feels intuitive?&lt;/li&gt;
&lt;li&gt;What feels off?&lt;/li&gt;
&lt;li&gt;What’s missing for production use?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even better — try it in a small project and break it 😄&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;NPM: &lt;a href="https://www.npmjs.com/package/routexiz" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/routexiz&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live example: &lt;a href="https://codesandbox.io/p/sandbox/2lslks" rel="noopener noreferrer"&gt;https://codesandbox.io/p/sandbox/2lslks&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Final thought
&lt;/h2&gt;

&lt;p&gt;I’m not trying to replace existing routers overnight.&lt;/p&gt;

&lt;p&gt;I just want to explore a simpler, more predictable way to handle routing in modern React.&lt;/p&gt;

&lt;p&gt;If that sounds interesting to you — let’s build it together.&lt;/p&gt;




&lt;p&gt;💬 If you're currently using React Router or another solution,&lt;br&gt;&lt;br&gt;
what's the biggest pain point you have with routing today?&lt;/p&gt;

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