<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Hono auf cbrueggenolte.de</title>
    <link>https://cbrueggenolte.de/tags/hono/</link>
    <description>Neueste Beiträge in Hono auf cbrueggenolte.de</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>de-DE</language>
    <managingEditor>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</managingEditor>
    <webMaster>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</webMaster>
    <copyright>2018-2026 cbrueggenolte</copyright>
    <lastBuildDate>Thu, 01 May 2025 00:00:00 +0200</lastBuildDate>
    <atom:link href="https://cbrueggenolte.de/tags/hono/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Bun, Hono, TailwindCSS, JSX: Eine tolle Kombination!</title>
      <link>https://cbrueggenolte.de/bun-hono-tailwindcss-jsx-eine-tolle-kombination/</link>
      <pubDate>Thu, 01 May 2025 00:00:00 +0200</pubDate><author>96ca5227@cbrueggenolte.de (cbrueggenolte.de)</author>
      <guid>https://cbrueggenolte.de/bun-hono-tailwindcss-jsx-eine-tolle-kombination/</guid>
      <description>&lt;h2 id=&#34;einleitung&#34;&gt;Einleitung&lt;/h2&gt;&#xA;&lt;p&gt;Ich hänge immer noch ein wenig im Bootcamp hinterher.&#xA;Da ich die Aufgaben aber nicht schleifen lassen will, habe ich mir gestern einen kleinen Plan aufgestellt,&#xA;um mein Projekt zu pushen: Es soll ein einfacher Filament-Manager werden,&#xA;mit dem ich meine Spulen und deren Eigenschaften verwalten kann.&lt;/p&gt;&#xA;&lt;p&gt;Da ich das nicht mit Astro, sondern mit &lt;a href=&#34;https://bun.sh&#34;&gt;Bun&lt;/a&gt;, &lt;a href=&#34;https://hono.dev&#34;&gt;Hono&lt;/a&gt;&#xA;und &lt;a href=&#34;https://tailwindcss.com&#34;&gt;TailwindCSS&lt;/a&gt; umsetzen möchte, stellte sich die Frage:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Wie kann ich TailwindCSS in mein Projekt integrieren?&lt;/strong&gt;&#xA;Für viele Frameworks gibt es entsprechende Plugins – aber für Bun und Hono leider nicht.&#xA;Nach langem Suchen und Ausprobieren habe ich aber endlich eine Lösung gefunden!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="einleitung">Einleitung</h2>
<p>Ich hänge immer noch ein wenig im Bootcamp hinterher.
Da ich die Aufgaben aber nicht schleifen lassen will, habe ich mir gestern einen kleinen Plan aufgestellt,
um mein Projekt zu pushen: Es soll ein einfacher Filament-Manager werden,
mit dem ich meine Spulen und deren Eigenschaften verwalten kann.</p>
<p>Da ich das nicht mit Astro, sondern mit <a href="https://bun.sh">Bun</a>, <a href="https://hono.dev">Hono</a>
und <a href="https://tailwindcss.com">TailwindCSS</a> umsetzen möchte, stellte sich die Frage:</p>
<p><strong>Wie kann ich TailwindCSS in mein Projekt integrieren?</strong>
Für viele Frameworks gibt es entsprechende Plugins – aber für Bun und Hono leider nicht.
Nach langem Suchen und Ausprobieren habe ich aber endlich eine Lösung gefunden!</p>
<h2 id="projekt-setup-mit-bun--hono">Projekt-Setup mit Bun &amp; Hono</h2>
<p>Als Erstes legen wir ein <code>hono</code>-Projekt mit <code>bun</code> an:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">bun create hono@latest my-project
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nb">cd</span> my-project</span></span></code></pre></div><p>Wir erstellen eine Startseite für die spätere Filamentübersicht.
Lege den Ordner <code>src/routes</code> an, falls er noch nicht existiert,
und erstelle darin die Datei <code>index.ts</code>.
Trage dort den folgenden Code ein:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">// src/routes/index.ts
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">Hono</span> <span class="p">}</span> <span class="kr">from</span> <span class="s1">&#39;hono&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="kr">const</span> <span class="nx">route</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Hono</span><span class="p">();</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="nx">route</span><span class="p">.</span><span class="kr">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="p">(</span><span class="nx">c</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">  <span class="k">return</span> <span class="nx">c</span><span class="p">.</span><span class="nx">text</span><span class="p">(</span><span class="s1">&#39;🎉 Hello from your Filament Manager!****&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">route</span><span class="p">;</span></span></span></code></pre></div><p>Anschließend binden wir diese Route in unsere neue Datei <code>src/app.ts</code> ein.
Diese Datei wird die zentrale Stelle sein, an der wir unsere Hono-App starten.
Lege sie an (falls sie noch nicht existiert), und füge folgenden Code ein:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1">// src/app.ts
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">Hono</span> <span class="p">}</span> <span class="kr">from</span> <span class="s1">&#39;hono&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="kr">import</span> <span class="nx">indexRoute</span> <span class="kr">from</span> <span class="s1">&#39;./routes/index&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="kr">const</span> <span class="nx">app</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Hono</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl">
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="nx">app</span><span class="p">.</span><span class="nx">route</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="nx">indexRoute</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl">
</span></span><span class="line"><span class="ln">9</span><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">app</span><span class="p">;</span></span></span></code></pre></div><p>Zum Schluss starten wir den Server.
Öffne die Datei <code>src/index.ts</code>
und ersetze den bisherigen Inhalt vollständig durch den folgenden Code:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">// src/index.ts
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="kr">import</span> <span class="nx">app</span> <span class="kr">from</span> <span class="s1">&#39;./app&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="kr">const</span> <span class="nx">port</span> <span class="o">=</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">PORT</span> <span class="o">||</span> <span class="mi">3000</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="sb">`Server is running on http://localhost:</span><span class="si">${</span><span class="nx">port</span><span class="si">}</span><span class="sb">`</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="nx">Bun</span><span class="p">.</span><span class="nx">serve</span><span class="p">({</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="nx">port</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  <span class="nx">fetch</span>: <span class="kt">app.fetch</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="p">});</span></span></span></code></pre></div><p>Starte den Server mit folgendem Befehl in einem Terminal:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="ln">1</span><span class="cl">bun run dev</span></span></code></pre></div><p>Wenn alles richtig eingerichtet ist, erreichst du die Startseite unter <code>http://localhost:3000</code> in deinem Browser.</p>
<p><a href="/bun-hono-tailwindcss-jsx-eine-tolle-kombination/bun-hono-start_hu_e69e1fba925bf7ee.webp"><img class="content-image" src="/bun-hono-tailwindcss-jsx-eine-tolle-kombination/bun-hono-start_hu_f75f17cabe1b2730.webp" alt="Ergebnis von bun run dev" title="Ergebnis von bun run dev" loading="lazy" width="1440" height="654" /></a></p>
<p>:::tip
Da wir das Terminal gleich wieder brauchen, stoppen wir den Server mit <code>Ctrl + C</code>.
:::</p>
<h2 id="tailwindcss-integrieren">TailwindCSS integrieren</h2>
<p>Jetzt kümmern wir uns um die Integration von TailwindCSS.</p>
<p>Installiere zuerst die nötigen Pakete als Entwicklungsabhängigkeiten:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">bun add -D tailwindcss @tailwindcss/cli</span></span></code></pre></div><p>Erstelle nun das Verzeichnis <code>src/styles</code> (falls es noch nicht existiert)
und eine Datei namens <code>global.css</code> und füge folgenden Inhalt ein:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="ln">1</span><span class="cl"><span class="c">/* src/styles/global.css */</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="p">@</span><span class="k">import</span> <span class="s2">&#34;tailwindcss&#34;</span><span class="p">;</span></span></span></code></pre></div><p>Da es derzeit keine offiziellen Plugins für Bun + Hono gibt,
müssen wir die CSS-Datei selbst kompilieren.
Führe dazu im Terminal folgenden Befehl aus:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">bunx @tailwindcss/cli -i ./src/styles/global.css -o ./public/output.css --watch</span></span></code></pre></div><p>:::note
Damit wird Tailwind verarbeitet und die fertige CSS-Datei unter <code>./public/output.css</code> gespeichert.
Der <code>--watch</code>-Modus sorgt dafür, dass Änderungen an deiner CSS-Datei
oder deinem Projekt automatisch neu kompiliert werden.
Du kannst ihn jederzeit mit <code>Ctrl + C</code> beenden.
:::</p>
<h2 id="html-template-einbinden">HTML-Template einbinden</h2>
<p>Jetzt, da wir unsere <code>output.css</code> im <code>public</code>-Ordner haben,
können wir ein HTML-Template erstellen und in unsere Hono-App integrieren.</p>
<p>Lege im Verzeichnis <code>src/templates</code> eine Datei mit dem Namen <code>layout.tsx</code> an.
Falls der Ordner <code>templates</code> noch nicht existiert, erstelle ihn zuerst.</p>
<p>Füge dann folgenden Code ein:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-tsx" data-lang="tsx"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">// src/templates/layout.tsx
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="kr">export</span> <span class="kr">const</span> <span class="nx">Layout</span> <span class="o">=</span> <span class="p">({</span> <span class="nx">children</span> <span class="p">}</span><span class="o">:</span> <span class="p">{</span> <span class="nx">children</span>: <span class="kt">string</span> <span class="p">})</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">  <span class="k">return</span> <span class="sb">`
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="sb">    &lt;!DOCTYPE html&gt;
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="sb">    &lt;html lang=&#34;de&#34;&gt;
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="sb">      &lt;head&gt;
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="sb">        &lt;meta charset=&#34;UTF-8&#34; /&gt;
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="sb">        &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34; /&gt;
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="sb">        &lt;title&gt;Filament Manager&lt;/title&gt;
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="sb">        &lt;link href=&#34;https://cbrueggenolte.de/public/output.css&#34; rel=&#34;stylesheet&#34;&gt;
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="sb">      &lt;/head&gt;
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="sb">      &lt;body class=&#34;bg-gray-100 text-gray-900 p-4&#34;&gt;
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="sb">        &lt;main class=&#34;max-w-2xl mx-auto&#34;&gt;
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="sb">          </span><span class="si">${</span><span class="nx">children</span><span class="si">}</span><span class="sb">
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="sb">        &lt;/main&gt;
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="sb">      &lt;/body&gt;
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="sb">    &lt;/html&gt;
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="sb">  `</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="p">};</span></span></span></code></pre></div><p>:::note
Das Template ist eine Funktion, die ein vollständiges HTML-Dokument als String zurückgibt.
Das Platzhalterfeld <code>${children}</code> wird später mit dem eigentlichen Seiteninhalt ersetzt.
:::</p>
<p>Jetzt passen wir unsere Startseite an, damit sie das HTML-Template verwendet.</p>
<p>Öffne die Datei <code>src/routes/index.ts</code> und ersetze ihren Inhalt durch:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">// src/routes/index.ts
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">Hono</span> <span class="p">}</span> <span class="kr">from</span> <span class="s1">&#39;hono&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">Layout</span> <span class="p">}</span> <span class="kr">from</span> <span class="s1">&#39;../templates/layout&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="kr">const</span> <span class="nx">route</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Hono</span><span class="p">();</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="nx">route</span><span class="p">.</span><span class="kr">get</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="p">(</span><span class="nx">c</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">  <span class="kr">const</span> <span class="nx">content</span> <span class="o">=</span> <span class="sb">`
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="sb">    &lt;h1 class=&#34;text-3xl font-medium mb-4&#34;&gt;🎨 Filament Manager&lt;/h1&gt;
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="sb">    &lt;p class=&#34;text-lg&#34;&gt;Hier verwalten wir bald unsere Filamente.&lt;/p&gt;
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="sb">  `</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">  <span class="k">return</span> <span class="nx">c</span><span class="p">.</span><span class="nx">html</span><span class="p">(</span><span class="nx">Layout</span><span class="p">({</span> <span class="nx">children</span>: <span class="kt">content</span> <span class="p">}));</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">route</span><span class="p">;</span></span></span></code></pre></div><p>:::note
Damit wird deine Startseite jetzt mit dem Template <code>layout.tsx</code> gerendert.
Der HTML-Inhalt in der Variable <code>content</code> wird automatisch an der Stelle <code>${children}</code> eingefügt.
:::</p>
<h2 id="statische-dateien-bereitstellen">Statische Dateien bereitstellen</h2>
<p>Damit die Datei <code>output.css</code> im Browser geladen werden kann, muss Hono den Ordner <code>/public</code> freigeben.
Das erreichen wir mit der Middleware <code>serveStatic</code>:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="ln">1</span><span class="cl"><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="s1">&#39;/public/*&#39;</span><span class="p">,</span> <span class="nx">serveStatic</span><span class="p">({</span> <span class="nx">root</span><span class="o">:</span> <span class="s1">&#39;./&#39;</span> <span class="p">}));</span></span></span></code></pre></div><p>Füge diese Zeile in <code>src/app.ts</code> ein – zwischen der App-Initialisierung und dem Routing.
Oder ersetze den gesamten Inhalt der Datei <code>src/app.ts</code> durch den folgenden Code:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ts" data-lang="ts"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">// src/app.ts
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">Hono</span> <span class="p">}</span> <span class="kr">from</span> <span class="s1">&#39;hono&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">serveStatic</span> <span class="p">}</span> <span class="kr">from</span> <span class="s1">&#39;hono/bun&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="kr">import</span> <span class="nx">indexRoute</span> <span class="kr">from</span> <span class="s1">&#39;./routes/index&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="kr">const</span> <span class="nx">app</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Hono</span><span class="p">();</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="c1">// Statische Dateien wie /public/output.css bereitstellen
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="nx">app</span><span class="p">.</span><span class="nx">use</span><span class="p">(</span><span class="s1">&#39;/public/*&#39;</span><span class="p">,</span> <span class="nx">serveStatic</span><span class="p">({</span> <span class="nx">root</span><span class="o">:</span> <span class="s1">&#39;./&#39;</span> <span class="p">}));</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="nx">app</span><span class="p">.</span><span class="nx">route</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="nx">indexRoute</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="kr">export</span> <span class="k">default</span> <span class="nx">app</span><span class="p">;</span></span></span></code></pre></div><p>Die Middleware sorgt dafür, dass der Browser statische Dateien aus dem <code>public</code>-Verzeichnis laden kann –
zum Beispiel die Datei <code>output.css</code>.</p>
<p>Starte nun den Server erneut (ggf. in einem zweiten Terminalfenster) mit:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="ln">1</span><span class="cl">bun run dev</span></span></code></pre></div><p>:::tip
Falls du den TailwindCSS-Compiler vorher gestoppt hast (z. B. mit <code>Ctrl + C</code>),
starte ihn jetzt erneut – sonst wird die eingebundene Datei <code>output.css</code> nicht aktualisiert.</p>
<p>Verwende dazu denselben Befehl wie zuvor:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="ln">1</span><span class="cl">bunx @tailwindcss/cli -i ./src/styles/global.css -o ./public/output.css --watch</span></span></code></pre></div><p>Am besten lässt du den Compiler dauerhaft in einem separaten Terminalfenster laufen,
während du am Projekt arbeitest.
:::</p>
<p>Wenn alles funktioniert, wird die Startseite unter
<a href="http://localhost:3000">http://localhost:3000</a> angezeigt – diesmal mit TailwindCSS-Styling.</p>
<p><a href="/src/assets/bun-hono-tailwindcss.png"><img class="content-image" src="/src/assets/bun-hono-tailwindcss.png" alt="Bun Hono und Tailwindcss" title="Bun Hono und Tailwindcss" loading="lazy" /></a></p>
<p>Deine Version ist bereits sehr gut – klar strukturiert, technisch korrekt und stilistisch passend zum Blog.
Ich habe sie jetzt nur leicht sprachlich geglättet
und einen durchgehenden, natürlichen Lesefluss hergestellt.
Hier die überarbeitete Fassung:</p>
<hr>
<h2 id="dev-workflow-verbessern">Dev-Workflow verbessern</h2>
<p>Damit du nicht ständig zwei Terminals gleichzeitig offen haben musst,
eines für Hono und eines für Tailwind,
kannst du deinen Workflow etwas bequemer gestalten.</p>
<p>Wir verwenden das Tool <a href="https://www.npmjs.com/package/concurrently"><code>concurrently</code></a>, um beide Prozesse parallel zu starten:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">bun add -D concurrently</span></span></code></pre></div><p>Zunächst kannst du den folgenden <code>dev</code>-Befehl in deiner <code>package.json</code> unter <code>&quot;scripts&quot;</code> ergänzen:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="ln">1</span><span class="cl"><span class="s2">&#34;scripts&#34;</span><span class="err">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">  <span class="nt">&#34;dev&#34;</span><span class="p">:</span> <span class="s2">&#34;concurrently &#39;bun run --hot src/index.ts&#39; &#39;bunx @tailwindcss/cli -i ./src/styles/global.css -o ./public/output.css --watch&#39;&#34;</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="p">}</span></span></span></code></pre></div><p>Wenn du möchtest, kannst du den Prozessen zusätzlich <strong>Namen und Farben</strong> zuweisen – das macht die Terminalausgabe übersichtlicher:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="ln">1</span><span class="cl"><span class="s2">&#34;scripts&#34;</span><span class="err">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">  <span class="nt">&#34;dev&#34;</span><span class="p">:</span> <span class="s2">&#34;concurrently --names &#39;server,styles&#39; --prefix-colors &#39;yellow,blue&#39;  &#39;bun run --hot src/index.ts&#39; &#39;bunx @tailwindcss/cli -i ./src/styles/global.css -o ./public/output.css --watch&#39;&#34;</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="p">}</span></span></span></code></pre></div><p>Statt alle Befehle in eine lange
und schwer lesbare Zeile zu packen,
kannst du das Ganze noch besser strukturieren,
indem du <strong>zwei separate Scripts</strong> anlegst:
Eines für den Server, eines für Tailwind.
Dann kombinierst du sie im <code>dev</code>-Befehl über <code>concurrently</code>:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="ln">1</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">  <span class="nt">&#34;scripts&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">    <span class="nt">&#34;start:server&#34;</span><span class="p">:</span> <span class="s2">&#34;bun run --hot src/index.ts&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">    <span class="nt">&#34;start:styles&#34;</span><span class="p">:</span> <span class="s2">&#34;bunx @tailwindcss/cli -i ./src/styles/global.css -o ./public/output.css --watch&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">    <span class="nt">&#34;dev&#34;</span><span class="p">:</span> <span class="s2">&#34;concurrently --names &#39;server,styles&#39; --prefix-colors &#39;yellow,blue&#39; &#39;npm run start:server&#39; &#39;npm run start:styles&#39;&#34;</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="p">}</span></span></span></code></pre></div><p>:::note
<strong>Vorteil:</strong> Du kannst <code>bun run start:server</code> und <code>bun run start:styles</code> auch separat ausführen –
z. B. wenn du nur einen der beiden Prozesse debuggen möchtest.
:::</p>
<p>Wenn du jetzt <code>bun run dev</code> ausführst, starten <strong>Hono-Server und Tailwind-Watcher gleichzeitig</strong>,
farblich getrennt, sauber strukturiert, und mit einem einzigen Befehl.</p>
<h2 id="fazit">Fazit</h2>
<p>Und das war’s auch schon!
Eigentlich gar nicht so schwer – aber für mich war es trotzdem eine kleine Herausforderung,
weil ich mit <strong>Bun</strong> und <strong>Hono</strong> bisher noch wenig Erfahrung hatte.</p>
<p>Aber genau deshalb hat es sich gelohnt:
Ich habe nicht nur die Tools kennengelernt, sondern gleich eine funktionierende Entwicklungsumgebung aufgebaut,
mit TailwindCSS, HTML-Template und Live-Reloading.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
