Next.js, React tabanlı bir web framework’üdür ve Markdown dosyaları kullanarak bir blog oluşturmak istiyorsanız, React-markdown paketi kullanarak kolayca yapabilirsiniz. Aşağıdaki adımlar, Next.js projesinde React-markdown kullanarak bir Markdown blog oluşturmanıza yardımcı olacaktır:

React-markdown Kullanarak Next.js Markdown Blogu Nasıl Oluşturulur?

İlk önce, Next.js projenizin dizininde bir pages dizini oluşturun ve içinde bir blog dizini oluşturun.

blog dizininde, index.js dosyası oluşturun. Bu, blogunuzun ana sayfası olacaktır.

React-markdown paketini yüklemek için terminalde aşağıdaki komutu çalıştırın:

npm install react-markdown

Markdown dosyalarınızı içerecek bir markdown dizini oluşturun. Bu dizindeki her dosya, bir blog gönderisine karşılık gelecektir.

index.js dosyasında, getStaticProps fonksiyonunu kullanarak markdown dizinindeki tüm Markdown dosyalarını alın ve sayfada kullanılmak üzere JSON verilerine dönüştürün. Aşağıdaki kod örneği size yol gösterecektir:

import fs from 'fs';
import path from 'path';
import matter from 'gray-matter';
import ReactMarkdown from 'react-markdown';

export async function getStaticProps() {
  const files = fs.readdirSync(path.join('markdown'));

  const posts = files.map(filename => {
    const markdownWithMetadata = fs.readFileSync(path.join('markdown', filename)).toString();

    const { data, content } = matter(markdownWithMetadata);

    return {
      frontmatter: data,
      markdownBody: content,
      slug: filename.replace('.md', ''),
    };
  });

  return {
    props: {
      posts,
    },
  };
}
index.js dosyasında, posts öğesini kullanarak bir blog gönderileri listesi oluşturun. Aşağıdaki örnek kod, her gönderinin başlığını, özetini ve bağlantısını içeren bir liste oluşturur:
export default function Blog({ posts }) {
  return (
    <div>
      {posts.map(post => (
        <div key={post.slug}>
          <h2>{post.frontmatter.title}</h2>
          <p>{post.frontmatter.excerpt}</p>
          <Link href={`/blog/${post.slug}`}>
            <a>Read more</a>
          </Link>
        </div>
      ))}
    </div>
  );
}
blog dizininde, slug.js adlı yeni bir dosya oluşturun. Bu dosya, her gönderinin ayrıntılarını gösteren sayfadır.
slug.js dosyasında, yine getStaticProps fonksiyonunu kullanarak Markdown dosyasının içeriğini alın ve sayfada kullanılmak üzere JSON verilerine dönüştürün.
Aşağıdaki örnek kod, getStaticProps fonksiyonunu kullanarak Markdown dosyasının içeriğini alır ve sayfada kullanılmak üzere JSON verilerine dönüştürür:
import fs from 'fs';
import path from 'path';
import matter from 'gray-matter';
import ReactMarkdown from 'react-markdown';

export default function Post({ frontmatter, markdownBody }) {
  return (
    <div>
      <h1>{frontmatter.title}</h1>
      <p>{frontmatter.date}</p>
      <ReactMarkdown>{markdownBody}</ReactMarkdown>
    </div>
  );
}

export async function getStaticPaths() {
  const files = fs.readdirSync(path.join('markdown'));

  const paths = files.map(filename => ({
    params: {
      slug: filename.replace('.md', ''),
    },
  }));

  return {
    paths,
    fallback: false,
  };
}

export async function getStaticProps({ params }) {
  const { slug } = params;

  const markdownWithMetadata = fs.readFileSync(path.join('markdown', `${slug}.md`)).toString();

  const { data, content } = matter(markdownWithMetadata);

  return {
    props: {
      frontmatter: data,
      markdownBody: content,
    },
  };
}
getStaticPaths fonksiyonu, tüm Markdown dosyalarının yolunu ve adını içeren bir paths dizisi döndürür. Bu, her blog gönderisinin benzersiz bir URL’sinin olması için gereklidir. Ayrıca fallback öğesi false olarak ayarlanmıştır, bu da yalnızca paths dizisindeki URL’lerin erişilebilir olacağı anlamına gelir.
Sayfanın içeriğini göstermek için ReactMarkdown bileşenini kullanın ve gönderinin başlığını ve tarihini göstermek için frontmatter verilerini kullanın.
Bu adımları takip ederek, React-markdown paketi kullanarak bir Markdown blogu oluşturabilirsiniz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir