Logré crear una función que genera un archivo de texto que el usuario puede descargar.
Funciona perfectamente cuando ejecuto la compilación de desarrollo de Gatsby, pero cuando compilo para producción aparece el error: WebpackError: ReferenceError: Blob no está definido
Si luego trato de agregar import {Blob} desde "buffer" , obtengo en su lugar: WebpackError: ReferenceError: la ventana no está definida y tampoco funciona con el desarrollo de Gatsby.
Por lo que logré descubrir es que ni siquiera se supone que debo usar Blob con Node en absoluto, y en su lugar uso Buffer, pero estoy completamente perdido con eso porque no parece reemplazar a Blob directamente. Además, ¿por qué funciona en mi compilación de desarrollo pero no en producción? ¿Siente que debería estar cerca de una solución?
Aquí está mi función:
export function Download() { const data = new Blob(["Hello world"], { type: "text/plain;charset=utf-8", }); const downloadLink = window.URL.createObjectURL(data); return downloadLink; } export default Download;Por lo que he logrado averiguar es que ni siquiera debo usar Blob con Node en absoluto
Eso es parcialmente cierto. Tiene razón cuando dice que Blob no usa Node en absoluto, sin embargo, cuando ejecuta gatsby build , su código se analiza y se empaqueta en un servidor de Node, por eso rompe el código. En otras palabras, su código es interpretado por el servidor Node, donde no hay una window u otros objetos globales (como un document ) porque aún no están definidos. Por otro lado, cuando ejecutas gatsby develop , tu código es interpretado por el navegador, donde está la window y existen otros objetos globales.
Puede omitir esto fácilmente agregando la siguiente condición:
if(typeof window !== "undefined")Esto verificará si está en el servidor o en el cliente.
Intenta usar:
export function Download() { if(typeof window !== "undefined"){ const data = new Blob(["Hello world"], { type: "text/plain;charset=utf-8", }); const downloadLink = window.URL.createObjectURL(data); return downloadLink; } } export default Download;