Migrando desde NuxtJS
Aquí hay algunos conceptos clave y estragias de migración para ayudarte a comenzar. ¡Usa el resto de nuestra documentación y nuestra comunidad de Discord para continuar!
Esta guía se refiere a Nuxt 2, no a la nueva versión Nuxt 3. Si bien algunos de los conceptos son similares, Nuxt 3 es una versión más nueva del framework y puede requerir estrategias diferentes para partes de tu migración.
Principales similitudes entre Nuxt y Astro
Sección titulada Principales similitudes entre Nuxt y AstroNuxt y Astro comparten algunas similitudes que te ayudarán a migrar tu proyecto:
- Los proyectos de Astro también pueden ser SSG o SSR con prerenderizado a nivel de página.
- Astro usa un enrutamiento basado en archivos y permite que las páginas con nombres creen rutas dinámicas
- Astro es basado en componentes y la estructura de tu marcado será similar antes y después de tu migración.
- Astro tiene una integración oficial para usar componentes de Vue.
- Astro tiene soporte para instalar paquetes de NPM, incluyendo librerías de Vue. Puedes mantener algunos o todos tus componentes y dependencias de Vue existentes.
Principales diferencias entre Nuxt y Astro
Sección titulada Principales diferencias entre Nuxt y AstroCuando reconstruyas tu sitio Nuxt en Astro, notarás algunas diferencias importantes:
-
Nuxt es una SPA basada en Vue (aplicación de una sola página). Los sitios de Astro son aplicaciones multipágina construidas usando componentes
.astro
, pero también pueden admitir React, Preact, Vue.js, Svelte, SolidJS, AlpineJS, Lit y plantillas HTML sin procesar. -
Enrutamiento de Página: Nuxt usa
vue-router
para el enrutamiento SPA, yvue-meta
para administrar<head>
. En Astro, crearás rutas de página HTML separadas y controlarás tu<head>
directamente o en un componente plantilla. -
Orientado al contenido: Astro fue diseñado para mostrar tu contenido y permitirte optar por la interactividad solo cuando sea necesario. Una aplicación Nuxt existente puede estar construida para una alta interactividad del lado del cliente. Astro tiene capacidades incorporadas para trabajar con tu contenido, como la generación de páginas, pero puede requerir técnicas avanzadas de Astro para incluir elementos que son más difíciles de replicar usando componentes
.astro
, como los paneles de control.
Migrar tu proyecto de NuxtJS
Sección titulada Migrar tu proyecto de NuxtJSCada migración de proyecto se verá diferente, pero hay algunas acciones comunes que realizarás al convertir de Nuxt a Astro.
Crea un nuevo proyecto Astro
Sección titulada Crea un nuevo proyecto AstroUtiliza el comando create astro
en tu gestor de paquetes para lanzar el asistente de linea de comandos de Astro o elige un tema de la comunidad del catálogo de temas de Astro.
Puedes pasar un argumento --template
al comando create astro
para iniciar un nuevo proyecto Astro con uno de nuestros ejemplos oficiales (por ejemplo, docs
, blog
, portfolio
). O, puedes iniciar un nuevo proyecto desde cualquier repositorio Astro existente en GitHub.
# lanzar el Asistente de línea de comandos de Astronpm create astro@latest
# crear un nuevo proyecto con un ejemplo oficialnpm create astro@latest -- --template <example-name>
# lanzar el Asistente de línea de comandos de Astropnpm create astro@latest
# crear un nuevo proyecto con un ejemplo oficialpnpm create astro@latest --template <example-name>
# lanzar el Asistente de línea de comandos de Astroyarn create astro@latest
# crear un nuevo proyecto con un ejemplo oficialyarn create astro@latest --template <example-name>
Luego, copia tus archivos de proyecto Nuxt existentes a tu nuevo proyecto Astro en una carpeta separada fuera de src
.
Visita https://astro.new para ver la lista completa de plantillas de inicio oficiales y enlaces para abrir un nuevo proyecto en StackBlitz, CodeSandbox o Gitpod.
Instalar integraciones (opcional)
Sección titulada Instalar integraciones (opcional)Puede resultarte útil instalar algunas de las integraciones opcionales de Astro para usar mientras estes migrando tu proyecto de Nuxt a Astro:
-
@astrojs/vue: para reutilizar algunos componentes de interfaz de usuario Vue existentes en tu nuevo sitio Astro, o seguir escribiendo con componentes Vue.
-
@astrojs/mdx: para traer archivos MDX existentes de tu proyecto Nuxt, o para usar MDX en tu nuevo sitio Astro.
Coloca tu código fuente en src
Sección titulada Coloca tu código fuente en src-
Mueve el contenido de la carpeta
static/
de Nuxt apublic/
.Astro usa el directorio
public/
para los activos estáticos, similar a la carpetastatic/
de Nuxt. -
Copia o mueve los otros archivos y carpetas de Nuxt (por ejemplo,
pages
,layouts
, etc.) a la carpetasrc/
de Astro.Como Nuxt, la carpeta
src/pages/
de Astro es una carpeta especial utilizada para el enrutamiento basado en archivos. Todas las demás carpetas son opcionales, y puedes organizar el contenido de tu carpetasrc/
de la forma que desees. Otras carpetas comunes en los proyectos Astro incluyensrc/layouts/
,src/components
,src/styles
,src/scripts
.
Convertir páginas Vue SFC a archivos .astro
Sección titulada Convertir páginas Vue SFC a archivos .astroAqui hay algunos consejos para convertir un componente .vue
de Nuxt en un componente .astro
:
-
Usa la etiqueta
<template>
de la función de componente NuxtJS existente como base para tu plantilla HTML. -
Cambia cualquier sintaxis de Nuxt o Vue a Astro o a los estándares web de HTML. Esto incluye
<NuxtLink>
,:class
,{{variable}}
, yv-if
, por ejemplo. -
Mueve la etiqueta
<script>
de JavaScript, a un “valla de código” (---
). Convierte las propiedades de recuperación de datos de tu componente a JavaScript del lado del servidor - ver la obtención de datos de Nuxt en Astro. -
Utiliza
Astro.props
para acceder a cualquier prop adicional que se pasaba anteriormente a tu componente Vue. -
Decide si algún componente importado también necesita ser convertido a Astro. Con la integración oficial instalada, puedes usar componentes Vue existentes en tu archivo Astro. Pero, es posible que desees convertirlos a Astro, ¡especialmente si no necesitan ser interactivos!
Mira un ejemplo de una aplicación Nuxt convertida paso a paso.
Comparar: Vue vs Astro
Sección titulada Comparar: Vue vs AstroCompara el siguiente componente de Nuxt con un componente de Astro:
<template> <div> <p v-if="message === 'Not found'"> The repository you're looking up doesn't exist </p> <div v-else> <Header/> <p class="banner">Astro has {{stars}} 🧑🚀</p> <Footer /> </div> </div></template>
<script>import Vue from 'vue'
export default Vue.extend({ name: 'IndexPage', async asyncData() { const res = await fetch('https://api.github.com/repos/withastro/astro') const json = await res.json(); return { message: json.message, stars: json.stargazers_count || 0, }; }});</script>
<style scoped>.banner { background-color: #f4f4f4; padding: 1em 1.5em; text-align: center; margin-bottom: 1em;}<style>
---import Header from "./header";import Footer from './footer';import "./layout.css";
const res = await fetch('https://api.github.com/repos/withastro/astro')const json = await res.json()const message = json.message;const stars = json.stargazers_count || 0;---
{message === "Not Found" ? <p>The repository you're looking up doesn't exist</p> : <> <Header /> <p class="banner">Astro has {stars} 🧑🚀</p> <Footer /> </>}
<style> .banner { background-color: #f4f4f4; padding: 1em 1.5em; text-align: center; margin-bottom: 1em; }<style>
Migrando Archivos de Diseño
Sección titulada Migrando Archivos de DiseñoPuede resultarte útil comenzar convirtiendo tus diseños y plantillas de Nuxt en componentes de diseño de Astro.
Cada página de Astro requiere explícitamente que las etiquetas <html>
, <head>
y <body>
estén presentes. Tu layout.vue
y plantillas de Nuxt no incluirán estas.
Ten en cuenta la plantilla HTML estándar y el acceso directo a <head>
:
<html lang="en"> <head> <meta charset="utf-8" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <meta name="viewport" content="width=device-width" /> <title>Astro</title> </head> <body> <!-- Envuelve el elemento slot con el diseño existente de plantilla --> <slot /> </body></html>