Daftar Isi:
Membikin blog pribadi memang menjadi kebutuhan seorang programmer. Di sana kita Bisa menuliskan hal – hal yang kita pelajari atau sekedar sharing pengalaman. Ketika ini, banyak yang memilih Notion sebagai platform Demi menulis konten mereka.
Kenapa menggunakan Notion?
Berdasarkan data dari Forbes pada tahun 2021, pengguna Notion sudah mencapai 20 juta. Notion sendiri merupakan platform pengelolaan konten yang Mempunyai banyak fitur unggulan seperti mudah Demi kolaborasi, support Notion AI, Luwes, dan banyak fitur lainnya. Berita baiknya, Notion juga Mempunyai fitur Notion API yang memudahkan kita Demi menggunakannya sebagai CMS (Content Management System) Demi blog kita.
Stack yang digunakan pada tutorial ini
Pastikan Anda sudah terlebih dahulu menginstall Node.js dan npm. Stack yang dipakai Demi tutorial ini adalah :
- Notion : Content Management System (CMS) yang digunakan Demi mengelola konten blog.
- NextJS 14 : Framework react yang kita gunakan Demi Membikin blog. Kita akan menggunakan versi 14.
- TailwindCSS : Framework CSS yang berfokus pada utility class yang Mempunyai design yang bagus dan mudah di-customize.
Disclaimer : Pada tutorial ini kita akan berfokus kepada NextJS dan Notion API. Demi aspek tampilan visual dan SEO, Mitra – Mitra diharapkan melakukan improvisasi.
Konfigurasi Notion
Sebelum memulai konfigurasi, pastikan Anda Mempunyai akun Notion karena integrasi dengan NextJS memerlukan dua key, Yakni Notion Token
dan Database ID
Membikin Notion Token
Tutorial Metode Membikin Notion Token
, Anda Bisa lihat tutorial atau ke halaman Membikin token baru. Pada tutorial ini, saya menggunakan nama Integrasi Blog Pribadi.
Copy Notion Token
dari tab Secret
dan simpan dengan Berkualitas. (Keep it secret π€«)
Setelah Notion Token
terbuat, kita akan mengatur Capabilities
integrasinya hanya Demi read-only
, sehingga fitur-fitur lain dapat dinonaktifkan.
Setelah berhasil Membikin Notion Token
, langkah selanjutnya adalah Membikin Database ID
.
Membikin Database ID
Anda Bisa menduplikasi template Blog Pribadi yang Eksis di sini. Demi tutorial duplikasi template, lihat pada tutorial.
Dalam template Blog Pribadi tersebut kita Mempunyai 7 atribute Primer :
- Title. Judul postingan.
- Slug. URL blog agar mudah Demi diakses.
- Description: Penjelasan singkat mengenai topik yang dibahas.
- Author. Nama penulis.
- Status. Status postingan, apakah Lagi draft atau published.
- Published Date. Lepas postingan di-publish.
- Creation Date. Lepas postingan dibuat.
Setelah menduplikasi template di atas, buka template Notion di workspace Anda. Pada URL page tersebut, copy Database ID
sesuai dengan posisi URL di Rendah ini:
https://www.notion.so/{workspace_name}/**{database_id}**?v={view_id}
Integrasi Notion Token dengan Database
Demi mengintegrasikan Notion Token
dengan database, kita perlu menambahkan koneksi dengan Metode mengklik β’β’β’
di kanan atas, Lampau pilih Add Connections
dan pilih Integrasi Blog Pribadi yang telah dibuat pada step sebelumnya, atau dapat mengikuti petunjuk dalam tutorial.
Tiba di step ini, kita telah Mempunyai Notion Token
dan Database ID
.
Konfigurasi NextJS
NextJS adalah framework React yang memudahkan kita dalam mengembangkan aplikasi berbasis react. NextJS juga support Server Side Rendering (SSR) yang cocok Demi Membikin blog menggunakan Notion API.
Demi menginstall NextJS Bisa menjalankan perintah ini pada terminal.
npx create-next-app@latest
Konfigurasi NextJS yang saya Mengenakan tutorial ini.
β What is your project named? blog-pribadi
β Would you like to use TypeScript with this project? Yes
β Would you like to use ESLint with this project? Yes
β Would you like to use Tailwind CSS with this project? Yes
β Would you like to use `src/` directory with this project? Yes
β Use App Router (recommended)? Yes
β Would you like to customize the default import alias? No
Masuk ke directory blog-pribadi
dan tambahkan plugin tailwind Demi membantu proses rendering HTML khususnya bagian typograhpy.
cd blog-pribadi
npm install -D @tailwindcss/typography
Buka tailwind.config.js
dan copy paste konfigurasi di Rendah ini. Pada langkah ini kita hanya menghapus konfigurasi yang Bukan terpakai dan menambahkan plugins yang telah kita install barusan.
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
'./src/pages/**/*.{js,ts,jsx,tsx,mdx}',
'./src/components/**/*.{js,ts,jsx,tsx,mdx}',
'./src/app/**/*.{js,ts,jsx,tsx,mdx}',
],
theme: {}, // Hapus theme yang Bukan terpakai
plugins: [
require('@tailwindcss/typography'),
],
}
Pada step selanjutnya, kita hapus CSS class yang Bukan diperlukan dan mengganti Corak background pada body menjadi Corak putih. Caranya Bisa copy paste src/app/globals.css
di Rendah ini.
@tailwind base;
@tailwind components;
@tailwind utilities;
body {
background: #ffffff;
}
Selanjutnya hapus codingan yang Bukan terpakai di halaman page.tsx
sehingga menyisakan codingan di Rendah ini.
export default function Home() {
return >;
}
Kemudian kita run perintah di Rendah ini Demi memulai project.
npm run dev
Demi mengaksesnya project kita pada browser, kita dapat menuliskan pada URL :
Kalau Bukan Eksis error, maka akan muncul halaman putih tanpa tulisan apa – apa. Dengan begini, kita berhasil menghapus codingan yang Bukan terpakai dan siap Demi melanjutkan integrasi dengan Notion.
Integrasi Notion dengan NextJS
Kita akan menyimpan Notion Token
dan Database ID
yang telah kita dapatkan dengan format seperti di Rendah ini pada .env.local
. Kalau belum Eksis, Bisa di buat file terlebih dahulu, pastikan Demi membuatnya pada root project.
NOTION_TOKEN="secret_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
NOTION_DATABASE_ID="xxxxxxxxxxxxxxxxxxxxxxx"
Demi memudahkan dalam menampilkan data Notion di project kita, maka kita perlu menginstall library Notion.
npm install @notionhq/client @notion-render/client
Membikin List Blog
Kita akan Membikin tampilan list blog seperti di Rendah ini. Data ini diambil dari template notion yang telah kita buat sebelumnya, dan hanya menampilkan list blog yang statusnya sudah Published
.
Buat file baru di src/app/lib/notion.tsx
dan copy paste codingan di Rendah ini.
const { Client } = require("@notionhq/client");
export const notion = new Client({
auth: process.env.NOTION_TOKEN,
});
export const getAllPublishedBlog = async () => {
const posts = await notion.databases.query({
database_id: process.env.NOTION_DATABASE_ID,
filter: {
property: "status",
select: {
equals: "Published",
},
},
sorts: [
{
property: "createdTime",
direction: "descending",
},
],
});
const allPosts = posts.results;
return allPosts.map((post: any) => {
return getPageContent(post);
});
};
const getPageContent = (post: any) => {
return {
id: post.id,
title: post.properties.title.title[0].plain_text,
author: post.properties.author.select.name,
publishedDate: post.properties.publishedDate.date.start,
slug: post.properties.slug.formula.string,
description: post.properties.description.rich_text[0].plain_text,
};
};
- getAllPublishedBlog : mengambil data di Notion yang
status
=Published
dan diurutkan berdasarkancreatedTime
secaradescending
. - getPageContent: memformat content dari object
Post
agar hasil dari fungsi tersebut hanya berisi object yang kita butuhkan.
Tambahkan file baru src/app/types/Notion.tsx
Demi deklarasi types.
export type Post = {
id: string;
title: string;
slug: string;
description: string;
author: string;
status: string;
publishedDate: Date;
createdDate: Date;
}
Hapus Seluruh codingan yang Eksis di page.tsx
dan copy paste dari codingan di Rendah ini. Pada halaman ini, kita akan memanggil getAllPublishedBlog
dan me-render-nya pada halaman Primer.
import Link from "next/link";
import { getAllPublishedBlog } from "./lib/notion";
import { Post } from "./types/Notion";
export default async function Home() {
const posts = await fetchBlogData();
return (
main className="flex min-h-screen flex-col items-center justify-between p-24">
div className="w-[672px] mx-auto">
h1 className="text-3xl font-bold mb-6">List Blogh1>
{posts.length === 0 ? (
p>No posts available.p>
) : (
posts.map((post: Post, index: number) => (
article
key={index}
className="bg-white rounded-lg cursor-pointer p-4 mb-4 border-b border-gray-300"
>
div>
span className="text-gray-500 mb-2 text-sm">
{post.publishedDate.toString()}
span>
h2 className="text-xl font-semibold mb-2">
Link
className="text-blue-500 hover:underline"
href={`/blog/${encodeURIComponent(post.slug)}`}
>
{post.title}
Link>
h2>
p>{post.description}p>
div>
article>
))
)}
div>
main>
);
}
async function fetchBlogData() {
const res = getAllPublishedBlog();
return res;
}
Membikin Detail Blog
Kalau kita mengklik salah satu judul blog dari list blog yang Eksis, maka halaman tersebut akan pergi ke halaman Detail Blog berdasarkan slug
yang dikirimkan.
Demi implementasinya, kita kembali Tengah file ke lib/notion.tsx
dan tambahkan codingan di Rendah ini.
import { NotionRenderer } from "@notion-render/client";
// tambahkan di Rendah function getAllPublishedBlog
export const getSinglePost = async (slug: string) => {
const response = await notion.databases.query({
database_id: process.env.NOTION_DATABASE_ID,
filter: {
property: "slug",
formula: {
string: {
equals: slug,
},
},
},
});
const singlePost = response.results[0];
const responseBlockPages = await notion.blocks.children.list({
block_id: singlePost.id,
});
const content = responseBlockPages.results;
const renderer = new NotionRenderer({
client: notion,
});
const html = await renderer.render(...content);
return {
...getPageContent(singlePost),
content: html,
};
};
- getSinglePost : mengambil data di Notion yang
slug
= parameter yang kita kirim. Selanjutnya kita mengambil isi block yang Eksis di dalam Notion dan me-render-nya ke dalam format HTML menggunakan library@notion-render/client
yang telah kita install sebelumnya.
Buat file baru di src/app/blog/[slug]/page.tsx
dan copy paste codingan di Rendah ini. Pada halaman ini kita akan me-render halaman detail blog dengan memanggil getSinglePost
. Parameter slug
yang Eksis di URL kita lempar ke dalam fungsi getSinglePost
Demi mendapatkan data Notion.
import { getSinglePost } from "@/app/lib/notion";
import Link from "next/link";
export default async function Page({ params }: { params: { slug: string } }) {
const post = await fetchBlogData(params.slug);
return (
main className="flex min-h-screen flex-col items-center justify-between p-24">
div className="w-[672px] mx-auto">
Link href="/" className="text-blue-500">
< Go Back
Link>
div className="my-4">
span className="text-gray-600">
{post.publishedDate} | By {post.author}{" "}
span>
div>
h1 className="text-6xl text-gray-900 font-bold my-6">{post.title}h1>
div
className="prose"
dangerouslySetInnerHTML={{ __html: post.content }}
>div>
div>
main>
);
}
async function fetchBlogData(slug: string) {
const res = getSinglePost(slug);
return res;
}
Deploy ke Vercel
Kalau semuanya sudah berjalan dengan Berkualitas, Anda Bisa push codingan Anda ke github dan mendeploy ke Vercel. Pastikan Notion Token
dan Database ID
Anda terkonfigurasi dengan Berkualitas di Vercel.
Penutup
Demi source code tutorial ini Bisa di lihat di github.
Kalau Anda Ingin melakukan perubahan dalam konten blog Anda, Anda Bukan perlu mengubah codingan apapun, Anda hanya perlu mengubahnya pada notion database dan perubahan tersebut akan langsung teraplikasi pada blog Anda. Selamat mencoba.