Belajar VueJS: Membuat Blog dengan VueJS dan NetlifyCMS.

April 25, 2020 5:00 PM - 5 min read


Jika dulu bila ingin membuat sebuah website atau blog biasanya menggunakan Wordpress atau Blogspot, benar? Namun sekarang ini pendekatan yang dapat digunakan untuk membuat sebuah blog sangat banyak selain menggunakan Wordpress atau Blogspot. Salah satunya dengan hadirnya teknologi modern framework yang dapat diconvert menjadi static site. Ada banyak pilihan teknologi yang dapat digunakan dalam membuat sebuah Blog, bila tidak ingin repot bisa menggunakan Jekyll, Hugo, Gatsby, atau VuePress. Namun kali ini saya akan menggunakan VueJS namun bukan VuePress melainkan Gridsome.

Lets get started!

Prerequisite:

  • Tahu sedikit VueJS/NuxtJS
  • Tahu sedikit GraphQL
  • Akun Github
  • Akun Netlify
  • Gridsome membutuhkan Node.js (v8.3+) dan juga NPM (saya pakai ini) atau YARN.

Apa itu Gridsome?

Baca sendiri disini yha. Dev yang baik harus pandai baca dokumentasi, jangan cuma mengandalkan stackoverflow. šŸ˜œ

Install GridsomeCLI

Bila anda sudah pernah atau biasa pakai CLI apa itu React, Vue, atau Nuxt CLI maka Gridsome juga punya CLInya. Dengan adanya CLI ini maka dapat memudahkan dalam melakukan instalasi Gridsome jadi setelah install tinggal langsung pakai deh. Mau tanpa CLI bisa juga, tapi ya harus pasang struktur foldernya sendiri, udah daripada ribet pake CLI aja.

NPM

npm install --global @gridsome/cli

Yarn

yarn global add @gridsome/cli

Lalu tinggal install project Gridsomenya di directory yang anda mau. Ikuti command dibawah ini.

  1. gridsome create my-gridsome-siteuntuk membuat projek Gridsome baru.
  2. Kemudian buka directory projek Gridsome anda dan buka terminal
  3. Lalu gunakan command gridsome develop untuk memulai server development project anda.

Okay All is set, project Gridsome anda sudah bisa digunakan. Tapi objective kita adalah membuat blog dengan menggunakan NetlifyCMS, benar?

.
ā”œā”€ā”€ package.json
ā”œā”€ā”€ gridsome.config.js
ā”œā”€ā”€ gridsome.server.js
ā”œā”€ā”€ static/
ā””ā”€ā”€ src/
    ā”œā”€ā”€ main.js
    ā”œā”€ā”€ layouts/
    ā”‚   ā””ā”€ā”€ Default.vue
    ā”œā”€ā”€ pages/
    ā”‚   ā”œā”€ā”€ Index.vue
    ā”‚   ā””ā”€ā”€ About.vue
    ā””ā”€ā”€ templates/

Strultur folder yang berhasil dibuat adalah seperti ini. Cukup mirip dengan NuxtJS. File Index.vuepada src/pages digunakan sebagai entry file dimana ini akan menjadi root URL localhost:8080/.

Sampai disini anda bisa melakukan modifikasi pada Index.vue dan About.vue lalu setelah ini upload project anda ke Github. Ikuti langkahnya disini untuk upload ke repo.

Setelah upload ke Giithub, sekarang saatnya deploy project ke Netlify. Gampang kok tinggal klik-klik aja jika udah anda akan mendapatkan alamat website anda dari Netlify.

Menghubungkan Dengan Netlify CMS

Dari dokumentasi dari Gridsome sudah sangat jelas untuk menghubungkan project Gridsome dengan Netlify CMS. Bacanya bisa mulai dari sini.

Udah? Sipp

Membuat List Blog Post

Setelah semua diatas selesai, anda bisa login melalui {alamat web anda}/admin dan anda sudah bisa posting post blog pertama anda.

CMS Netlify

Setelah anda menambahkan NetlifyCMS maka struktur folder anda menjadi seperti berikut ini bukan?

.
ā”œā”€ā”€ package.json
ā”œā”€ā”€ gridsome.config.js
ā”œā”€ā”€ gridsome.server.js
ā”œā”€ā”€ static/
|   ā””ā”€ā”€ uploads
ā”œā”€ā”€ posts/
ā””ā”€ā”€ src/
    ā”œā”€ā”€ main.js
    ā”œā”€ā”€ admin/
    ā”‚   ā”œā”€ā”€ config.yml
    |   ā”œā”€ā”€ index.js
    ā”‚   ā””ā”€ā”€ index.html
    ā”œā”€ā”€ layouts/
    ā”‚   ā””ā”€ā”€ Default.vue
    ā”œā”€ā”€ pages/
    ā”‚   ā”œā”€ā”€ Index.vue
    ā”‚   ā”œā”€ā”€ Blog.vue (Tambahkan file ini)
    ā”‚   ā””ā”€ā”€ About.vue
    ā””ā”€ā”€ templates/

Untuk membuat halaman list blog post, maka tambahkan file Blog.vue pada folder pages. Halaman ini sebagai halaman yang akan menampilkan list dari postingan blog yang telah kita buat.

Isi dari Blog.vue. Untuk CSSnya anda bisa bikin sendiri ya.

<template>
    <Layout>
        <h1>Blog</h1>
        <div class="content-wrapper">
          <template v-for="(p, idx) in $page.Post.edges">
            <g-link :to="p.node.path" :key="idx">
                <div class="item">
                  <h4>{{ p.node.title }}</h4>
                  <span><small>Posted from {{ p.node.date }}</small></span>
                  <p>{{ p.node.excerpt }}</p>
                </div>
            </g-link>
          </template>
        </div>
    </Layout>
</template>

Seletelah itu, masih berada di file yang sama Blog.vue, kita tambahkan script buat query graphQL untuk mendapatkan data dari folder /posts. Tambahkan dibawah </template>.

<page-query>
query {
  Post: allPost (sortBy: "date", order: DESC) {
    edges {
      node {
        id
        title
        excerpt
        date
        path
      }
    }
  }
}
</page-query>

Sampai disini seharusnya daftar postingan blog sudah muncul.

Membuat Single Page Blog Post

Jika diatas tadi halaman akan memunculkan list postingan blog, maka halaman ini akan memunculkan postingan blog yang diklik dari list diatas.

Pada langkah ini kita akan membutuhkan template.

Mari menuju gridsome.config.js

// gridsome.config.js

module.exports = {
  ....
  
  templates: {
    Post: [
      {
        path: '/blog/:title',
        component: './src/other/location/Post.vue'
      }
    ]
  }
}

Kemudian buat file Post.vue didalam folder /src/templates/Post.vue

//Post.vue

<template>
  <Layout>
    <div class="information">
      <h2>{{ $page.post.title }}</h2>
      <span>Date posted: {{ $page.post.date }}</span>
      <!-- <span>Date posted: {{ $page.post.date | date_format }}</span> -->
    </div>
    <div class="content">
      <div class="markdown-body main-c" v-html="$page.post.content"/>
    </div>
  </Layout>
</template>

<page-query>
query ($id: ID!) {
  post(id: $id) {
    title
    date
    content
    excerpt
  }
}
</page-query>

Tambahan ->

Mari jangan kita abaikan faktor SEO, yaitu title dan metatags untuk single page ini. Masih pada halaman Post.vue kita tambahkan metaInfo dibawah </page-query>.

//Post.vue

<script>
export default {
  metaInfo() {
    return {
      title: this.$page.post.title,
      meta: [
        { name: "description", content: this.$page.post.excerpt },
        { name: "twitter:card", content: "summary_large_image" },
        { name: "twitter:description", content: this.$page.post.excerpt },
        { name: "twitter:title", content: this.$page.post.title + ' - Gridsome' },
      ],
    }
  }
};
</script>

Sampai langkah ini seharusnya halaman untuk per postingan sudah bisa diakses dan perjumpaan kita sampai disini. Semoga tidak ada yang terlewat, jika ada sesuatu bisa komentar dibawah ini.