Ir al contenido

Nuxt 3

Nuxt 3 renderiza las páginas en el servidor por defecto. Los scripts CDN y los elementos personalizados deben cargarse solo del lado del cliente. Un plugin cliente de Nuxt es el lugar más limpio para hacer esto.

Ventana de terminal
npm install @wink/elements

El sufijo .client.ts indica a Nuxt que ejecute este plugin solo en el navegador:

plugins/wink.client.ts
import { load } from '@wink/elements';
export default defineNuxtPlugin(() => {
load({ clientId: useRuntimeConfig().public.winkClientId });
});

Configurar la variable en tiempo de ejecución

Sección titulada «Configurar la variable en tiempo de ejecución»
nuxt.config.ts
export default defineNuxtConfig({
runtimeConfig: {
public: {
winkClientId: process.env.NUXT_PUBLIC_WINK_CLIENT_ID,
},
},
});

Agrega a .env:

NUXT_PUBLIC_WINK_CLIENT_ID=tu-client-id

Configurar Vue para elementos personalizados

Sección titulada «Configurar Vue para elementos personalizados»

Agrega la opción isCustomElement al compilador para que Vue no muestre advertencias sobre etiquetas desconocidas <wink-*>:

nuxt.config.ts
export default defineNuxtConfig({
vue: {
compilerOptions: {
isCustomElement: (tag) => tag.startsWith('wink-'),
},
},
runtimeConfig: {
public: {
winkClientId: process.env.NUXT_PUBLIC_WINK_CLIENT_ID,
},
},
});

Envuelve los componentes Wink en <ClientOnly> para evitar desajustes de hidratación SSR:

<template>
<main>
<ClientOnly>
<wink-content-loader layout="HOTEL" :id="layoutId" />
</ClientOnly>
</main>
</template>
<script setup lang="ts">
const layoutId = 'YOUR_LAYOUT_ID';
</script>

Extiende el HTMLElementTagNameMap global (igual que en Vue 3) para obtener autocompletado de atributos. Consulta la página de integración con Vue 3 para el archivo de declaración completo.