7.md

May 17, 2020 · View on GitHub

← Pagina Inicial

Pré-renderização e busca de dados

1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9

Implementar getStaticProps

Primeiro, instale a gray-matter, que permite analisar os metadados em cada arquivo de markdown.

npm install gray-matter

Em seguida, criaremos uma biblioteca simples para buscar dados do sistema de arquivos.

  • Crie um diretório de nível superior chamado lib e…

  • Crie um arquivo chamado posts.js dentro com o seguinte conteúdo:

import fs from 'fs'
import path from 'path'
import matter from 'gray-matter'

const postsDirectory = path.join(process.cwd(), 'posts')

export function getSortedPostsData() {
  // Get file names under /posts
  const fileNames = fs.readdirSync(postsDirectory)
  const allPostsData = fileNames.map(fileName => {
    // Remove ".md" from file name to get id
    const id = fileName.replace(/\.md$/, '')

    // Read markdown file as string
    const fullPath = path.join(postsDirectory, fileName)
    const fileContents = fs.readFileSync(fullPath, 'utf8')

    // Use gray-matter to parse the post metadata section
    const matterResult = matter(fileContents)

    // Combine the data with the id
    return {
      id,
      ...matterResult.data
    }
  })
  // Sort posts by date
  return allPostsData.sort((a, b) => {
    if (a.date < b.date) {
      return 1
    } else {
      return -1
    }
  })
}

E em pages/index.js, importe esta função:

import { getSortedPostsData } from '../lib/posts'

Em seguida, chame esta função em getStaticProps. Você precisa retornar o resultado dentro da chave props:

export async function getStaticProps() {
  const allPostsData = getSortedPostsData()
  return {
    props: {
      allPostsData
    }
  }
}

Depois que isso for configurado, o suporte allPostsData será passado para o componente Home. Para ver isso, modifique a definição do componente para obter {allPostsData}:

export default function Home ({ allPostsData }) { ... }

Para exibir os dados, adicione outra tag <section> na parte inferior deste componente:

export default function Home({ allPostsData }) {
  return (
    <Layout home>
      <Head>…</Head>
      <section className={utilStyles.headingMd}>…</section>
      <section className={`${utilStyles.headingMd} ${utilStyles.padding1px}`}>
        <h2 className={utilStyles.headingLg}>Blog</h2>
        <ul className={utilStyles.list}>
          {allPostsData.map(({ id, date, title }) => (
            <li className={utilStyles.listItem} key={id}>
              {title}
              <br />
              {id}
              <br />
              {date}
            </li>
          ))}
        </ul>
      </section>
    </Layout>
  )
}

Agora você deve ver os dados do blog se acessar http://localhost:3000.

Parabéns! Buscamos com êxito dados externos (do sistema de arquivos) e renderizamos previamente a página de índice com esses dados.

Vamos falar sobre algumas dicas para usar getStaticProps na próxima página.

next-arrow next-arrow

← Pagina Inicial