Actualmente estoy trabajando en un problema que requiere que mi aplicación web genere un gráfico que represente aproximadamente 50k a 60k puntos de datos. Se carga bastante rápido (~ 6 segundos), pero lo que me pregunto es si es posible usar D3.js para generar el gráfico en un Trabajador web y luego pasar el SVG para que se cargue en la página.¿Utiliza Web Worker y D3.js para generar gráficos de forma asíncrona?
Respuesta
Web Los trabajadores no tienen acceso a DOM, por lo que todo lo que podrías hacer en ese lado sería construir algo que pueda usarse para crear rápidamente el DOM. Los trabajadores podrían, por ejemplo, procesar los conjuntos de datos y hacer todos los cálculos pesados, luego pasar el resultado nuevamente como un conjunto de matrices.
https://github.com/mbostock/d3/commit/43d38773623b52209d2667287a1ae626fb95b0d9
Un reciente cometen por Jason Davies. Mike Bostock dice que en el futuro el código dependiente de DOM estará separado de d3.core y de esa manera usted puede crear una compilación d3 personalizada que funcione con la API de web-workers.
Tuve el mismo problema cuando tengo un gráfico de fuerza dirigida con una gran cantidad de nodos. Se siente muy lento. Quiero mejorar el rendimiento de alguna manera. Creo que el último hilo con phantomJS en un servidor de nodos es una buena idea, pero la latencia de la red implicada en el enfoque arruinará la sensación suave dirigida a la fuerza.
Entonces, ¿dónde se encuentra el D3 eliminado sin dependencias dom? –
me las arreglé para calcular los acordes y grupos de un diseño acorde usando un trabajador web de la siguiente manera:
crear una versión personalizada de d3 que no tiene un dependecy en el objeto o documento el DOM (ver: https://github.com/mbostock/smash/wiki)
crear un archivo de trabajador web y utilizar
importScripts
para cargar la costumbre d3 construiractivar su trabajador en su código de representación. He utilizado una promesa para encapsular la comunicación con el trabajador:
calculateChords = (padding, matrix) -> deferred = $.Deferred() worker = new Worker("worker.js") worker.onmessage = (e) -> deferred.resolve(e.data.groups, e.data.chords); worker.postMessage { matrix: matrix } deferred.promise()
más tarde, en la función de representación:
calculateChords(matrix).then (groups, chords) -> ...
En realidad, puede ejecutar d3 estándar en un trabajador web si deja los objetos correctos (falsos) a su alrededor para aplacar d3 cuando se inicia. Sin embargo, el principal problema (al usar d3 con los trabajadores de la web) es la serialización de los gastos generales en los mensajes de envío y recepción. Sin embargo, estaría muy interesado en saber si alguien ha ideado un buen método para usar objetos transferibles para obviar la serialización. –
- 1. Gráficos en capas en d3.js
- 2. JavaScript: ¿Cómo descargar JS de forma asíncrona?
- 3. d3.js: cómo crear "clústeres de gráficos dirigidos por fuerza"
- 4. d3.js y document.onReady
- 5. d3.js save states
- 6. gráficos D3 Directed
- 7. Gráficos de barras y líneas de mezcla con Rickshaw (biblioteca gráfica basada en d3 para js)
- 8. Espera de forma sincrónica para el mensaje en Web-Worker
- 9. Web-Worker con GWT
- 10. escalando proyecciones d3.js
- 11. alternativas de canvas HTML5 para d3.js, biblioteca de visualización de gráficos
- 12. d3.js - transformación y transición, líneas múltiples
- 13. D3.js - cargar y manipular datos externos
- 14. cargando archivos js y otros archivos dependientes js de forma asíncrona
- 15. web worker console.log
- 16. geochart en d3.js
- 17. D3.js Transiciones
- 18. gráficos d3.js en archivos de calidad de impresión de alta resolución?
- 19. d3.js Odd Rotation Behavior
- 20. Mathematica: generación incremental asíncrona de gráficos dinámicos
- 21. Hacer que d3.js trabaje con raphael.js
- 22. d3 js nodos como imágenes
- 23. Área apilada en D3.js
- 24. Diagrama de fuerza jerárquica usando D3.js
- 25. círculos superpuestos evitar d3.js
- 26. soluciones de gráficos para Yesod
- 27. servicio web ASP.Net: código que se ejecuta de forma asíncrona
- 28. Graph orientación y el nodo de posicionamiento en d3.js
- 29. Cómo pasar funciones a JavaScript Web Worker
- 30. Zoom gráfico de barras con d3.js
Gracias. Temía que esta fuera la respuesta. – user1449496
Esta es una vieja pregunta, pero ... ¿Qué pasa con phantomJS? – meetamit
@meetamit que podría ser una opción, supongo, generar el DOM en el servidor con phantomJS y luego pasarlo al cliente? pero eso no está usando Web Workers, que era la pregunta. –