Estoy tratando de cargar CCapture en Node.js en lugar de tener que ejecutar un navegador sin interfaz gráfica de usuario para grabar el flujo de lienzo. Sigo recibiendo window.CCapture no es un error del constructor.
Enlace de la biblioteca de CCapture: https://github.com/spite/ccapture.js
Aquí está mi código
const jsdom = require("jsdom"); const { JSDOM } = jsdom; const { window } = new JSDOM(`<!DOCTYPE html><body> <script src='./node_modules/ccapture.js/build/CCapture.all.min.js'></script> <canvas id="canvas" width="200" height="100"></canvas> </body>`, // We need these options to allow JSDOM to require CCapture from node_modules { runScripts: "dangerously", resources: "usable" }); const document = window.document; window.onload = () => { console.log("Onload >>>>>>"); const canvas = document.getElementById("canvas"); //const canvas = createCanvas(200, 200) const ctx = canvas.getContext("2d"); var colors = ["red", "blue", "yellow", "orange", "black", "white", "green"]; function draw (){ ctx.fillStyle = colors[Math.floor(Math.random() * colors.length)]; ctx.fillRect(0, 0, canvas.width, canvas.height); } draw(); var capturer = new window.CCapture( { format: 'ffmpegserver', framerate: 60, verbose: true, name: "foobar", // videos will be named foobar-#.mp4, untitled if not set. extension: ".mp4", // extension for file. default = ".mp4" codec: "mpeg4", // this is an valid ffmpeg codec "mpeg4", "libx264", "flv1", etc... // if not set ffmpeg guesses based on extension. } ); console.log("Capture>>>>>", capturer); };window.CCapture devuelve undefined, lo que significa que el script no se cargó correctamente.
Eso es porque no puede importar scripts locales de esa manera en JSDOM. Una forma de resolverlo es simplemente cargar el script a través de un CDN dentro del argumento del constructor JSDOM en lugar de vincularlo a un archivo local.
jsdom no puede resolver las rutas locales ... use cdn o cargue el script en línea leyendo el contenido del archivo y luego agregándolo al dom a través de document.createElement
Muestra:
const jsdom = require("jsdom"); const { JSDOM } = jsdom; const fs = require("fs"); const script = fs.readFileSync("./node_modules/ccapture.js/build/CCapture.all.min.js", { encoding: "utf8", flag: "r", }); const { window } = new JSDOM( `<!DOCTYPE html> <body> </body>`, { runScripts: "dangerously", resources: "usable", } ); var document = window.document; var scriptEl = document.createElement("script"); scriptEl.textContent = script; document.head.appendChild(scriptEl); window.onload = () => { console.log(window.CCapture); };