7.md
May 17, 2020 · View on GitHub
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
libe… -
Crie um arquivo chamado
posts.jsdentro 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.

.png)