Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

395
Vistas
Next.js: reduzca la obtención de datos y comparta datos entre páginas

Estoy buscando soluciones para una mejor obtención de datos en una aplicación Next.js. En esta pregunta, no solo estoy buscando una solución, estoy buscando múltiples opciones para que podamos ver los pros y los contras.

el problema que tengo

En este momento, tengo algunas páginas que incluyen un componente que muestra contenido estático y otro que tiene contenido dinámico que se obtiene de una API. Cada página hace un fetch() en su getInitialProps() para obtener sus propios datos de página, pero también los datos del pie de página, que es el mismo para todas las páginas .

Esto, por supuesto, funciona, pero hay una gran cantidad de obtención de datos duplicados. Los datos del pie de página siempre se mostrarán para todas las páginas y siempre serán los mismos. Rara vez se cambiará en la API, por lo que no es necesario volver a validar los datos.

Las respuestas que estoy buscando

No solo busco resolver este problema, también busco una descripción general para aprender algunas prácticas nuevas para proyectos futuros. Me gusta escribir código "obvio", por lo que no busco soluciones demasiado complicadas, como escribir en el objeto de la window etc. Se prefieren las soluciones simples con menos dependencias. El objetivo es un sitio rápido. No es tan importante reducir el uso de la red/llamadas API.

Lo que he pensado hasta ahora

Estas son las posibles soluciones que se me ocurrieron, algo ordenadas de simples/obvias a más complejas.

  1. Haga una búsqueda dentro del componente Pie de página (lado del cliente)
  2. Realice una búsqueda en getInitialProps (lado del servidor y lado del cliente) en todas las páginas
  3. Realice una búsqueda en _app.js con un HOC y conéctese a getInitialProps() y agréguelo a los accesorios, de modo que los datos estén disponibles para todas las páginas.
  4. Use zeit/swr y búsqueda previa de datos para almacenar datos en caché
  5. Usa redux para almacenar un estado global

Todos estos "funcionan", pero la mayoría recuperará los datos innecesariamente y/o agregará un poco más de complejidad. Aquí están los pros/contras tal como lo veo (los números son los mismos que los anteriores):

  1. 👍 ¡Sencillo! El código de recuperación está solo en un lugar, está ubicado donde se usa. 👎 Los datos se obtienen después de cargar la página, por lo que el contenido "salta" para verlo. Los datos se recuperan todo el tiempo.
  2. 👍 ¡Sencillo! Los datos se obtienen en el servidor, por lo que el contenido está disponible antes de que se represente la página. 👎 Los datos se recuperan para cada página. Tenemos que recordar buscar los mismos datos de pie de página para cada página en su getInitialProps() .
  3. 👍 Podemos buscar en un solo lugar y agregarlo a todos los accesorios de las páginas, de modo que los datos del pie de página estén disponibles automáticamente para todos los accesorios de las páginas. 👎 Puede ser un poco más complejo para algunos entender fácilmente lo que está pasando, ya que requiere un poco más de comprensión de cómo funciona Next.js/React. Todavía recupera los datos de todas las páginas. Ahora hacemos dos llamadas fetch() una después de la otra (primero en _app.js para cargar el contenido del pie de página, luego en cada página para obtener contenido personalizado), por lo que es aún más lento.
  4. 👍 Algo simple. Podemos usar la captación previa para cargar datos en caché incluso antes de que se cargue el JS. Después de cargar la primera página, obtendremos una recuperación rápida de datos. Puede tener código de búsqueda directamente en el componente de pie de página. 👎 La técnica de búsqueda previa rel="preload" no funcionará con todos los tipos de búsqueda (por ejemplo, el cliente de Sanity que usa groq). Para no tener contenido "brillante" donde los datos se cargan después de la carga de la página inicial, debemos proporcionar useSWR() con initialData que aún requerirá que obtengamos datos en getInitialProps() , pero sería suficiente para hacer esto en el servidor lado. Podría usar el nuevo getServerSideProps() .
  5. 👍 Podemos cargar datos una vez (?) y tenerlos disponibles en toda la aplicación. Rápido y menos/sin recuperación. 👎 Agrega dependencia externa. Más complejo, ya que tendrá que aprender redux, incluso para cargar solo un objeto de datos compartidos.

Solución actual, utilizando la solución descrita en el punto número 2.

 const HomePage = (props) => { return ( <Layout data={props.footer}> <Home data={props.page} /> </Layout> ) } // Not actual query, just sample const query = `{ "page": *[_type == "page"][0], "footer": *[_type == "footer"][0] }` HomePage.getInitialProps = async () => { const data = await client.fetch(query) return { page: data.page footer: data.footer } } export default HomePage

Me encantaría tener más información sobre esto. Me estoy perdiendo algo obvio?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

¡O bien! Encontré este hilo mientras buscaba otra cosa. Pero como tuve que trabajar en problemas similares, puedo darle algunas instrucciones y haré todo lo posible para que quede claro para usted.

Entonces, hay algunos datos que desea compartir en su aplicación (páginas/componentes).

  1. Next.js usa el componente de la aplicación para inicializar las páginas. Puede anularlo y controlar la inicialización de la página. para lograrlo, simplemente cree el archivo _app.js en la raíz del directorio de pages . Para obtener más información, siga este enlace: https://nextjs.org/docs/advanced-features/custom-app
  2. Al igual que puede usar getInitialProps en sus páginas para obtener datos de su API, también puede usar el mismo método en _app.js . Por lo tanto, buscaría los datos que necesito para compartirlos en mi aplicación y eliminaría mis llamadas a la API.

Bueno, ahora puedo pensar en dos formas de compartir los datos en mi aplicación

  1. Uso de ganchos createContext .

1.1. Cree un DataContext usando ganchos createContext. y envuelva <Component {...pageProps} /> con su <DataContext.Provider> . Aquí hay un fragmento de código para darle una mejor pista:

 <DataContext.Provider value={{ userData, footerData, etc... }}> <Component {...pageProps} /> </DataContext.Provider>

1.2. Ahora, en otras páginas/componentes, puede acceder a su DataContext de la siguiente manera:

 const { footerData } = useContext(DataContext);

Y luego puedes hacer la manipulación en tu front-end

  1. rellena props usando getInitialProps

2.1. getInitialProps se usa para obtener de forma asíncrona algunos datos, que luego se completan con props . ese sería el mismo caso en _app.js .

El código en tu _app.js sería algo como esto:

 function MyApp({ Component, pageProps, footerData }) { //do other stuffs return ( <Component {...pageProps} footerData={footerData} /> ; } MyApp.getInitialProps = async ({ Component, ctx }) => { const footerRes = await fetch('http://API_URL'); const footerData = await footerRes.json(); let pageProps = {}; if (Component.getInitialProps) { pageProps = await Component.getInitialProps(ctx); } return { pageProps, footerData }; };

2.2. Ahora en sus páginas (no en sus componentes) puede acceder a accesorios, incluidos los que ha compartido desde _app.js , y puede comenzar a manipularlos.

Espero poder darte una pista y dirección. Diviértete explorando.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda