Quiero crear un script RSS usando Next.js.
Así que puse un script en una subcarpeta dentro de la carpeta raíz scripts/ y lo build-rss.js
module.exports = { webpack: (config, options) => { config.module.rules.push({ test: /\.svg$/, issuer: { and: [/\.(js|ts|md)x?$/] }, use: [ { loader: '@svgr/webpack', options: { prettier: false, svgo: true, svgoConfig: { plugins: [{ removeViewBox: false }] }, titleProp: true, }, }, ], }) if (!options.dev && options.isServer) { const originalEntry = config.entry config.entry = async () => { const entries = { ...(await originalEntry()) } entries['./scripts/build-rss'] = './scripts/build-rss.js' return entries } } if (!options.isServer) { config.resolve.fallback.fs = false } return config }, } Cuando trato de ejecutar mi script npm run build:development que en package.json representa:
"scripts": { "clean": "rimraf .next", "dev": "next dev", "export": "next export", "start": "next start", "lint": "next lint", "build:development": "next build && npm run export && npm run rss:development", "build": "next build && npm run export && npm run rss", "rss:development": "node ./.next/server/scripts/build-rss.js", "rss": "node ./.next/serverless/scripts/build-rss.js" }Me arroja un error diciendo:
Error: No se puede encontrar el módulo '../../webpack-runtime.js'
Pero lo comprobé. El archivo existe.
El error es que esto solía funcionar antes. Probablemente hace algunas versiones cuando mi otro proyecto usaba la misma combinación.
Hice una reproducción completa mostrando el error → https://github.com/deadcoder0904/next-script-rss-error
Simplemente clónelo, instálelo y pruebe el script npm run build:development en la terminal para ver el error.
Basado en nuestra conversación:
entry: path.join(__dirname, '..', 'path/to/file')Así es como se ve una entrada de paquete web. También puede ser una matriz o un objeto:
entry: [ path.join(__dirname, '..', 'path/to/file'), // other entries here ]Mientras que ya está obteniendo toda la configuración del paquete web:
webpack: (config, options)Así que haciendo:
const originalEntry = config.entry config.entry = async () => { const entries = { ...(await originalEntry()) } entries['./scripts/build-rss'] = './scripts/build-rss.js' return entries }No tiene sentido para mí si solo puedes hacer:
config.entry.push('./scripts/build-rss') // config.entry['./scripts/build-rss'] = './scripts/build-rss.js'A menos que me pierda algo con la forma en que nextjs está cargando la configuración del paquete web.
Incluso entonces, le sugiero que use path.join para asegurarse de que se cargue en la ubicación correcta, porque esa raíz relativa se ejecutará desde donde se compile el paquete web.
Junto con eso, en su primer proyecto usó nextjs v10 y ahora está usando nextjs v11, que tiene una actualización de webpack 4 a 5, que es una actualización importante. No conozco los detalles, solo puedo especular, pero bajo ninguna condición debe asumir que "debido a que su proyecto anterior estaba funcionando, este debería usar las mismas cosas", no necesariamente (especialmente no en este caso).
Lo primero que pensé fue que el paquete web debería agrupar de forma predeterminada todo en un solo archivo de salida, a menos que nextjs haya cambiado la configuración (no lo sé). Entonces, usar un script que agregó a las entradas no tenía sentido para mí, porque no existiría. Pero está diciendo que existe, por lo que solo puedo suponer que el paquete web está configurado para dividir el código y genera cada entrada en un archivo diferente. En cuyo caso no tengo ni idea. Por lo que sé, en el paquete web 5 (no sé sobre el paquete web 4), la división de código está deshabilitada en desarrollo y habilitada en producción, por lo que es probable que su problema sea una discrepancia entre desarrollo y producción.
Quizás lo último que puede intentar es cambiar su !options.dev , porque en este momento solo está agregando ese script cuando está en producción, pero está tratando de ejecutar el script usando desarrollo.
Si realmente solo tiene que hacer que funcione, puede degradar su nextjs a la versión anterior que estaba usando (v10), aunque esa no es realmente una solución.
Aparte de eso, me quedé sin ideas.
No estoy seguro de si todavía está buscando una respuesta, pero simplemente cambiar la entrada del paquete web de la siguiente manera parece haber solucionado el problema.
entries['scripts/build-rss'] = './scripts/build-rss.js'; // instead of entries['./scripts/build-rss']¡Yo tenía el mismo error! Eliminé la carpeta .next e hice un npm run dev . ¡Comenzó a funcionar para mí!