Tener un blog para escribir y compartir nuestro conocimiento en internet es fundamental para visibilizarnos y darnos a conocer en nuestro campo como una autoridad en un tema.
Este artículo le enseñará cómo crear un blog que tenga páginas dinámicas para cada artículo.
Para seguir, vea el código base y su repositorio en GitHub y la demostración como referencia.
Se requiere lo siguiente para completar este tutorial:
Para comenzar, abre la terminal y ejecuta el comando:
npx create-nuxt-app blog-for-developers
El comando anterior iniciará un indicador de la interfaz de línea de comandos (CLI) que nos permitirá configurar varios aspectos de nuestro proyecto.
Ahora que el repetitivo está configurado con todos los archivos y carpetas, ejecutemos el servidor de desarrollo al que se puede acceder en
http://localhost:3000
dentro del proyecto. # change directory to project folder
cd blog-for-developers
# start the development environment
npm run dev
¿Qué es Nuxt?
NuxtJS es un marco Vue intuitivo de código abierto que nos permite crear interfaces de usuario, lo que hace que el desarrollo web sea simple y poderoso.
¿Qué es el contenido de Nuxt?
Durante la configuración inicial de este proyecto, seleccionamos el módulo de contenido Nuxt. Este módulo nos permite usar nuestro código base como un CMS sin encabezado basado en Git para acceder a archivos Markdown, JSON, YAML, XML e incluso CSV a través de una interfaz similar a una API. Con este módulo
@nuxt/content
, inyectará el $content
instancia globalmente en nuestro proyecto para acceder a ella en cualquier parte de un proyecto. ¿Qué es Cloudinary?
Cloudinary es una herramienta de gestión de imágenes y videos de servicios en la nube para aplicaciones web y móviles. Con Cloudinary, podemos cargar, crear y administrar experiencias digitales en cualquier navegador y dispositivo.
Antes de crear el contenido para el blog en Markdown usando el contenido de Nuxt, primero creemos la página de inicio para el blog que incluirá los enlaces de navegación y algo de texto.
Añadir estilo de fuente
En el
nuxt.config.js file
, podemos agregar nuestra fuente favorita a la sección de encabezado y usar una familia de fuentes en particular como se ve a continuación: El bloque de código anterior no tendrá efecto en la página hasta que escribamos el CSS que usará la fuente.
Ahora, agregue el siguiente código a la
pages/index.vue
que incluirá los enlaces de navegación y algún texto en la página de inicio. Retire el 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 >
En el bloque de código anterior, incluimos un
<video>
con la fuente del video almacenada en Cloudinary con atributos como reproducción automática, bucle y silencio que silencian el video cuando se carga. Para obtener los medios almacenados en Cloudinary, subimos nuestro video deseado a la pestaña de la biblioteca de medios. A partir de entonces, copie la URL que se adjuntará al src
del <video>
. Además, hicimos referencia a los enlaces en el encabezado de navegación con el
nuxt-link
componente tanto para el hogar /
y el /blogs
rutas que crearemos para visualizar todos nuestros blogs. assets/styles/main.css
, e incluir lo siguiente de esta esencia . nuxt.config.js
actualice el archivo para incluir el archivo CSS creado con lo siguiente: export default { ... css : [ '@/assets/styles/main.css' ], ... }
Así es como debería verse nuestra página:
Para construir nuestro sitio de blog, necesitamos tener contenido para mostrar y representar en el
/blogs
página. Primero, crea un content
directorio y luego el directorio del blog que contendrá todos los archivos de rebajas. Escribir todo el contenido en Markdown es compatible con muchos de los estándares de sintaxis de Markdown, como los encabezados, los enlaces y los bloques de código con resaltado de sintaxis para diferentes lenguajes de programación. 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 -->
Los archivos Markdown tienen la capacidad de agregar metadatos utilizando el concepto de materia preliminar que se indica con la sintaxis de tres guiones al principio y al final de la materia preliminar. Los metadatos, es lo que se muestra a los lectores, como el momento de la publicación y el extracto del contenido del blog, es lo que se muestra a los lectores. Se pueden incluir otras propiedades diversas.
PD: Dentro de la materia frontal, utiliza la sintaxis YAML.
Obtener las publicaciones
Para obtener las publicaciones de la página del blog, creemos una nueva ruta en
pages
. Cree una carpeta, llamada blogs, y allí cree index.vue
archivo para el directorio, blogs. pages/blogs/index.vue
archivo para mostrar los archivos de rebajas 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 >
El bloque de código anterior hace lo siguiente:
asyncData
: se utiliza para generar nuestra página desde Nuxt, ya que genera archivos individuales de forma estática para los usuarios. Pasamos en el $content
método donde se almacenan las notas del blog, el sortBy()
función, y la fetch
método. sortBy()
: toma dos parámetros, publishOn
(ordenarlo por fecha) y los atributos desc sobre cómo desea que aparezca el contenido en función del contenido publicado más reciente /blogs/
el slug del blog en el botón Leer más usando el <nuxt-link>
componente. renderizando las publicaciones
El último paso para ver el fragmento de las publicaciones renderizadas desde el directorio de contenido es usar la directiva v-for y recorrer los blogs y renderizar cada artículo en una tarjeta.
Así es como debería verse la página del blog ahora:
Ahora vamos a crear páginas para que cada publicación de blog tenga rutas URL dinámicas. En Nuxt, para crear páginas dinámicas, agregamos un guión bajo antes del nombre del archivo .vue para no codificar la URL.
Entonces creamos el
_slug.vue
archivo en el directorio de blogs y agregue el siguiente 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 bloque de código hace lo siguiente:
${route.params.slug}
: Usamos el contenido para obtener un archivo específico de los blogs del directorio usando el parámetro de ruta y el slug que se asignará a nuestro nombre de archivo real document
con todo note
objeto scoped
: al definir el alcance del elemento de estilo, asegúrese de que el estilo solo se aplique a una página específicaLa creación de un blog es genial cuando quieres compartir tus pensamientos con un público más amplio y Nuxt nos ha proporcionado una forma de hacerlo en este artículo. Todavía hay otras características que aún podemos explorar para asegurarnos de tener un sitio web de blog sólido.
Aprende más
Pruebe la demostración en vivo