how to make a blog in nuxt js quickly
Tags: vue, nuxt, javascript, webdev
Published: 2023-02-11 20:50:55

{% youtube t7iSzeHEG_k%}
For a video tutorial watch this ☝🏿

First open your Nuxt project and install this

if you have Nuxt old version (version 2) install this:

`yarn add @nuxt/content@^1`

For new version, install this:
`yarn add @nuxt/content`

And in your `nuxt.config.js`
add this module

```js
  modules: ["@nuxt/content"],
```

Now make a file `content\articles\First-post.md`

and write 

```md
---
author:
  name: Abhishek
  bio: Subscribe for more such content
  image: none

title: "this is title"
img: https://images.unsplash.com/photo-1600132806608-231446b2e7af?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1374&q=80
description: This is desc!
---

# title is hello world

```

Now make a file `pages\blog\index.vue`

and write this inside of `index.vue`

```vue
<template>
  <div
    class="max-w-3xl max-w-5xlmin-h-screen flex justify-center mx-auto my-12"
  >
    <main class="w-full mx-4">
      <h1
        class="text-3xl font-thin mb-6 mx-4 uppercase border-b-4 border-indigo-400"
      >
        My BLOG
      </h1>
      <section class="space-y-4 divide-y">
        <article v-for="post of posts" :key="post.slug" class="pt-4">
          <h2 class="text-lg mb-2 text-blue-700 hover:text-blue-800">
            <nuxt-link :to="`/blog/${post.slug}`">
              {{ post.title }}
            </nuxt-link>
          </h2>
          <img :src="post.img" />
          <!-- <img src="{{ post.img }}" /> -->

          <span>
            {{ post.description }}
          </span>
        </article>
      </section>
    </main>
  </div>
</template>

<script>
export default {
  data() {
    return {
      posts: [],
    };
  },
  async fetch() {
    this.posts = await this.$content("articles").fetch();
    console.log(this.posts, "post");
  },
};
</script>

```


Now make a file `pages\blog\_slug.vue`

and write this inside of `_slug.vue`

```vue
<template>
  <div class="max-w-3xl mx-4 md:mx-auto min-h-screen my-12">
    <div v-if="post">
      <h1 class="text-2xl font-semibold mb-6">{{ post.title }}</h1>
      <nuxt-content :document="post" />
      <div class="mt-8">
        <nuxt-link to="/blog" class="hover:underline">Back to blog</nuxt-link>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      post: null,
    };
  },
  async fetch() {
    this.post = (
      await this.$content("articles")
        .where({ slug: this.$route.params.slug })
        .limit(1)
        .fetch()
    )?.[0];
  },
  head() {
    return {
      title: this.post?.title,
      // meta: [{ name: "description", content: this.post?.description }],
      meta: [
        {
          hid: "description",
          name: this.post?.title,
          content: this.post?.description,
        },
      ],
    };
  },
};
</script>

<style>
h2 {
  margin-top: 20px;
  margin-bottom: 20px;
}
a {
  color: blueviolet;
}
</style>

```

Now go to your `localhost:3000/blog`
you should see something like this

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gsuewkzk7u4luq8o7lam.png)