October 30, 2023 4 min read

Cara menerapkan Server Side Rendering (SSR) di Next.JS

Image Article

Next.js merupakan framework dari React.JS yang memberikan berbagai macam fitur dan kemudahan, seperti routing berdasarkan halaman(pages), typescript support, image optimization, internationalization, dll. Next.JS sendiri mendukung berbagai macam metoda rendering seperti CSR (Client Side Rendering), SSR (Server Side Rendering), dan SSG (Server Side Generation). untuk mengetahui perbedaan serta kelebihan dan kekurangan dari CSR dan SSR, silahkan baca artikel ini.

Server Side Rendering atau disingkat SSR merupakan sebuah metode dalam memuat sebuah website berbasis javascript pada suatu server. Untuk menerapkan SSR kita dapat menggunakan berbagai tools seperti Next.js, Remix.js, nuxt.js, dll. Pada srtikel kali ini kita akan membahas cara imolementasi SSR dengan Next.Js.

Penerapan SSR dengan Next.JS

Pada tutorial kaoi ini kita menggunakan npm dan typescript serta menggunakan API https://jsonplaceholder.typicode.com

1. Setup Next.JS

setup dengan mengetikan

npm install next@latest react@latest react-dom@latest

kemudian ikuti alur install seperti pada artikel sebelumya

2. Jalankan Server

untuk menjalankan ketikan perintah

npm run dev

3. Tambahkan Fungsi getServerSideProps

Untuk menerapkan SSR pada Next.JS perlu menggunakan fungsi bawaan yaitu getServerSideProps. Penggunaanya cukup mudah, tetapi sebelumnya kita akan membuat tipe data terlebih dahulu. Tambahkan kode berikut pada file pages/index.tsx.

type Todos = {
    userId : number;
    id : number;
    title : string;
    completed : boolean;
}

Selanjutnya pada file yang sama kita akan menambahkan fungsi getServerSideProps seperti ini :

export async function getServerSideProps() {
    //fetch ddata from API
    const res = await fetch('https://jsonplaceholder.typicode.com/todos');
    const data : Todos[] = await res.json();

    //pass data to the page via props
    return {
        props: { data };
    }
}

pada kode diatas getServerSideProps melakukan fetching data dari eksternal API. kemudian response datanya di transform menjadi format JSON. lalu hasil transform di passing ke fungsi utama melalui object props.

const Home = ({data}: InferGetServerSidePropsType<typeof getServerSideProps>) => {
  return (
    <div>
      <Head>
        <title>SSR Demo</title>
        <meta name=”description” content=”SSR Demo” />
        <link rel=”icon” href=”/favicon.ico” />
     </Head>
    <main className={styles.main}>
      {data.map((todo) => {
          return (
             <div className={styles.container} key={todo.id}>
               <h2 className={`${styles.title} ${todo.completed ? styles.isComplete : “”} `}>
                 {todo.title}
                </h2>
             </div>
        );
      })}
     </main>
   </div>
);
};

Kode diatas terdapat fungsi bernama Home yang akan menerima object. didalam object tsb dterdapat attribute dengan nama data. Data tsb diperoleh dari hasil fetch eksternal API. kemudian data tersebut ditampilkan pada DOM.

Agar tampilan website menjadi lebih menarik, perlu ditambahkan beberapa kode di file home.module.css

.main {
  min-height: 100vh;
  padding: 1rem 0;
  margin: 0 20px;}.container {
  background-color: aliceblue;
  padding: 10px 20px;
  margin-bottom: 10px;
  border-radius: 10px;
}.title {
  font-size: 18px;
  color: green;
}.isComplete {
  color: red;
  text-decoration: line-through;
}

berikut tampilan akhir dari website image

untuk mengecek apakah SSR berjalan atau tidak , dapat dengan cara membuka page source pada browser dengan menekan crtl+U. Jika data-data yang di fetch sebelumnya tampil pada source code, maka SSR berhasil berjalan dengan baik. image

dan ini full code dari file pages/index.tsx

import type { InferGetServerSidePropsType } from "next";
import Head from "next/head";

import styles from "../styles/Home.module.css";

type Todos = {
  userId: number;
  id: number;
  title: string;
  completed: boolean;
};

const Home = ({
  data,
}: InferGetServerSidePropsType<typeof getServerSideProps>) => {
  return (
    <div>
      <Head>
        <title>SSR Demo</title>
        <meta name="description" content="SSR Demo" />
        <link rel="icon" href="/favicon.ico" />
      </Head>

      <main className={styles.main}>
        {data.map((todo) => {
          return (
            <div className={styles.container} key={todo.id}>
              <h2
                className={`${styles.title} ${
                  todo.completed ? styles.isComplete : ""
                } `}
              >
                {todo.title}
              </h2>
            </div>
          );
        })}
      </main>
    </div>
  );
};

export async function getServerSideProps() {
  // Fetch data from external API
  const res = await fetch(`https://jsonplaceholder.typicode.com/todos`);
  const data: Todos[] = await res.json();

  // Pass data to the page via props
  return { props: { data } };
}

export default Home;

Note:

Untuk melakukan SSR tidak harus menggunakan Next JS, dapat juga dengan menggunakan framework lainnya seperti Remix.js