<?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>Sveltekit on Techformist</title>
    <link>https://techformist.com/tags/sveltekit/</link>
    <description>Recent content in Sveltekit on Techformist</description>
    <image>
      <url>https://techformist.com/logo.svg</url>
      <link>https://techformist.com/logo.svg</link>
    </image>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 14 Nov 2022 06:30:00 +0000</lastBuildDate><atom:link href="https://techformist.com/tags/sveltekit/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Create a blog on Sveltekit</title>
      <link>https://techformist.com/create-blog-sveltekit/</link>
      <pubDate>Mon, 14 Nov 2022 06:30:00 +0000</pubDate>
      
      <guid>https://techformist.com/create-blog-sveltekit/</guid>
      <description>&lt;p&gt;In this post let us create a simple blog using Sveltekit.&lt;/p&gt;
&lt;p&gt;Why Sveltekit if you ask -&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Because it&amp;rsquo;s cool&lt;/li&gt;
&lt;li&gt;Make your pages interactive without a big JS payload for the client&lt;/li&gt;
&lt;li&gt;Fast&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Get started with the following command in your favorite terminal -&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pnpm create svelte@latest avix-blog-sveltekit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This should initiate the folder with basic sveltekit structure and initiate a few files.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://techformist.com/2022/create-sveltekit-app-blog.png&#34; type=&#34;&#34; alt=&#34;create-sveltekit-app-blog&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;Choose &lt;code&gt;Skeleteon project&lt;/code&gt; as an option and select/de-select Javascript, Prettier and ESLint options based on your preferences.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In this post let us create a simple blog using Sveltekit.</p>
<p>Why Sveltekit if you ask -</p>
<ol>
<li>Because it&rsquo;s cool</li>
<li>Make your pages interactive without a big JS payload for the client</li>
<li>Fast</li>
</ol>
<p>Get started with the following command in your favorite terminal -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">pnpm create svelte@latest avix-blog-sveltekit
</span></span></code></pre></div><p>This should initiate the folder with basic sveltekit structure and initiate a few files.</p>
<p><img loading="lazy" src="/2022/create-sveltekit-app-blog.png" type="" alt="create-sveltekit-app-blog"  /></p>
<p>Choose <code>Skeleteon project</code> as an option and select/de-select Javascript, Prettier and ESLint options based on your preferences.</p>
<p>Install dependencies, open the project in an editor of your choice and run the project.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl"><span class="k">cd</span> avix-blog-sveltekit
</span></span><span class="line"><span class="cl">pnpm i
</span></span><span class="line"><span class="cl">code .
</span></span><span class="line"><span class="cl">pnpm run dev
</span></span></code></pre></div><p>Navigate to <code>http://localhost:5173/</code> to see this beautiful page.</p>
<p><img loading="lazy" src="/2022/sveltekit-skeleton-starting-page.png" type="" alt="sveltekit-skeleton-starting-page"  /></p>
<p>We will use a small CSS library called <a href="https://jenil.github.io/chota/">chota</a> - not fussing on styling in this example.</p>
<p>Include the below line in <code>src/app.html</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&#34;stylesheet&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;https://unpkg.com/chota@latest&#34;</span><span class="p">&gt;</span>
</span></span></code></pre></div><h2 id="routing-and-static-pages">Routing and Static Pages</h2>
<p>Sveltekit enables easy and dynamic routing.</p>
<ul>
<li>Any page within <code>src/routes</code> folder is a route in the app</li>
<li>Define the page content using <code>+page.svelte</code> within the specific route folder</li>
</ul>
<p>Create an <code>about</code> route -</p>
<ol>
<li>Create a folder <code>src/routes/about</code></li>
<li>Create a file called <code>src/routes/about/+page.svelte</code></li>
</ol>
<p>Use below content for the new <code>+page.svelte</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">h1</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">  About
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">h1</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">b</span><span class="p">&gt;</span>This is the greatest blog that has ever been written<span class="p">&lt;/</span><span class="nt">b</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam hendrerit nisi sed sollicitudin pellentesque. Nunc posuere purus rhoncus pulvinar aliquam. Ut aliquet tristique nisl vitae volutpat. Nulla aliquet porttitor venenatis. Donec a dui et dui fringilla consectetur id nec massa. Aliquam erat volutpat. 
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Sed ut dui ut lacus dictum fermentum vel tincidunt neque. Sed sed lacinia lectus. Duis sit amet sodales felis. Duis nunc eros, mattis at dui ac, convallis semper risus. In adipiscing ultrices tellus, in suscipit massa vehicula eu.
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>The convention of using <code>+</code> in file names is picked up by Sveltekit.</p>
<ol>
<li>We have already established that <code>about</code> folder signifies a route. <code>+page.svelte</code> in that folder is the &ldquo;root page&rdquo; that gets rendered when you go to <code>example.com/about</code>. This page gets server rendered for the first request, and rendered in client for subsequent requests</li>
<li>Other files of interest in the same <code>about</code> folder (all files optional) -</li>
</ol>
<ul>
<li><code>+page.js</code> - Do stuff before <code>+page.svelte</code> gets rendered</li>
<li><code>+page.server.js</code> - Run this JS only on server (e.g. fetch data from DB)</li>
<li><code>+error.svelte</code> - Custom error page</li>
</ul>
<ol>
<li>See the <a href="https://kit.svelte.dev/docs/routing">sveltekit routing docs</a> to understand more on the different file name conventions</li>
</ol>
<p>While I have nothing but admiration for the <a href="https://github.com/sveltejs/kit/discussions/5748">thinking that has gone in the routing structure</a>, I was happier with the older, simpler file structure.</p>
<p>Create another file called <code>blog/+page.svelte</code> with the below content -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">h1</span><span class="p">&gt;</span>Blog<span class="p">&lt;/</span><span class="nt">h1</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>My blog will be written here.<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>Visit <code>http://localhost:5173/about</code> and <code>http://localhost:5173/blog</code> to see the pages.</p>
<p><img loading="lazy" src="/2022/sveltekit-blog-about-page.png" type="" alt="sveltekit-blog-about-page"  /></p>
<p>While this content is great and everything, the pages need a bit more work to bring consistent styling and to avoid using HTML for every new post.</p>
<h2 id="create-layouts">Create layouts</h2>
<p>Layouts help us define styling and structure at a root level, or for every page.</p>
<p>Get started with a common layout that is applicable for all pages. Create <code>+layout.svelte</code> in <code>src/routes</code> folder.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">header</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="p">&lt;</span><span class="nt">nav</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;nav&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;nav-center&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;/&#34;</span><span class="p">&gt;</span>Home<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="p">&lt;</span><span class="nt">a</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;active&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;/blog&#34;</span><span class="p">&gt;</span>Blog<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;/about&#34;</span><span class="p">&gt;</span>About<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="p">&lt;/</span><span class="nt">nav</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">header</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">main</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;container&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="p">&lt;</span><span class="nt">slot</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">main</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">footer</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;&#34;</span><span class="p">&gt;</span>(c) My blog<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">footer</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">style</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">main</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">margin-bottom</span><span class="p">:</span> <span class="mi">50</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nt">footer</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">font-size</span><span class="p">:</span> <span class="kc">smaller</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="k">padding-top</span><span class="p">:</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="k">position</span><span class="p">:</span> <span class="kc">fixed</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="k">height</span><span class="p">:</span> <span class="mi">50</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="k">background-color</span><span class="p">:</span> <span class="kc">gainsboro</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="k">bottom</span><span class="p">:</span> <span class="mi">0</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="k">left</span><span class="p">:</span> <span class="mi">0</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="k">right</span><span class="p">:</span> <span class="mi">0</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="k">margin-bottom</span><span class="p">:</span> <span class="mi">0</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">style</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>The blog looks much better.</p>
<p><img loading="lazy" src="/2022/sveltekit-blog-with-layout.png" type="" alt="sveltekit-blog-with-layout"  /></p>
<p>Click on the navigation links to see some SPA action.</p>
<p>Take note of a couple of interesting things..</p>
<ul>
<li>CSS is included in the layout itself, which is also a Svelte component. This CSS is scoped to the layout, but can manifest itself across the apps because of its nature (e.g., you see the layout across pages)</li>
<li><code>slot</code> houses the components that gets rendered as pages. For e.g, the <code>About</code> page HTML replaces <code>&lt;slot&gt;</code></li>
</ul>
<p>Let us improve this layout a bit. Instead of typing in header in the same layout, let us all header info in a separate component.</p>
<p>Create a new file <code>src/lib/Header.svelte</code> and move header content from <code>+layout.svelte</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">header</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="p">&lt;</span><span class="nt">nav</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;nav&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;nav-center&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;/&#34;</span><span class="p">&gt;</span>Home<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="p">&lt;</span><span class="nt">a</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;active&#34;</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;/blog&#34;</span><span class="p">&gt;</span>Blog<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&#34;/about&#34;</span><span class="p">&gt;</span>About<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="p">&lt;/</span><span class="nt">nav</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">header</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>Create a new file for styles at <code>src/lib/styles/custom.css</code> and move style content from <code>+layout.svelte</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="nt">main</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">margin-bottom</span><span class="p">:</span> <span class="mi">50</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="nt">footer</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">font-size</span><span class="p">:</span> <span class="kc">smaller</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">padding-top</span><span class="p">:</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">position</span><span class="p">:</span> <span class="kc">fixed</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">height</span><span class="p">:</span> <span class="mi">50</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">background-color</span><span class="p">:</span> <span class="kc">gainsboro</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">bottom</span><span class="p">:</span> <span class="mi">0</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">left</span><span class="p">:</span> <span class="mi">0</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">right</span><span class="p">:</span> <span class="mi">0</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">margin-bottom</span><span class="p">:</span> <span class="mi">0</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>The folder <code>src/lib</code> can contain the internal library of the app (which is a blog in our case). <code>$lib</code> is processed internally by Svelte to point to the right location of the components, styles or anything that you need to reuse across your app.</p>
<p>Import <code>Header.svelte</code> and <code>custom.css</code> in the the layout file <code>src/routes/+layout.svelte</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="kr">import</span> <span class="nx">Header</span> <span class="nx">from</span> <span class="s1">&#39;$lib/components/Header.svelte&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="kr">import</span> <span class="s1">&#39;$lib/styles/custom.css&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">Header</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">main</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;container&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="p">&lt;</span><span class="nt">slot</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">main</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">footer</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;&#34;</span><span class="p">&gt;</span>(c) My blog<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">footer</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>Well, we are no accomplishing much by moving 5 lines of code, but the technique demonstrates using reusable components in Svelte. You can add global styles in <code>layout</code> or in <code>app.html</code> - we did the latter for the chota css library.</p>
<p>The end result will be the same as earlier, but also note that -</p>
<ul>
<li>View the page source to see the CSS embedded in the HTML page</li>
<li>HTML + CSS is mixed and sent by server, not rendered on client</li>
</ul>
<p>Let us change <code>src/blog/+page.svelte</code> in a similar way.
Create a new file <code>src/lib/styles/blog.css</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="nt">ul</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">list-style</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">padding-left</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">.</span><span class="nc">sidebar-content</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">margin-top</span><span class="p">:</span> <span class="mi">4</span><span class="kt">em</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">position</span><span class="p">:</span> <span class="kc">fixed</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">padding</span><span class="p">:</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">width</span><span class="p">:</span> <span class="mi">180</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">border</span><span class="p">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="kc">silver</span> <span class="kc">solid</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>You can now change <code>src/blog/+page.svelte</code> to include the new <code>blog-sidebar</code> class.. Or, do something even better using our knowledge layouts.</p>
<p>Create a new file <code>src/blog/+layout.svelte</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="kr">import</span> <span class="s1">&#39;$lib/styles/blog.css&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="kd">let</span> <span class="nx">featLinks</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">		<span class="p">{</span> <span class="nx">url</span><span class="o">:</span> <span class="s1">&#39;/about&#39;</span><span class="p">,</span> <span class="nx">title</span><span class="o">:</span> <span class="s1">&#39;About&#39;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">		<span class="p">{</span> <span class="nx">url</span><span class="o">:</span> <span class="s1">&#39;/blog/hello-world&#39;</span><span class="p">,</span> <span class="nx">title</span><span class="o">:</span> <span class="s1">&#39;Hello World&#39;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">main</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;row&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;col-8&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="p">&lt;</span><span class="nt">slot</span> <span class="p">/&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;col-4&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;sidebar-content&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">				<span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">					<span class="p">&lt;</span><span class="nt">strong</span><span class="p">&gt;</span>Featured Links<span class="p">&lt;/</span><span class="nt">strong</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">				<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">				<span class="p">&lt;</span><span class="nt">ul</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">					{#each featLinks as featLink}
</span></span><span class="line"><span class="cl">						<span class="p">&lt;</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">							<span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">{featLink.url}</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">								{featLink.title}
</span></span><span class="line"><span class="cl">							<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">						<span class="p">&lt;/</span><span class="nt">li</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">					{/each}
</span></span><span class="line"><span class="cl">				<span class="p">&lt;/</span><span class="nt">ul</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="p">&lt;/</span><span class="nt">div</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">main</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>Note that -</p>
<ul>
<li>This layout file is automatically included for all routes under <code>blog</code>. In other words - the layout is used for the blog home page and all blog posts.</li>
<li>The class <code>row</code>, <code>column</code> etc. are provided by chota css and makes the page is fully responsive.
Also, you can modify fetching the featured content in real-time - we are not going there at the moment.</li>
</ul>
<p>Lo and behold - your new blog layout. Resize the window to see the side bar move to the side or to the bottom.</p>
<p><img loading="lazy" src="/2022/blog-layout-sidebar.png" type="" alt="blog-layout-sidebar"  /></p>
<h2 id="support-markdown">Support Markdown</h2>
<p>We can continue to write HTML in each of the blog pages, or we could make things easier for writing content using markdown. We will do the latter, of course.</p>
<p>Handle markdown using a library called <code>mdsvex</code>, which will preprocess markdown files and convert them to render to web pages.</p>
<p>Install <code>mdsvex</code> to get started.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">pnpm i -D mdsvex
</span></span></code></pre></div><p>Open <code>svelte.config.js</code> in the root folder. Change <code>config</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">config</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">kit</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">adapter</span><span class="o">:</span> <span class="nx">adapter</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="nx">preprocess</span><span class="o">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">		<span class="nx">mdsvex</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">			<span class="nx">extensions</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;.md&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">		<span class="p">})</span>
</span></span><span class="line"><span class="cl">	<span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>This config tells <code>mdsvex</code> to handle <code>md</code> files and convert them to HTML. It will also enable us to use Svelte components within markdown.</p>
<p>Now, there is more than one way to read Markdown files and serve content to the client. We will -</p>
<ol>
<li>Write server logic to read markdown files and convert the title/path to JSON, and retrieve list of files to show the list of blog posts</li>
<li>Write even more server logic to read markdown file content for a single post and show content on the blog post page</li>
</ol>
<h2 id="serve-list-of-blog-posts">Serve List of Blog Posts</h2>
<p>Create a new file <code>routes/api/posts/server.js</code> in the root folder.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">json</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;@sveltejs/kit&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">export</span> <span class="kr">const</span> <span class="nx">GET</span> <span class="o">=</span> <span class="kr">async</span> <span class="p">()</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;GET invoked..&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="kr">const</span> <span class="nx">allPosts</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">fetchPosts</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">	<span class="kr">const</span> <span class="nx">sortedPosts</span> <span class="o">=</span> <span class="nx">allPosts</span><span class="p">.</span><span class="nx">sort</span><span class="p">((</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">(</span><span class="nx">b</span><span class="p">.</span><span class="nx">meta</span><span class="p">.</span><span class="nx">date</span><span class="p">)</span> <span class="o">-</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">(</span><span class="nx">a</span><span class="p">.</span><span class="nx">meta</span><span class="p">.</span><span class="nx">date</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="p">});</span>
</span></span><span class="line"><span class="cl">	<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Posts:&#39;</span><span class="p">,</span> <span class="nx">sortedPosts</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;.. GET done&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nx">json</span><span class="p">(</span><span class="nx">sortedPosts</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">async</span> <span class="kd">function</span> <span class="nx">fetchPosts</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kr">const</span> <span class="nx">postFiles</span> <span class="o">=</span> <span class="kr">import</span><span class="p">.</span><span class="nx">meta</span><span class="p">.</span><span class="nx">glob</span><span class="p">(</span><span class="s1">&#39;/src/routes/blog/*.md&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="kr">const</span> <span class="nx">posts</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">entries</span><span class="p">(</span><span class="nx">postFiles</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="kr">const</span> <span class="nx">allPosts</span> <span class="o">=</span> <span class="kr">await</span> <span class="nb">Promise</span><span class="p">.</span><span class="nx">all</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">		<span class="nx">posts</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kr">async</span> <span class="p">([</span><span class="nx">path</span><span class="p">,</span> <span class="nx">resolver</span><span class="p">])</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="kr">const</span> <span class="p">{</span> <span class="nx">metadata</span> <span class="p">}</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">resolver</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">			<span class="kr">const</span> <span class="nx">postPath</span> <span class="o">=</span> <span class="nx">path</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">11</span><span class="p">,</span> <span class="o">-</span><span class="mi">3</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">			<span class="k">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">				<span class="nx">meta</span><span class="o">:</span> <span class="nx">metadata</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">				<span class="nx">path</span><span class="o">:</span> <span class="nx">postPath</span>
</span></span><span class="line"><span class="cl">			<span class="p">};</span>
</span></span><span class="line"><span class="cl">		<span class="p">})</span>
</span></span><span class="line"><span class="cl">	<span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nx">allPosts</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>In this file -</p>
<ol>
<li>We just read all files</li>
<li>Retrieve metadata (markdown frontmatter) within the <code>---</code> lines to check title and date</li>
<li>Support <code>GET</code> request to serve the list of posts sorted by date</li>
</ol>
<p>Sveltekit runs this logic only on the server. Navigate to <code>http://localhost:5173/api/posts</code> to see the JSON content</p>
<p>Change <code>routes/blog/+page.svelte</code> to -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="o">&lt;</span><span class="nx">script</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="kd">let</span> <span class="nx">posts</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="kd">let</span> <span class="nx">promise</span> <span class="o">=</span> <span class="nx">getPosts</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="kr">async</span> <span class="kd">function</span> <span class="nx">getPosts</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;blog loading..&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="kr">const</span> <span class="nx">res</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="s1">&#39;http://localhost:5173/api/posts&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="nx">posts</span> <span class="o">=</span> <span class="kr">await</span> <span class="nx">res</span><span class="p">.</span><span class="nx">json</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">		<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;posts&#39;</span><span class="p">,</span> <span class="nx">posts</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;.. blog loading done&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="nx">posts</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="o">&lt;</span><span class="err">/script&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&lt;</span><span class="nx">h1</span><span class="o">&gt;</span><span class="nx">Blog</span><span class="o">&lt;</span><span class="err">/h1&gt;</span>
</span></span><span class="line"><span class="cl"><span class="o">&lt;</span><span class="nx">p</span><span class="o">&gt;</span><span class="nx">This</span> <span class="nx">is</span> <span class="nx">an</span> <span class="nx">awesome</span> <span class="nx">blog</span> <span class="nx">about</span> <span class="nx">sveltekit</span><span class="p">.</span><span class="o">&lt;</span><span class="err">/p&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">{</span><span class="err">#</span><span class="kr">await</span> <span class="nx">promise</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="o">&lt;</span><span class="nx">p</span><span class="o">&gt;</span><span class="nx">fetching</span> <span class="nx">posts</span><span class="p">..</span><span class="o">&lt;</span><span class="err">/p&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span><span class="o">:</span><span class="nx">then</span> <span class="nx">posts</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">{</span><span class="err">#</span><span class="nx">each</span> <span class="nx">posts</span> <span class="nx">as</span> <span class="nx">post</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">		<span class="o">&lt;</span><span class="nx">div</span> <span class="kr">class</span><span class="o">=</span><span class="s2">&#34;list-post&#34;</span><span class="o">&gt;&lt;</span><span class="nx">a</span> <span class="nx">href</span><span class="o">=</span><span class="p">{</span><span class="nx">post</span><span class="o">?</span><span class="p">.</span><span class="nx">path</span><span class="p">}</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">post</span><span class="o">?</span><span class="p">.</span><span class="nx">meta</span><span class="o">?</span><span class="p">.</span><span class="nx">title</span><span class="p">}</span><span class="o">&lt;</span><span class="err">/a&gt;&lt;/div&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="p">{</span><span class="err">/each}</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span><span class="err">/await}</span>
</span></span></code></pre></div><ol>
<li><code>getPosts</code> fetches post metadata from API</li>
<li>Rest of the content including <code>await</code>/<code>then</code> is standard svelte to support promises (more details <a href="https://svelte.dev/docs#template-syntax-await">here</a>)</li>
</ol>
<p>You should now be able to see blog posts at <code>http://localhost:5173/blog</code>.</p>
<p><img loading="lazy" src="/2022/sveltekit-blog-list-markdown.png" type="" alt="sveltekit-blog-list-markdown"  /></p>
<h2 id="display-a-single-blog-post">Display a Single Blog Post</h2>
<p>Create a new file <code>routes/[blog]/[slug]/page.js]</code> -</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">export</span> <span class="kr">async</span> <span class="kd">function</span> <span class="nx">load</span><span class="p">({</span> <span class="nx">params</span> <span class="p">})</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kr">const</span> <span class="nx">post</span> <span class="o">=</span> <span class="kr">await</span> <span class="kr">import</span><span class="p">(</span><span class="sb">`../</span><span class="si">${</span><span class="nx">params</span><span class="p">.</span><span class="nx">slug</span><span class="si">}</span><span class="sb">.md`</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="kr">const</span> <span class="p">{</span> <span class="nx">title</span><span class="p">,</span> <span class="nx">date</span> <span class="p">}</span> <span class="o">=</span> <span class="nx">post</span><span class="p">.</span><span class="nx">metadata</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="kr">const</span> <span class="nx">content</span> <span class="o">=</span> <span class="nx">post</span><span class="p">.</span><span class="k">default</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">content</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="nx">title</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">		<span class="nx">date</span>
</span></span><span class="line"><span class="cl">	<span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>This will help us to -</p>
<ol>
<li>Get the parameter passed by the client (for e.g. when the user navigates to a particular blog post)</li>
<li>Get the markdown file in the provided path</li>
<li>Retrieve content, title and date, and return them</li>
</ol>
<p>The corresponding <code>routes/[blog]/[slug]/page.svelte]</code> will display content-</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="o">&lt;</span><span class="nx">script</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm">	 * @type {{ title: any; date: any; content?: any; }}
</span></span></span><span class="line"><span class="cl"><span class="cm">	 */</span>
</span></span><span class="line"><span class="cl">	<span class="kr">export</span> <span class="kd">let</span> <span class="nx">data</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="kr">const</span> <span class="p">{</span> <span class="nx">title</span><span class="p">,</span> <span class="nx">date</span><span class="p">,</span> <span class="nx">content</span> <span class="p">}</span> <span class="o">=</span> <span class="nx">data</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="o">&lt;</span><span class="err">/script&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&lt;</span><span class="nx">article</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="o">&lt;</span><span class="nx">h1</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">data</span><span class="p">.</span><span class="nx">title</span><span class="p">}</span><span class="o">&lt;</span><span class="err">/h1&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="o">&lt;</span><span class="nx">p</span> <span class="kr">class</span><span class="o">=</span><span class="s2">&#34;subdued&#34;</span><span class="o">&gt;</span><span class="nx">Published</span><span class="o">:</span> <span class="p">{</span><span class="nx">data</span><span class="p">.</span><span class="nx">date</span><span class="p">}</span><span class="o">&lt;</span><span class="err">/p&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="o">&lt;</span><span class="nx">svelte</span><span class="o">:</span><span class="nx">component</span> <span class="k">this</span><span class="o">=</span><span class="p">{</span><span class="nx">data</span><span class="p">.</span><span class="nx">content</span><span class="p">}</span> <span class="o">/&gt;</span>
</span></span><span class="line"><span class="cl"><span class="o">&lt;</span><span class="err">/article&gt;</span>
</span></span></code></pre></div><p>Create a few markdown files in <code>routes/[blog]/</code> - their names are used in the URL (for e.g. I created <code>latest.md</code> with sample content).</p>
<p>Navigate to <code>http://localhost:5173/blog/latest</code> to see the blog post.</p>
<p><img loading="lazy" src="/2022/sveltekit-blogpost.png" type="" alt="sveltekit-blogpost"  /></p>
<p>That is it - play around to see all the magic that sveltekit can do for you.
You will find the complete code on <a href="https://github.com/prashanth1k/avix-blog-sveltekit">Github</a>.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Sveltekit provides a structured way to develop a full stack application. Coding in svelte feels intuitive for me, but Sveltekit may take some getting used to.</p>
<ol>
<li>The hundred files that we have to deal with is a confusing start in Sveltekit. Is moving away from something like <code>getServerSideProps</code> method on the same page to distinct set of pages an advantage? Maybe, but it&rsquo;s sure weird</li>
<li>Navigation b/w methods in the same file is simpler than navigating files for simple use cases. We could always separate out code to different files if a specific file is turning out to be too complex</li>
<li>The naming conventions - <code>+page.svelte</code>, <code>+page.js</code>, <code>+page.server.js</code>, <code>+server.js</code>, <code>+layout.svelte</code> etc. may provide a structured approach to code while keeping us from making mistakes, but it sure is confusing. Decisions like &ldquo;do I code this logic in <code>page</code>, <code>page.server</code>, <code>server</code> or even <code>layout</code> (?)&rdquo; for a few use cases may be a turn off</li>
</ol>
<p>Probably all of this comes down to developing the muscle memory to do things in a different way. That and enough people talking about and agreeing to conventions and best practices will certainly help.</p>
<p>For now the go to choice for the simple applications I code will continue to be Vue/Nuxt.</p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
