Esto es definitivamente un error que he encontrado mucho en los últimos días. Cargar un módulo puede causar que un segundo módulo completamente no relacionado en una parte diferente de la aplicación quede indefinido donde funcionó perfectamente antes. He usado mucho RequireJS - esto no es un problema de carga circular o de dependencia circular. Al principio me encontré con el error más a menudo cuando se requiere un archivo de texto en una vista de segundo piso que obtiene itera unas cuantas veces (1800+):
domReady -calls-> new View1() -iterates-> new SubView() -depends-> text!template
-calls-> new View2() --> undefined!
Esto causaría un módulo totalmente sin relación a otra parte para convertirse en indefinido. Estuve trabajando durante un tiempo integrando la funcionalidad SubView en el módulo View.
domReady -calls-> new CombinedView1() -depends-> text!template
-calls-> new View2() --> ... all good ...
Como el proyecto ha crecido, he vuelto a golpear la pared y realmente necesito encontrar la manera de solucionarlo. Incluir más módulos hace que los definidos previamente se vuelvan indefinidos al azar. Require arroja errores y el navegador tampoco. No estoy usando CoffeeScript ni nada de eso tampoco.
He tardado un poco de tiempo en crear una versión de mi aplicación que tenga el mismo módulo y la misma estructura de dependencia con las vistas dependientes, los modelos y las colecciones suprimidas. Esto funciona perfectamente bien, ¿así que solo puedo suponer que hay algún tipo de problema de memoria? Sin embargo, Chrome nunca arroja ningún error tampoco.
Creo que mi próximo paso será rellenar mi aplicación de esqueleto con algunos bucles que consumen mucha memoria y ver qué sucede: les contaré cómo funciona.
Usando Require v2.0.1, entonces no hay ningún complemento de orden - las dependencias y los paquetes están todos configurados usando la directiva shim config. módulos no AMD cargados:
- Backbone
- Underscore
- jQuery
- bigote
- Folleto
- Bootstrap
P.S. Disculpas si esto no está en el lugar correcto. Pensé que sería mejor como comentario pero sinceramente no puedo ver el botón de comentario en ninguna parte.
Actualización: Esta estructura de dependencias rompe constantemente:
Main
- View 1
- text!...
- View 2
- text!...
Sustituyendo el texto con cadenas vacías funciona bien en cada ocasión:
Main
- View 1
- View 2
Así que ¿por qué esperar a que el texto para cargar causa ¿La vista 1 queda indefinida cuando se establece explícitamente como una dependencia en el módulo principal? ¿Seguramente no debería llamarse a Main hasta que todo lo que depende esté cargado?
que duda de que este es realmente un problema RequireJS, sino más bien a alguien relacionado con el navegador. ¿Falla consistentemente en diferentes navegadores? ¿RequireJS registra algún problema, como los tiempos de espera al cargar scripts, en la consola? – Lucero
Lo he visto más en Chrome, aunque también lo he visto en Firefox. No hay registros o errores RequireJS. El error que está ocurriendo es cuando intento crear una instancia de una función Javascript (prototipo) exportada desde un módulo cargado. Está lanzando porque el módulo no parece estar cargado correctamente, ya que Javascript no lo reconoce como una función. Aquí es cuando realmente ocurre el error, que es solo a veces. El resto del tiempo, el código se ejecuta perfectamente bien. De todos modos, no hay un error de tiempo de espera RequireJS. – redhotvengeance
Me parece una orden de carga/problema de inicialización. Tenga en cuenta que puede obtener referencias no definidas si tiene dependencias circulares en su código, las buscaría primero. Tenemos un proyecto con varios cientos de archivos JS cargados por RequireJS y ninguno de esos problemas (ni en Chrome ni en otros navegadores). – Lucero