Cómo utilizar la representación del lado del servidor con Nuxt.js

El autor seleccionó Open Sourcing Mental Illness para recibir una donación como parte del programa Write for DOnations .
Introducción
Las aplicaciones de página única (SPA) son aplicaciones que se procesan como una sola index.html
página en el lado del cliente. Tradicionalmente, las SPA contienen muy poco HTML al cargarse; en cambio, un marco como Vue.js le permite inyectar contenido en un contenedor HTML a través de JavaScript cuando se cumplen ciertas condiciones. Si bien esto hace que la aplicación sea dinámica y personalizable, también causa problemas para la optimización de motores de búsqueda (SEO) porque los rastreadores web solo pueden analizar archivos que provienen del servidor y nunca se analiza todo el HTML importante en las rutas generadas dinámicamente.
Nuxt.js es un marco para aplicaciones Vue.js que puede resolver este problema con la representación del lado del servidor , una estrategia que representa la aplicación en el servidor y luego la envía al cliente. Con Nuxt, todas sus rutas se generan a partir de .vue
archivos en el pages
directorio. Dentro de estas páginas, puede obtener datos de una API REST e inyectarlos en el template
de su componente. Todos los datos y el HTML dentro del template
son representados por el servidor Nuxt, que envía un .html
archivo generado al cliente. Dado que lo .html
proporciona el servidor, los rastreadores web pueden analizar todo el HTML importante en cualquier ruta.
En este tutorial, configurará una aplicación web de muestra con información sobre aeropuertos. La aplicación mostrará una página Acerca de y una página generada dinámicamente para cada aeropuerto del conjunto de datos. Luego, utilizará Nuxt.js para generar rutas de páginas, crear componentes de diseño y configurar metadatos específicos de la página.
Prerrequisitos
- La versión 16.14.0 o posterior de Node.js está instalada en tu computadora. Para instalarlo en macOS o Ubuntu 20.04, sigue los pasos que se indican en Cómo instalar Node.js y crear un entorno de desarrollo local en macOS o en la sección Instalación mediante un PPA de Cómo instalar Node.js en Ubuntu 20.04 .
- También necesitarás conocimientos básicos de JavaScript, HTML y CSS, que puedes encontrar en nuestras series Cómo crear un sitio web con HTML , Cómo crear un sitio web con CSS y en Cómo codificar en JavaScript .
Paso 1: Instalación de Nuxt en la aplicación de ejemplo
En este paso, creará un proyecto Nuxt mediante un comando en la terminal de su computadora. Este npx
comando ejecutará un script externo que generará su nuevo proyecto Vue.js según la información que proporcione en las indicaciones. Esto es similar al vue create
comando que se usa para generar un nuevo proyecto Vue con la CLI de Vue. Luego, configurará su aplicación de ejemplo, que usará para probar las características de Nuxt más adelante en el tutorial.
En su terminal, ejecute el siguiente npx
comando. Este comando generará un proyecto en el directorio en el que está trabajando actualmente:
- npx create-nuxt-app favorite-airports
Si es la primera vez que ejecuta create-nuxt-app
, aparecerá un mensaje con una lista de los paquetes necesarios para instalar primero. Escriba y
y presione ENTER
para continuar:
OutputNeed to install the following packages: create-nuxt-appOk to proceed? (y) y
Una vez instalados los paquetes necesarios, aparecerá el primer mensaje:
Outputcreate-nuxt-app v4.0.0✨ Generating Nuxt.js project in favorite-airports? Project name: (favorite-airports)
Escriba el nombre que prefiera para su aplicación o presione ENTER
para seleccionar el nombre predeterminado. Continúe trabajando con las indicaciones individualmente, seleccionando las opciones resaltadas en el siguiente bloque:
Output✨ Generating Nuxt.js project in favorite-airports? Project name: favorite-airports? Programming language: JavaScript? Package manager: Npm? UI framework: None? Nuxt.js modules: Axios - Promise based HTTP client? Linting tools: None? Testing framework: None? Rendering mode: Universal (SSR / SSG)? Deployment target: Server (Node.js hosting)? Development tools: None? What is your Github username?? Version control system: Git
Cuando esto esté completo, cambie el directorio favorite-airports
e inicie el servidor de desarrollo local:
- cd favorite-airports
- npm run dev
Esto iniciará un servidor local que puedes visitar en la dirección proporcionada. En tu navegador, ve a http://localhost:3000/
. Verás lo siguiente:
Ahora que su proyecto está en ejecución, puede configurar la aplicación de ejemplo agregando una matriz de objetos que usará como datos en este tutorial.
Abra su terminal y ejecute el siguiente comando en el directorio raíz del proyecto ( favorite-airports
):
- mkdir data
Esto creará el data
directorio. En el editor de texto que prefiera, cree y abra un archivo con el nombre airports.js
del data
directorio y agregue lo siguiente:
aeropuertos-favoritos/datos/aeropuertos.js
export default [ { name: 'Cincinnati/Northern Kentucky International Airport', abbreviation: 'CVG', city: 'Hebron', state: 'KY' }, { name: 'Seattle-Tacoma International Airport', abbreviation: 'SEA', city: 'Seattle', state: 'WA' }, { name: 'Minneapolis-Saint Paul International Airport', abbreviation: 'MSP', city: 'Bloomington', state: 'MN' }, { name: 'Louis Armstrong New Orleans International Airport', abbreviation: 'MSY', city: 'New Orleans', state: 'LA' }, { name: 'Chicago O'hare International Airport', abbreviation: 'ORD', city: 'Chicago', state: 'IL' }, { name: 'Miami International Airport', abbreviation: 'MIA', city: 'Miami', state: 'FL' }]
Se trata de una matriz de objetos que consta de algunos aeropuertos de Estados Unidos. Utilizarás estos datos para generar páginas dinámicas para tu aplicación.
Guarde y cierre este archivo.
A continuación, importará el marco CSS Tailwind para agregar estilos a su aplicación. Para ello, abra el archivo de configuración de Nuxt nuxt.config.js
en su editor y agregue el siguiente código resaltado:
aeropuertos-favoritos/nuxt.config.js
export default { // Global page headers: https://go.nuxtjs.dev/config-head head: { title: 'favorite-airports', htmlAttrs: { lang: 'en' }, meta: [ { charset: 'utf-8' }, { name: 'viewport', content: 'width=device-width, initial-scale=1' }, { hid: 'description', name: 'description', content: '' }, { name: 'format-detection', content: 'telephone=no' } ], link: [ { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }, { rel: 'stylesheet', type: 'text/css', href: 'https://cdn.jsdelivr.net/npm/tailwindcss@2.1.2/dist/tailwind.min.css' } ] },...}
Guarde y cierre el archivo de configuración.
Ya ha instalado Nuxt, ha generado su proyecto y lo ha configurado para probar las funciones de Nuxt. En el siguiente paso, creará distintos tipos de rutas automáticamente colocando .vue
archivos dentro del pages
directorio.
Paso 2: Generar rutas a través del pagesdirectorio
A diferencia de una aplicación tradicional de Vue.js, las rutas en Nuxt no se generan a través de un archivo de enrutador, sino que se generan desde el pages
directorio. Cada .vue
archivo de este directorio generará una ruta. En este paso, probará esta funcionalidad creando una página Acerca de y generando páginas dinámicamente para cada aeropuerto.
Eche un vistazo a su pages
directorio. Ya hay una página allí: . Esto es equivalente a tener una página index.vue
estática . Esta página contiene un solo componente que contiene el HTML que se representó en su navegador cuando ejecutó el servidor de desarrollo local. Aparece de la siguiente manera:index.html
index.vue
Tutorial /
aeropuertos-favoritos/paginas/index.vue
template Tutorial //templatescriptexport default { name: 'IndexPage'}/script
A continuación, ampliará esto creando su propia ruta estática de Nuxt. En su terminal, cree y abra un archivo llamado about.vue
en el directorio de páginas. El nombre del archivo antes de la extensión será la ruta URL, por lo que la URL en este caso sería your_site/about
. Dentro de este about.vue
archivo, agregue lo siguiente:
aeropuertos-favoritos/paginas/about.vue
template div h1This is the About Page/h1 pThis page contains the about information of this application. This is a static route created by Nuxt via the `about.vue` file in the pages directory/p /div/templatescriptexport default { name: 'AboutPage'}/script
En esta página, creaste un h1
encabezado y un p
elemento dentro de un archivo div
. Luego, agregaste estilo a cada elemento con clases Tailwind y configuraste la fuente y los márgenes. En el script
elemento, agregaste una name
propiedad para identificar esta página en tu aplicación Vue.
Guarde este archivo y navegue hasta http://localhost:3000/about
. Verá el HTML que escribió representado en el navegador:
Ahora que ha creado una ruta estática, puede pasar a crear una ruta dinámica. Esta ruta tendrá parámetros que podrá aprovechar más adelante en el .vue
archivo. La estructura de la URL será , y se reemplazará por el código del aeropuerto en el conjunto de datos./airport/:code
:code
En Vue Router , es posible que tengas un objeto como este en tu matriz de rutas:
const routes = [ { path: '/airport/:code', component: AirportDetail }]
Pero como se ilustró anteriormente, las rutas en Nuxt se generan a través del pages
directorio. Para crear una ruta dinámica, el .vue
archivo debe comenzar con un guión bajo ( _
). El nombre del archivo que sigue al guión bajo será el nombre del parámetro. Esto es comparable a :code
en /airports/:code
.
En su terminal, cree un nuevo directorio airport
llamado pages
:
- mkdir pages/airport
En el airport
directorio, crea un archivo con el nombre _code.vue
en tu editor de texto y agrega lo siguiente:
aeropuertos-favoritos/paginas/aeropuerto/_code.vue
template div h1This is the Airport Detail Page/h1 pThis page contains the specific information about an airport./p /div/templatescriptexport default { name: 'AirportDetailPage'}/script
En este archivo, vuelve a agregar un estilo h1
a p
la página, pero esta vez contiene información de marcador de posición específica de un aeropuerto. Guarde y cierre el archivo.
Abra su navegador http://localhost:3000/airport/cvg
y encontrará lo siguiente:
Una vez creada esta página, puede obtener datos en los que la airport.abbreviation
propiedad coincida con el code
parámetro de su pages
directorio. En Nuxt, hay dos métodos de ciclo de vida o ganchos adicionales que son relevantes aquí: fetch
y asyncData
. Puede utilizar el fetch
método para realizar llamadas de red antes de que se represente la página. El asyncData
método se utiliza para dar forma a los datos reactivos antes de que se represente la página.
Todos los datos reactivos que se encuentren dentro de asyncData
se fusionarán data
en esa página. Como ejemplo, tomemos el siguiente código:
export default { data() { return { lastName: 'Grohl' } }, asyncData() { const firstName = 'Dave' }}
Esto sería lo mismo que escribir lo siguiente:
export default { data() { return { firstName: 'Dave', lastName: 'Grohl' } },}
La única diferencia es que asyncData
se procesa en el servidor, mientras que data
se procesa en el cliente.
Para probarlo asyncData
, cree un filter
bucle que devuelva un objeto del airports.js
conjunto de datos:
aeropuertos-favoritos/paginas/aeropuerto/_code.vue
...scriptimport airports from '~/data/airports.js'export default { name: 'AirportDetailPage', asyncData ({ route }) { const airport = airports.filter(airport = airport.abbreviation === route.params.code.toUpperCase())[0] return { airport } }}/script
En este código, estás importando los airports.js
datos a la página y luego filtrando todos los objetos excepto donde coinciden con abbreviation
y route.params.code
. Dado que esto se hace en el asyncData
gancho, airport
ahora es una propiedad de datos que puedes usar en tu template
.
Para utilizar los datos, agregue la siguiente línea resaltada a la template
sección del mismo archivo:
aeropuertos-favoritos/paginas/aeropuerto/_code.vue
template div h1This is the Airport Detail Page/h1 pThis page contains the specific information about the strong{{ airport.abbreviation }}/strong airport./p /div/template...
Guarde este archivo para mostrar la abreviatura del aeropuerto de forma dinámica. Si abre la ventana de su navegador para http://localhost:3000/airport/cvg
ver el código del aeropuerto en la plantilla, intente visitar una ruta de aeropuerto con un código diferente como /airport/sea
para ver los datos actualizados.
Ahora que ha creado rutas estáticas y dinámicas en Nuxt, puede pasar a mostrar más propiedades de datos para estos airports.js
objetos. En la siguiente sección, los creará layouts
en Nuxt y los asignará a una página. Una vez hecho esto, aprovechará lo que ha hecho en este paso para agregar más datos útiles al diseño.
Paso 3: creación de diseños Nuxt
En Nuxt, puedes crear diseños para tus páginas para que tu aplicación sea más modular. Este es un proceso similar a la creación de componentes de diseño en una aplicación tradicional de Vue.js , excepto que en Nuxt, asignas un diseño a través de la layout
propiedad en el nivel de página. En este paso, crearás un diseño para reutilizar en cada una de tus páginas de detalles de aeropuertos generadas dinámicamente.
Para crear un diseño, primero crea un layouts
directorio en tu proyecto:
- mkdir layouts
Cree y abra un archivo con el nombre AirportDetail.vue
en este directorio. En este diseño, agregará automáticamente una barra lateral con información sobre el aeropuerto. Para ello, agregue el siguiente código al archivo:
aeropuertos-favoritos/diseños/AirportDetail.vue
template div Nuxt / /div/templatescriptimport airports from '~/data/airports.js'export default { computed: { airport() { return airports.filter(airport = airport.abbreviation === this.$route.params.code.toUpperCase())[0] } }}/script
En este código, estás importando el airports.js
archivo al diseño y agregando una computed
propiedad para obtener el objeto del aeropuerto a través del code
parámetro en el enrutador. El Nuxt /
elemento en la plantilla es donde se inyecta el contenido de la página. Esto actúa de manera similar a una ranura de Vue.
A continuación, aprovechará algunas clases de Tailwind . Agregue lo siguiente para configurar el diseño y el estilo:
aeropuertos-favoritos/diseños/AirportDetail.vue
template div class="container mx-auto grid grid-cols-9 mt-5 gap-5" aside !-- sidebar -- /aside main !-- main content -- Nuxt / /main /div/template...
En este fragmento, estás envolviendo todo en un container
archivo que también tiene 3 columnas de ancho grid
. El aside
elemento es la barra lateral y el main
elemento es tu contenido principal.
Con esta cuadrícula creada, agregue la barra lateral con algunas clases de Tailwind:
aeropuertos-favoritos/diseños/AirportDetail.vue
template div aside !-- sidebar -- div /div /aside main !-- main content -- Nuxt / /main /div/template...
Esto agregará algunos estilos, incluidos box-shadow
, border
, border-radius
, padding
ymargin-top
. Dentro de esta barra lateral, complete la siguiente información:
aeropuertos-favoritos/diseños/AirportDetail.vue
template div aside !-- sidebar -- div p{{ airport.abbreviation }}/p pAn airport located in {{ airport.city }}, {{ airport.state }}/p /div /aside main !-- main content -- Nuxt / /main /div/template...
Este código agrega algunos detalles específicos del aeropuerto a la página y centra el texto.
Antes de continuar, agrega un h1
con el airport.name
como valor. Este estará sobre el Nuxt /
elemento, ya que se mostrará en todas las páginas con este diseño:
aeropuertos-favoritos/diseños/AirportDetail.vue
template div aside.../aside main !-- main content -- h1{{ airport.name }}/h1 Nuxt / /main div/template...
Ahora tienes un diseño completo para tus AirportDetail
páginas. Guarda y cierra el archivo de diseño.
Para utilizar este diseño, deberá asignar la layout: AirportDetail
propiedad a la página en la que desea utilizarla. Abra pages/airport/_code.vue
el editor de texto y agregue las siguientes líneas resaltadas:
aeropuertos-favoritos/paginas/aeropuerto/_code.vue
...scriptimport airports from '~/data/airports.js'export default { name: 'AirportDetailPage', asyncData ({ route }) { const airport = airports.filter(airport = airport.abbreviation === route.params.code.toUpperCase())[0] return { airport } }, layout: 'AirportDetail'}/script
Una vez que hayas terminado, guarda este archivo y abre tu navegador en http://localhost:3000/airport/cvg
. Ahora encontrarás lo siguiente:
Nota: La recarga en caliente no siempre implementa este cambio automáticamente. Si el diseño no se muestra en su navegador, detenga el servidor de desarrollo con CTRL
+ C
y luego vuelva a ejecutarlo npm run dev
para reiniciarlo.
Una vez completado esto, la barra lateral aparecerá automáticamente con información cuando visites una ruta con un código de aeropuerto adecuado.
En este paso, creaste un diseño y lo asignaste a una página, lo que te permite mantener tu aplicación DRY . A continuación, usarás el context
objeto para proporcionar propiedades específicas de la página.
Paso 4: Uso del servidor contextcon propiedades específicas de la página
Dado que las aplicaciones Nuxt se procesan en el servidor, habrá ocasiones en las que no resulte obvio cómo acceder a los archivos route
, params
, e incluso a los archivos Vuexstore
de una página . Dado que no tiene acceso a toda la instancia de Vue a través this
del lado del servidor, Nuxt proporciona un context
objeto que puede usar para estas diversas propiedades en los ganchos fetch
y asyncData
. En este paso, usará context
para agregar una descripción de página dinámica a sus páginas de aeropuerto.
En una sección anterior de este tutorial, ya usaste el context
objeto en el _code.vue
archivo:
aeropuertos-favoritos/paginas/aeropuerto/_code.vue
script export default { asyncData ({ route }) { const airport = airports.filter(airport = airport.abbreviation === route.params.code.toUpperCase())[0] return { airport } }, layout: 'AirportDetail' }/script
Aquí deconstruiste la route
propiedad del context
objeto porque era la única propiedad que necesitabas. Pero también podrías darle un nombre estándar, como context
o ctx
:
aeropuertos-favoritos/paginas/aeropuerto/_code.vue
script export default { asyncData (context) { const airport = airports.filter(airport = airport.abbreviation === context.route.params.code.toUpperCase())[0] return { airport } }, layout: 'AirportDetail' }/script
Además del context
objeto, el fetch
método y el asyncData
método, las páginas también tienen propiedades adicionales a las que solo se puede acceder en el nivel de página, en particular la head
propiedad . Con esta propiedad, puede inyectar meta
información en head
el DOM (modelo de objetos del documento) cuando se renderiza la página. La información de esta propiedad será legible por el servidor web.
Para configurar el description
de su página, abra el _code.vue
archivo en su editor de texto:
aeropuertos-favoritos/paginas/aeropuerto/_code.vue
script export default { ..., head() { return { title: 'Airport Information | Aiport App', meta: [ { hid: 'description', name: 'description', content: 'Detailed information about the specific airport.' } ] } } }/script
En este código, head
hay una función que devuelve un objeto. title
A este objeto se le agregó una propiedad y una meta
propiedad con una matriz de objetos que definen la description
propiedad. Esto equivale a escribir lo siguiente en una .html
página estática:
head titleAirport Information | Aiport App/title meta hid="description" name="description" content="Detailed information about the specific airport."/head
Guarde el _code.vue
archivo y ábralo en su navegador. El DOM generado tendrá ahora la información que agregó:
También puedes hacer que el title
y description
sea dinámico mediante la interpolación de cadenas para inyectar la información actual del aeropuerto en el head
elemento:
script export default { head () { return { title: `${this.airport.name} Information | Aiport App`, meta: [ { hid: 'description', name: 'description', content: `Detailed information about the ${this.airport.name} (${this.airport.abbreviation}) airport.` } ] } } }/script
Ahora, cuando guarde y actualice la ventana de su navegador, encontrará información específica del aeropuerto inyectada en el archivo head
, que será útil para la optimización del motor de búsqueda (SEO) de su aplicación.
Conclusión
Como se demuestra en este tutorial, Nuxt le proporciona las herramientas para representar dinámicamente una página en el lado del servidor, configurar su SEO con la head
propiedad y modularizar su código con la layout
propiedad. También le permite definir qué datos se representan en el servidor con asyncData
y fetch
, o en el cliente con data
.
Para obtener más información sobre la funcionalidad de Nuxt, visite la documentación oficial de Nuxt . Para obtener más tutoriales sobre Vue, consulte la página de la serie Cómo desarrollar sitios web con Vue.js.
Deja una respuesta