Copiar componentes Vue.js a Nuxt con SSR
Clase 47 de 53 • Curso Profesional de Vue.js 2
Contenido del curso
CLI y Dev Tools
- 3

Instalación de Vue.js: Node, Dev Tools y CLI
06:13 min - 4

Crear una aplicación Vue con CLI y webpack
12:49 min - 5

Cómo funciona webpack.config.js
10:38 min - 6

Babel: transpilador de JavaScript moderno
05:06 min - 7

ESLint con Standard JS: linteo automático en webpack
15:34 min - 8

Configuración de Sass y Bulma en Vue
06:18 min - 9

Cómo configurar Pug en Vue con webpack
04:23 min - 10
Diseño de Mockups: Práctica y Colaboración en Comunidad
00:20 min - 11
Creación de Vistas con Mockups y Vue.js
00:32 min
Manipulación del DOM
- 12

Expresiones en Vue: sintaxis doble llave
03:49 min - 13

Diferencia entre v-show y v-if en el DOM
06:22 min - 14

Qué es data binding en Vue.js
04:11 min - 15

Computed properties en Vue.js: cómo crearlas
04:13 min - 16

Qué son los watchers de Vue
02:25 min - 17

Eventos Vue: directiva v-on y métodos format
06:12 min - 18

Cómo construir una interfaz de búsqueda completa en Vue
19:03 min - 19
Manipulación del DOM con Vue.js: Práctica y Ejercicios
03:00 min
REST y HTTP
Sistema de Componentes
- 23

Cómo crear componentes en Vue
08:46 min - 24

Componentes Layout en Vue con Bulma
09:50 min - 25

Reactividad en Vue: $set y Object.assign
06:14 min - 26

Hooks del ciclo de vida en Vue.js
05:38 min - 27

Comunicación padre-hijo con props en Vue
23:27 min - 28

Eventos en Vue: comunicar hijo a padre
12:04 min - 29

Slots: HTML dinámico en componentes Vue
13:42 min - 30

Plugin Event Bus: comunicar componentes sin relación en Vue
19:19 min
Vue Router
Extendiendo VueJS
Clases, Animaciones y Transiciones36
Vuex
- 39

Cómo Vuex centraliza estados en Vue
03:41 min - 40

Instalación de Vuex con estado único
17:32 min - 41

Cómo usar mutations y commit en Vuex
08:16 min - 42

Getters de Vuex: mapGetters y store sincronizado
07:35 min - 43

Cómo dispatch ejecuta actions asincrónicas en ViewX
07:54 min - 44

Instalación de Viewex en Platzi Music
26:37 min
Nuxt.js
Deploy a Producción con Now
Conclusiones
Bonus
La integración de Vue.js en Nuxt con server side rendering es directa: se reutilizan los mismos components, la sintaxis de ECMAScript 2015 y los estilos. Aquí verás cómo copiar cabecera y pie, configurar layouts, crear rutas automáticas en pages, consumir servicios con Trae y resolver datos asincrónicos con asyncData, además de personalizar el head.
¿Cómo integrar componentes de Vue.js en Nuxt con SSR?
Trabajar en Nuxt significa respetar su estructura: carpetas como components, layouts y pages. La estrategia es copiar piezas del proyecto tradicional y pegarlas en la estructura de Nuxt, ajustando mínimos detalles.
- Diferencia clave: components se reutilizan; pages generan rutas automáticamente.
- Crea header.vue y Footer.vue en components. Quita lógica que no uses (por ejemplo, el reproductor). Mantén el HTML simple.
- Importa los componentes en layouts/default.vue y úsalos como master page (plantilla base) para todas las vistas.
- Nuxt provee alias por carpeta; para components usa el símbolo cercano a la tecla Escape. Ejemplo con import usando alias.
- Si los estilos no se ven, elimina estilos por defecto de default.vue e index.vue y recuerda que falta Bulma.
Ejemplo de layout base:
<template>
<div>
<PMHeader />
<nuxt />
<PMFooter />
</div>
</template>
<script>
import PMHeader from '~/components/header.vue'
import PMFooter from '~/components/footer.vue'
export default {
components: { PMHeader, PMFooter }
}
</script>
¿Qué dependencias y estilos configurar?
- Instala cargadores de estilos:
npm i -D pack-loader pack sass-loader. - Atiende la advertencia de unmet peer dependency instalando
npm i -D node-sass. - Integra Bulma más adelante: con un solo import verás clases y estilos aplicados.
¿Cómo crear rutas en Nuxt con pages y parámetros dinámicos?
Nuxt genera rutas a partir de pages. Crear about.vue basta para tener /about; no configuras Vue Router manualmente. Los mismos router-link funcionan porque Nuxt usa Vue Router internamente.
- Crea pages/about.vue con estructura mínima y un título.
<template>
<section class="container">
<h1 class="title">Nosotros</h1>
</section>
</template>
- Para rutas dinámicas, usa guion bajo. Crea pages/track/_id.vue para mapear /track/:id. El guion bajo marca el parámetro dinámico.
- Reutiliza servicios JavaScript en plugins: crea plugins/config.js, plugins/platziMusic.js y plugins/track.js copiando el código original. Accede con el alias de plugins cuando importes.
- Instala Trae para HTTP:
npm i -S Trae.
Ejemplo mínimo de página con parámetro dinámico y datos remotos:
<template>
<section class="container">
<h1 class="title">{{ track.name }}</h1>
</section>
</template>
<script>
import trackService from '~/plugins/track'
export default {
asyncData({ params }) {
return trackService.getById(params.id)
.then(track => ({ track }))
},
data() {
return { track: {} }
}
}
</script>
- Error común al migrar: acceder a
this.paramsen asyncData. Debe serparamsdel argumento de la función, no del view model.
¿Cómo se comporta la navegación con SSR y el cliente?
- La primera carga se compila y sirve en el servidor.
- A partir de ahí, la navegación es del lado del cliente (client-side): en Network verás un solo document mientras cambias de ruta.
- La barra de progreso visual indica compilación y transición en el cliente.
¿Cómo cargar datos asincrónicos y actualizar el head?
Usar created en SSR no garantiza que la petición termine antes del render. Nuxt resuelve esto con asyncData, que permite devolver una Promise cuyos valores se acoplan a data y mantienen el data binding aunque el render sea en el servidor.
- Reemplaza created por asyncData({ params }).
- Devuelve un objeto que coincida con las propiedades de data.
- Mantén el servicio HTTP con Trae y la API Fetch por debajo.
Actualizar metadatos es directo con el hook head. Puedes cambiar el título para SEO y UX, por ejemplo con el nombre de la canción.
export default {
// ...asyncData y data...
head() {
return {
title: this.track.name
}
}
}
¿Qué errores comunes evitar?
- Usar
thisdentro de asyncData: recibeparamspor argumento. - Ignorar las dependencias de estilos: instala
node-sasspara quesass-loaderfuncione. - Olvidar limpiar estilos por defecto del template de Nuxt si interfieren con tu CSS.
- No importar Bulma: sin ese import no verás las clases aplicadas.
¿Te animas a completar la app? Comenta qué parte quieres profundizar: search, reproductor o configuración de estilos.