Skip to content

Nuxt3

Este es un resumen de la documentación oficial de Nuxt3. Aquí encontrarás los conceptos clave que necesitas saber para empezar a trabajar con Nuxt3.

Nuxt3 importa automáticamente todo lo que esté dentro de la carpeta components, composables y utils en el directorio raíz de tu proyecto.

Los componentes de Vue se pueden escribir en un solo archivo .vue que contenga el HTML, CSS y JavaScript del componente.

<script setup>
const title = "Hello, World!";
</script>
<template>
<div>
<h1>{{ title }}</h1>
</div>
</template>
<style scoped>
h1 {
color: red;
}
</style>

Los módulos de Nuxt son una forma de extender la funcionalidad de Nuxt. Pueden ser módulos de terceros o módulos personalizados.

Por defecto Nuxt no comprueba los types por razones de rendimiento. Para ello necesitamos instalar vue-tsc y typescript

Terminal window
npm install --save-dev vue-tsc typescript

Para lanzarlo, usar el comando. Este comando está automatizado y controlado por husky al hacer un commit. Pero puedes lanzarlo en cualquier momento desde tu terminal, para comprobar los types.

Terminal window
npx nuxi typecheck

Nuxt usa la carpeta .nuxt en desarrollo para almacenar los archivos generados.

Nuxt usa la carpeta .output cuando se hace un build, para almacenar los archivos generados para producción.

La carpeta assets contiene archivos que se compilarán y se incluirán en el bundle de la aplicación.

  • Imágenes que no se servirán desde el directorio public
  • Fuentes
  • Hojas de estilos (CSS, SCSS, etc.)

Los componentes se pueden importar directamente en cualquier archivo .vue sin necesidad de importarlos manualmente.

Bajo este ejemplo:

  • Directorycomponents
    • Directoryui
      • AppFooter.vue

Si queremos autoimportar tendremos que hacer lo siguiente:

<template>
<UiAppFooter />
</template>

Solamente hay que seguir la ruta del componente, en este caso UiAppFooter. (nunca hay que poner la extensión del archivo)

Los componibles se pueden importar directamente en cualquier archivo .vue sin necesidad de importarlos manualmente.

Puedes usar la auto importación en archivos .vue, .js y .ts.

<script setup>
const foo = useFoo();
</script>
<template>
<div>
{{ foo }}
</div>
</template>

Si se necesitas tener una estructura de subdirectorios dentro de composables, se puede hacer uso de un archivo index.js que exporte todos los composables. composables/index.js;

Los layouts son plantillas que se pueden utilizar en las páginas de tu aplicación.

Los layouts se activan añadiendo <NuxtLayout> en tu app.vue

<template>
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</template>

Para usar un layout:

<NuxtLayout :name="'base-card'" v-bind="packLayout" image-height="22.5">
<section class="container"></section>
</NuxtLayout>

Se recomienda seguir el siguiente estandard para los nombres de los layouts:

~/layouts/desktop/DesktopDefault.vue —> desktop-default

~/layouts/desktop-base/DesktopBase.vue —> desktop-base

~/layouts/desktop/Desktop.vue —> desktop

Los middlewares son funciones que se ejecutan antes de cargar una página o un grupo de páginas.

De forma predeterminada, el middleware global se ejecuta alfabéticamente según el nombre del archivo.

Sin embargo, puede haber ocasiones en las que desee definir un orden específico. Por ejemplo, en el último escenario, setup.global.ts es posible que deba ejecutarse antes de analytics.global.ts. En ese caso, recomendamos anteponer al middleware global una numeración “alfabética”.

  • Directorymiddleware
    • 01.setup.global.ts
    • 02.analytics.global.ts
    • auth.ts

Los módulos de Nuxt son una forma de extender la funcionalidad de Nuxt. Pueden ser módulos de terceros o módulos personalizados.

Las páginas son componentes Vue que se utilizan para definir las rutas de la aplicación.

Nuxt permite tener rutas dinámicas, por ejemplo:

  • Directorypages
    • index.vue
    • Directoryusers-[group]
      • [id].vue

Según el ejemplo anterior, puedes acceder a la página users-[group]/[id].vue con el objeto $route

<template>
<p>{{ $route.params.group }} - {{ $route.params.id }}</p>
</template>

Si quieres acceder a la ruta usando el Composition API, puedes hacerlo de la siguiente manera:

<script setup lang="ts">
const route = useRoute();
if (route.params.group === "admins" && !route.params.id) {
console.log("Warning! Make sure user is authenticated!");
}
</script>

Los plugins de Nuxt son archivos JavaScript que se ejecutan en la creación de la aplicación.

Nuxt carga automáticamente los archivos de la carpeta plugins y los ejecuta en el orden en que se encuentran.

Si quieres usar un plugin antes que otro, recuerda usar el prefixing with alphabetical, el ejemplo está en la sección middleware, utilizar el nombre de 01.plugin.js, 02.plugin.js, etc.

La carpeta public contiene archivos estáticos que se servirán directamente al navegador.

El propósito de la carpeta utils es almacenar funciones y utilidades que se pueden reutilizar en todo el proyecto.

export function dateFormat(date: `${string}-${string}-${string}`) {
const [year, month, day] = date.split("-");
return `${day}/${month}/${year}`;
}

Ahora se puede utilizar de forma automática en cualquier archivo .vue, .js o .ts.

<template>
<div>
{{ dateFormat("2022-12-03") }}
</div>
</template>

Este componente solo se renderiza en entornos de desarrollo. Es útil para mostrar componentes de depuración o información de desarrollo.

<template>
<div>
<Sidebar />
<DevOnly>
<!-- this component will only be rendered during development -->
<LazyDebugBar />
<!-- if you ever require to have a replacement during production -->
<!-- be sure to test these using `nuxt preview` -->
<template #fallback>
<div><!-- empty div for flex.justify-between --></div>
</template>
</DevOnly>
</div>
</template>

Este componente activa el layout por defecto.

<template>
<NuxtLayout> some page content </NuxtLayout>
</template>
  • name - Nombre del layout específico, tiene que coincidir con el nombre del archivo que hay en el directorio /layouts, el nombre del layout se escribe en kebab-case.
<template>
<NuxtLayout name="layout">
<NuxtPage />
</NuxtLayout>
</template>

NuxtLayout también acepta custom props que se pueden pasar al layout. Que son accesibles a modo de atributos.

<template>
<div>
<NuxtLayout name="custom" title="I am a custom layout">
<-- ... -->
</NuxtLayout>
</div>
</template>

En el ejemplo anterior el valor title es accesible usando useAttrs en el layout.

<script setup lang="ts">
const layoutCustomProps = useAttrs();
console.log(layoutCustomProps.title); // I am a custom layout
</script>

Para que las transiciones funcionen correctamente en los layouts, se recomienda que el NuxtLayout no sea el elemento raíz del componente.

<template>
<div>
<NuxtLayout name="custom">
<template #header> Some header template content. </template>
</NuxtLayout>
</div>
</template>

NuxtLink es un componente que se utiliza para navegar entre páginas de la aplicación.

<template>
<NuxtLink to="/about"> About page </NuxtLink>
<!-- <a href="/about">...</a> (+Vue Router & prefetching) -->
</template>

En este ejemplo se está pasando un parámetro id para vincular la ruta ~/pages/posts/[id].vue

<template>
<NuxtLink :to="{ name: 'posts-id', params: { id: 123 } }">
Post 123
</NuxtLink>
</template>

Cuando se usa <NuxtLink /> para archivos del directorio /public o una aplicación diferente en el mismo dominio, se debe usar la propiedad external.

Al usar external, fuerzas que el enlace se represente con un <a> en lugar de un <RouterLink> de Vue.

<template>
<NuxtLink to="/the-important-report.pdf" external> Download Report </NuxtLink>
<!-- <a href="/the-important-report.pdf"></a> -->
</template>

NuxtImg es un componente que se utiliza para cargar imágenes de forma optimizada.

<NuxtImg src="/nuxt-icon.png" />

NuxtPicture es un componente que se utiliza para cargar imágenes de forma optimizada con soporte para srcset.

useError es un composable que se utiliza para manejar errores en la aplicación.

const error = useError();
interface {
// HTTP response status code
statusCode: number
// HTTP response status message
statusMessage: string
// Error message
message: string
}

useFetch es un composable que se utiliza para realizar peticiones HTTP.

<script setup lang="ts">
const { data, status, error, refresh, clear } = await useFetch('/api/modules', {
pick: ['title']
})
</script>