Ter um blog para escrever e compartilhar nosso conhecimento na internet é fundamental para ter visibilidade e nos tornar conhecidos em nossa área como autoridade no assunto.
Este artigo ensinará como criar um blog com páginas dinâmicas para cada artigo.
Para acompanhar, veja a base de código e seu repositório no GitHub e a demonstração para referência.
O seguinte é necessário para concluir este tutorial:
Para começar, abra o terminal e execute o comando:
npx create-nuxt-app blog-for-developers
O comando acima iniciará um prompt de interface de linha de comando (CLI) que nos permitirá configurar vários aspectos do nosso projeto.
Agora que o clichê está configurado com todos os arquivos e pastas, vamos rodar o servidor de desenvolvimento que está acessível em
http://localhost:3000
dentro do projeto. # change directory to project folder
cd blog-for-developers
# start the development environment
npm run dev
O que é Nuxt?
O NuxtJS é um framework Vue intuitivo de código aberto que nos permite construir interfaces de usuário, tornando o desenvolvimento web simples e poderoso.
O que é o Nuxt Content?
Durante a configuração inicial deste projeto, selecionamos o módulo de conteúdo Nuxt. Este módulo nos permite usar nossa base de código como um CMS headless baseado em Git para acessar markdown, JSON, YAML, XML e até mesmo arquivos CSV por meio de uma interface semelhante à API. Com este módulo
@nuxt/content
, ele injetará o $content
instância globalmente em nosso projeto para acessá-la em qualquer lugar em um projeto. O que é Cloudinário?
Cloudinary é uma ferramenta de gerenciamento de imagem e vídeo de serviço em nuvem para aplicativos da web e móveis. Com o Cloudinary, podemos carregar, criar e gerenciar experiências digitais em qualquer navegador e dispositivo.
Antes de criarmos o conteúdo do blog em markdown usando o conteúdo do Nuxt, vamos primeiro criar a página inicial do blog que incluirá os links de navegação e algum texto.
Adicionar estilo de fonte
No
nuxt.config.js file
, podemos adicionar nossa fonte favorita à seção head e usar uma família de fontes específica, conforme mostrado abaixo: O bloco de código acima não terá efeito na página até que escrevamos o CSS que usará a fonte.
Agora, adicione o seguinte código ao
pages/index.vue
que incluirá os links de navegação e algum texto na página inicial. Remova o componente, <Tutorial />
. <template> <section class =" showcase "> < header > < h2 class =" logo "> < nuxt - link to ="/"> ecosurf </ nuxt - link > </ h2 > < nav class =" nav desktop "> < ul > < li class =" nav__list "> < nuxt - link to ="/ blogs "> Stories </ nuxt - link > </ li > </ ul > </ nav > </ header > < video
autoplay
loop muted
src =" https: // res . cloudinary . com / terieyenike / video / upload / v1651393236 / mixkit - tropical - island - landscape - view - 4692 - large_yanvml . mp4 "></ video > < div class =" overlay "></ div > < div class =" text "> < h2 data - type =" uppercase " class =" stroke "> Never Stop </ h2 > < h3 data - type =" uppercase "> Exploring The World </ h3 > < p > View of the tropical island landscape, from a hill with houses, palm
trees and many trees, and in the distance the hills that surround the
sea, on a sunny day . </ p > </ div > < ul class =" social "> < li > < a href =" https: // twitter . com / terieyenike " rel =" noopener noreferrer " target =" _blank ">< img
alt =" twitter profile " src =" https: // i . ibb . co / Wnxq2Nq / twitter . png "/></ a > </ li > < li > < a href =" https: // instagram . com / terieyenike " rel =" noopener noreferrer " target =" _blank ">< img
alt =" instagram profile " src =" https: // i . ibb . co / ySwtH4B / instagram . png "/></ a > </ li > </ ul > </ section > </ template >
No bloco de código acima, incluímos um
<video>
com a fonte do vídeo armazenada no Cloudinary com atributos como reprodução automática, loop e mudo que silenciam o vídeo quando ele é carregado. Para obter a mídia armazenada no Cloudinary, carregamos o vídeo desejado na guia da biblioteca de mídia. Em seguida, copie a URL que será anexada ao src
do <video>
. Além disso, referenciamos os links no cabeçalho de navegação com o
nuxt-link
componente tanto para a casa /
e a /blogs
rotas que iremos criar para visualizar todos os nossos blogs. assets/styles/main.css
, e inclua o seguinte desta essência . nuxt.config.js
arquivo, atualize o arquivo para incluir o arquivo CSS criado com o seguinte: export default { ... css : [ '@/assets/styles/main.css' ], ... }
Aqui está como nossa página deve ficar:
Para construir nosso site de blog, precisamos ter conteúdo para exibir e renderizar no
/blogs
página. Primeiro, crie um content
diretório e, em seguida, o diretório do blog que conterá todos os arquivos markdown. Escrever todo o conteúdo em markdown oferece suporte a vários padrões de sintaxe de markdown, como cabeçalhos, links e blocos de código com realce de sintaxe para diferentes linguagens de programação. content/blogs/egghead.md
. --- title: Egghead cover _image: https://res.cloudinary.com/terieyenike/image/upload/v1651446130/pexels-jeremy-bishop-8241100_ oklfpe.jpg author: Teri Eyenike description: All we need to do is open up our terminal and run the command npm install @nuxt/content. Once it's installed, you'll see that inside of our package.json, we see our Nuxt Content module. Next, to finalize the setup, let's go ahead and open up our nuxt.config.js, and let's go ahead and scroll down to the section that's labeled Modules. date: May 2, 2021 publishOn: 2021-05-02T00:00:00 tags: ["learning", "platform"] --- [ Egghead ]( https://www.egghead.io ) is a great platform for developers to enhance their skills! <!-- more content -->
Os arquivos Markdown têm a capacidade de adicionar metadados usando o conceito de matéria inicial, que é denotado com a sintaxe de traço triplo no início e no fim da matéria inicial. Os metadados, é o que é exibido para os leitores como a hora da publicação e o trecho do conteúdo do blog, é o que é exibido para os leitores. Outras várias propriedades podem ser incluídas.
PS: Dentro da matéria inicial, ele usa a sintaxe YAML.
Obtendo as postagens
Para buscar as postagens da página do blog, vamos criar uma nova rota em
pages
. Crie uma pasta, chamada blogs, e nela crie index.vue
arquivo para o diretório, blogs. pages/blogs/index.vue
para exibir os arquivos de remarcação renderizados. // pages/blogs/index.vue
<template> < main >
< header >
< h2 class = "logo" >
< nuxt-link to = "/" > ecosurf </ nuxt-link >
</ h2 >
< nav class = "nav desktop" >
< ul >
< li class = "nav__list" >
< nuxt-link to = "/blogs" > Stories </ nuxt-link >
</ li >
</ ul >
</ nav >
</ header >
< div class = "container section" >
< div class = "container__grid" >
< div v-for = "blog in blogs" :key = "blog.slug + blog.createdAt" class = "card" >
< img :src = "blog.cover_image"
alt = "blog photographs" />
< div class = "pad__card" >
< div class = "author" >
< p class = "author__name" > {{ blog.author }} </ p > < span > | </ span >
< p > {{ blog.date }} </ p >
</ div >
< h2 class = "title" > {{ blog.title }} </ h2 >
< p > {{ blog.description.substring(0, 150) }}... </ p >
< button >
< nuxt-link :to = "`/blogs/${blog.slug}`" > Read More </ nuxt-link >
</ button >
</ div >
</ div >
</ div >
</ div >
</ main >
</template> < script >
export default { async asyncData ( {$content} ) { const blogs = await $content( "blogs" ).sortBy( "publishOn" , "desc" ).fetch() return { blogs } }, head ( ) { return { title : "Read interesting stories as a nomad" , meta : [ { hid : 'description' , name : 'description' , content : 'Daily and juicy content as you learn, work, and relax. WFH'
} ] } } } </ script >
< style scoped >
header { background : #111111 ; position : unset; } .container { width : 85% ; max-width : 75rem ; margin -inline: auto; } .section { padding : 3em 0 ; } .container__grid { display : grid; gap: 2em ; grid-template- columns : repeat (auto-fit, minmax ( 19rem , 1 fr)); } .card { background : #f0f7f4 ; box-shadow : 0px 4px 3px rgba ( 0 , 0 , 0 , 0.1 ); border-radius : 5px ; } .card img { object-fit : cover; border-top-left-radius : 5px ; border-top-right-radius : 5px ; width : 100%
} .pad__card { padding : 2em ; } .author { display : flex; align-items : center; } .author , .title { margin-bottom : 1em ; } .author span { margin : 0 0.3em ; } .author__name { text-transform : capitalize; } button { border : unset; padding : 1em 2em ; margin-top : 2em ; background : #0D5159 ; font-weight : 700 ; cursor : pointer; } button a { color : #fff ; } </ style >
O bloco de código acima faz o seguinte:
asyncData
: usado para gerar nossa página do Nuxt, pois gera arquivos individuais estaticamente para os usuários. Nós passamos no $content
método onde as notas do blog são armazenadas, o sortBy()
função, e o fetch
método. sortBy()
: leva dois parâmetros, publishOn
(classificar por data) e os atributos desc sobre como você deseja que o conteúdo apareça com base no conteúdo mais recente publicado /blogs/
o slug do blog no botão Leia mais usando o <nuxt-link>
componente. Renderizando as postagens
A última etapa para visualizar o snippet das postagens renderizadas do diretório de conteúdo é usar a diretiva v-for e percorrer os blogs e renderizar cada artigo em um cartão.
Aqui está como a página do blog deve ficar agora:
Agora vamos criar páginas para cada postagem de blog para ter rotas de URL dinâmicas. No Nuxt, para criar páginas dinâmicas, acrescentamos um sublinhado antes do nome do arquivo .vue para não tornar a URL codificada.
Criamos então o
_slug.vue
arquivo no diretório blogs e adicione o seguinte código: // pages/blogs/_slug.vue
<template> < main >
< header >
< h2 class = "logo" >
< nuxt-link to = "/" > ecosurf </ nuxt-link >
</ h2 >
< nav class = "nav desktop" >
< ul >
< li class = "nav__list" >
< nuxt-link to = "/blogs" > Stories </ nuxt-link >
</ li >
</ ul >
</ nav >
</ header >
< div class = "container" >
< div class = "return" >
< nuxt-link to = "/" >
< img alt = "back to home" src = "/home.png" />
</ nuxt-link >
< span > / </ span >
< nuxt-link to = "/blogs" > Blog </ nuxt-link >
< span > / </ span >
< p > {{ note.title.substring(0, 15) }}... </ p >
</ div >
< section >
< h1 > {{ note.title }} </ h1 >
< nuxt-content :document = "note" cla />
</ section >
</ div >
</ main >
</template> < script >
export default { async asyncData ( {$content, route} ) { const note = await $content( `blogs/ ${route.params.slug} ` ).fetch() return { note } } } </ script >
< style scoped >
header { background : #111111 ; position : unset; } .container { width : 85% ; max-width : 75rem ; margin -inline: auto; } section { padding-bottom : 2em ; } .return { display : flex; margin : 1.5em 0 ; } .return img { width : 20px ; height : 20px ; } .return span { margin : 0 1em ; } h1 { margin-bottom : 1em
} </ style >
Este bloco de código faz o seguinte:
${route.params.slug}
: Usamos o conteúdo para buscar um arquivo específico do diretório blogs usando o parâmetro de rota e o slug que mapeará para o nosso nome de arquivo real document
com o inteiro note
objeto scoped
: Definindo o escopo para o elemento de estilo, certifique-se de que o estilo se aplica apenas a uma página específicaA criação de um blog é ótima quando você deseja compartilhar seus pensamentos com um público mais amplo e o Nuxt nos forneceu uma maneira de fazer isso neste artigo. Ainda existem outros recursos que ainda podemos explorar para garantir que tenhamos um site de blog robusto.
Saber mais
Experimente a demonstração ao vivo