Estoy tratando de crear un sitio SSG con Nuxt.js. Cuando accedo a una ruta que no está configurada en la propiedad de generación de nuxt.config.js, quiero mostrar el contenido de una página 404 sin cambiar la URL (usando htaccess)
El siguiente es el sitio en construcción.
http://estamos-sobrios.d3v-svr.com/xxxx
Esto está funcionando como se esperaba.
http://estamos-sobrios.d3v-svr.com/user/xxxx
Esto no funciona como se esperaba.
El contenido de la página 404 se muestra por un momento, pero poco después se ejecuta el proceso basado en la ruta dinámica de "user/_id.vue".
El punto del problema es que la ruta inexistente se comporta como si existiera. ¿Alguien sabe cómo solucionar este problema?
Aquí está el código fuente. https://github.com/yhirochick/rewrite_test
404.vue
https://github.com/yhirochick/rewrite_test/blob/master/pages/404.vue
usuario/_id.vue
https://github.com/yhirochick/rewrite_test/blob/master/pages/user/_id.vue
nuxt.config.js
https://github.com/yhirochick/rewrite_test/blob/master/nuxt.config.js#L43-L45
.htaccess
https://github.com/yhirochick/rewrite_test/blob/master/static/.htaccess
Soy japonés. El texto anterior se basa en Google Translate. Puede ser difícil de entender, pero gracias.
Mi forma de manejar este tipo de problema y minimizar las llamadas a la API requeridas es seguir esos pasos:
yarn add -D axiosnuxt.config.js import axios from 'axios' export default { ... generate: { routes: async () => { const users = await axios.get('https://jsonplaceholder.typicode.com/users') return users.data.map((user) => ({ route: `/users/${user.id}`, payload: user, })) }, fallback: 'no-user.html', // this one is not needed anymore if you ditch the redirect! }, } Esto generará todas las rutas necesarias, manteniendo las llamadas al mínimo gracias a la payload que se pasará más tarde a las páginas. Se puede encontrar más información en los documentos .
/pages/users/_id.vue hace el truco <template> <div> <div v-if="user">User name: {{ user.name }}</div> <div v-else-if="error">{{ error }}</div> </div> </template> <script> export default { asyncData({ payload }) { if (payload && Object.entries(payload).length) return { user: payload } else return { error: 'This user does not exist' } // this will also catch users going to `/users/` }, } </script>no-user.vue , diseño de error.vue y debería ser gucciAl final, tenemos 10 usuarios de la API simulada. Así que esos son los siguientes casos:
/users/5 , el usuario ya está estático, por lo que tenemos su información sin ninguna llamada API adicional/users/11 , el usuario no estaba presente en el momento de la compilación, por lo que no está aquí y estamos mostrando un error/users , aún se nos enviará a la /pages/users/_id , pero dado que :id será opcional allí, generará un error y aún mostrará el error, un index.vue por supuesto puede manejar esto casoMi repositorio de github para este se puede encontrar aquí: https://github.com/kissu/so-nuxt-generate-placeholder-users
Es una forma complicada, pero he encontrado el código que funciona como quiero.
https://fes.d3v-svr.com/users/xxxxxx Es lo que espero.
Primero, simplemente configure .htaccess para reescribir la página que no existe en la página 404
ErrorDocument 404 /no-user/index.html Solo arriba, Nuxt ejecuta la base en la URL /users/xxxxxx/ y vuelve a mostrar la página como "UserXXXXXX", incluso si no existe.
Para evitar esto, users/_id.vue es como a continuación.
<template> <div v-if="ssr">User name: {{ user.name }}</div> </template> <script> export default { asyncData({ payload }) { return { user: payload, ssr:true } }, } </script>Parece ser que si una plantilla está vacía, nuxt no ejecutará el script dependiendo de la URL.
Es muy complicado, así que continuaré explicando cómo funciona.