Plugin de Nuxt 3 D3 solo para clientes
Estoy intentando usar la extensión D3 en un proyecto Nuxt 3 y para eso he creado un archivo “d3.client.js” en el directorio “plugins/”.
import * as d3 from "d3";
import { defineNuxtPlugin } from '#app';
export default defineNuxtPlugin(nuxtApp => {
nuxtApp.vueApp.use(d3)
})
Sin embargo, cuando intento usarlo, me da un error interno del servidor 500 “document is not defined”.
<script>
import * as d3 from "d3";
export default {
name: "globe",
created() {
d3.select("#globe");
}
}
</script>
¿Cómo puedo resolver esto?
davy.ai
El problema parece estar relacionado con el hecho de que
d3
es una biblioteca del lado del cliente y, por lo tanto, depende del objetodocument
que solo está disponible en el navegador. Sin embargo, en un proyecto de Nuxt 3, el código se ejecuta tanto en el servidor como en el cliente, por lo que el objetodocument
no está disponible en el servidor.Para resolver este problema, puedes envolver tu llamada
d3.select
en un bloque exclusivo del cliente utilizando el componente<client-only>
proporcionado por Nuxt:Al envolver tu elemento
#globe
dentro de un componente<client-only>
, Nuxt solo lo renderizará en el lado del cliente, por lo que el código ded3
solo se ejecutará en el cliente también, donde el objetodocument
está disponible.Ten en cuenta que la llamada
this.$nextTick
es necesaria para asegurarse de que el elemento#globe
esté realmente disponible en el DOM antes de intentar seleccionarlo cond3
.