Elección de un Asynch-Loader de JavaScript [cerrado]

9

He estado buscando varios cargadores de recursos asíncronos y aún no estoy seguro de cuál usar. Donde trabajo tenemos esfuerzos grupales dispares cuyos módulos de clase pueden usar diferentes versiones de jQuery (etc.). Como tal, las dependencias anidadas también pueden diferir. No tengo control sobre esto, por lo que esto significa que necesito cargar dinámicamente recursos que pueden usar versiones alternativas de la misma biblioteca.

Como tal, aquí están mis requisitos:

  1. Cargue archivos de recursos JavaScript y CSS de forma asincrónica.
  2. Administre el orden de dependencia y las dependencias anidadas en todas las versiones.
  3. Detecta si un recurso ya está cargado.
  4. Debe permitir la carga entre dominios (CDN)
  5. (opcional) Permítanos descargar un recurso.

He estado mirando:

Podría falsificar estos requisitos yo mismo cargando versiones en variables con espacios de nombres adecuados y usando una matriz para rastrear lo que ya está cargado ... pero (con suerte) alguien ya lo ha inventado.

Entonces mis preguntas son:

  • ¿Cuáles usas? ¿Y por qué?
  • ¿Hay otros que satisfagan completamente mis requisitos?
  • ¿Con cuál te parece más elocuente y más fácil trabajar? ¿Y por qué?

ACTUALIZACIÓN:
Para aquellos interesados, probé todas las bibliotecas AMD anteriores (y más). Al final, fui con RequireJS . En general, es más limpio y fácil ... y me alegro de estar usándolo.

Prisionero CERO
fuente
Para JavaScript, no creo que sea posible el n. ° 5. Teóricamente podría ser posible para CSS, pero no estoy seguro de si algún navegador lo admite.
Mike Baranczak
@ Mike ¡Gracias por comentar! Si el asynch-loader rastreó y pobló recursos usando variables de objeto ... es completamente posible.
Prisionero CERO
Correcto, pero el NUEVO constructor duplicará el objeto, por lo que si crea una nueva de algo que llamó, seguirá existiendo allí. ¿Por qué lo descargarías de todos modos?
Incógnito
@ user1525 ¡Gracias por comentar! La descarga de recursos ahorra en la memoria. Editaré mi pregunta anterior con algunas reflexiones sobre su comentario (en unos minutos). ¡Gracias de nuevo!
Prisionero CERO
jQuery ya tiene una getScriptfunción para la inyección de script.
zzzzBov

Respuestas:

7

He usado RequireJS en proyectos serios, y me encanta, pero en realidad no está destinado a ser un cargador asíncrono. Realmente está destinado a ser un sistema de módulos. La carga asincrónica se proporciona en servicio para ese objetivo. Se puede presionar para cumplir con cualquiera de sus requisitos, pero sus servicios de carga están diseñados para cargar módulos, no archivos arbitrarios.

Cargue archivos de recursos de JavaScript y CSS de forma asíncrona : Requirejs carga los módulos que necesite mediante la inyección de etiquetas de script, de manera asíncrona.

Administre el orden de dependencia y las dependencias anidadas en todas las versiones : aquí es donde RequireJS brilla. Los módulos pueden declarar dependencias en otros módulos, y el orden de carga se extrapolará de esa declaración de dependencia. También hay un complemento de orden, que puede forzar el orden en las dependencias.

Detecta si un recurso ya está cargado : Requirejs solo cargará un módulo una vez.

Debe permitir la carga entre dominios (CDN) : esto es posible, pero requiere cierta configuración; Puede establecer una URL específica para cualquier módulo, y eso anulará la ubicación predeterminada, por lo que puede establecerlo en un CDN.

RequireJS servirá mejor si escribe módulos usando su formato, y será menos efectivo si lo está usando para cargar JavaScript sin procesar.

También proporciona un proceso de compilación que fusionará sus módulos en un solo archivo para producción.

Sean McMillan
fuente
3

En teoría, podría simplemente mantener una lista de scripts ya cargados, y hacer una función que cargue scripts que aún no se hayan cargado.

http://jsfiddle.net/BDG/Dhdu7/2/

Incógnito
fuente
2
O use Curl / RequireJS, tienen esta y más características. Y no tiene que mantenerlo usted mismo;)
Raynos
Olvidó mencionar una estructura clara e incluye no relativos.
Incógnito
2

Si está buscando RequireJS y desea depender de los archivos CSS, puede verificar el complemento CSSP RequireJS :

CSS con relleno. Este proyecto implementa un complemento para el proyecto RequireJS que permite a los módulos enumerar archivos CSS como dependencias. Esto permite que RequireJS espere hasta que se sepa que las reglas de estilo específicas están vigentes antes de lanzar el módulo JavaScript para ser evaluado. Esto sería útil si, por ejemplo, si su módulo JavaScript requiere ciertas reglas CSS, definidas en un archivo separado, que se apliquen al DOM antes de que se pueda inicializar.

Pete O
fuente