<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: as nara</title>
    <description>The latest articles on Forem by as nara (@as_nara_ea5f976979e72cea6).</description>
    <link>https://forem.com/as_nara_ea5f976979e72cea6</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%2F1795202%2F1ac55311-cfe9-4e6d-bf16-6570653a4cb1.png</url>
      <title>Forem: as nara</title>
      <link>https://forem.com/as_nara_ea5f976979e72cea6</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/as_nara_ea5f976979e72cea6"/>
    <language>en</language>
    <item>
      <title>The simplicity is complicated.</title>
      <dc:creator>as nara</dc:creator>
      <pubDate>Tue, 14 Apr 2026 08:28:43 +0000</pubDate>
      <link>https://forem.com/as_nara_ea5f976979e72cea6/the-simplicity-is-complicated-499i</link>
      <guid>https://forem.com/as_nara_ea5f976979e72cea6/the-simplicity-is-complicated-499i</guid>
      <description>&lt;p&gt;I’ve worked with React since the Create React App days—then moved on to Next.js, Remix, and later Vike.&lt;/p&gt;

&lt;p&gt;Along the way, I picked up a lot of best practices to solve real-world company problems while still keeping a solid developer experience—things like SSR, CSR, hooks, state management, and atomic component design.&lt;/p&gt;

&lt;p&gt;Then about a year ago, I got a project with very different constraints:&lt;/p&gt;

&lt;p&gt;full server-side only&lt;br&gt;
strictly using Express.js&lt;br&gt;
single port setup&lt;/p&gt;

&lt;p&gt;At first, I tried to keep React in the stack by using it just for the frontend instead of a traditional templating engine.&lt;/p&gt;

&lt;p&gt;But then the requirement changed: “zero build” project.&lt;/p&gt;

&lt;p&gt;Just:&lt;/p&gt;

&lt;p&gt;npm start&lt;/p&gt;

&lt;p&gt;…and it should run in production.&lt;/p&gt;

&lt;p&gt;At that point, React was no longer viable. Even without TypeScript, it still requires a build step. Using CDN wasn’t an option either.&lt;/p&gt;

&lt;p&gt;After a lot of research, experimenting, and even brainstorming with AI—trying different libraries and approaches—I ended up going with EJS + Alpine.js.&lt;/p&gt;

&lt;p&gt;Fully server-driven.&lt;/p&gt;

&lt;p&gt;No client-side rendering, no Redux or heavy state management, no complex routing layer on the frontend. And honestly, the best part: no CORS headaches and no hydration issues.&lt;/p&gt;

&lt;p&gt;What surprised me is that most of what I used to do with React… I can still achieve with Alpine. Component modularity is handled cleanly through EJS includes.&lt;/p&gt;

&lt;p&gt;And it got me thinking:&lt;/p&gt;

&lt;p&gt;Are we sometimes just creating complexity for problems that were already solved?&lt;/p&gt;

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