npm init svelte@next app-name
cd app-name
npx svelte-add@latest tailwindcss mdsvex
npm i
npm i -D @sveltejs/adapter-static@next
Import and add adapter to svelte.config.js
file.
import adapter from '@sveltejs/adapter-static';
const config = {
kit: {
adapter: adapter(),
target: '#svelte',
};
export default config;
npm run dev
Create your __layout.svelte
and index.svelte
files to your preferences. Create a folder under routes
called posts
for the page files. For the actual markdown posts, create a folder at src/posts
. Now that the folders are created, we can work on the files. Inside of src/posts
write your markdown post in the style of the code below with the metadata title, you can add more metadata, but this will be used to list the posts.
---
title: Your Title
---
...your post
Next, inside of routes/posts
create 2 files, index.svelte
and [slug].svelte
. In index.svelte
we need to grab the posts and list them out on the page like this.
<!-- index.svelte -->
<script context="module">
export async function load() {
// import all md files
const mdFiles = import.meta.globEager('../../posts/*.md')
// turn into array and map over
const posts = Object.entries(mdFiles).map((post) => {
// get correct slug format
const slug = post[0].substring(post[0].lastIndexOf('/') + 1).replace('.md', '')
// pull out title
const title = post[1].metadata.title
return {
slug,
title
}
})
return {
props: {
posts
}
}
}
</script>
<script>
export let posts
</script>
<section>
<h1>Posts</h1>
<ul class="grid grid-cols-1 gap-2">
{#each posts as post}
<li>
<a sveltekit:prefetch href={`/posts/${post.slug}`}>{post.title}</a>
</li>
{/each}
</ul>
</section>
Then, in [slug].svelte
we can grab each post and display it.
<script context="module">
export async function load({ page }) {
const Post = (await import(`../../posts/${page.params.slug}.md`)).default
// }
return {
props: {
Post
}
}
}
</script>
<script>
export let Post
</script>
<article>
<svelte:component this="{Post}" />
</article>