2012-06-09 10 views
16

Tengo un proyecto Backbone.js bastante grande que usa RequireJS. A medida que crecía el tamaño del proyecto (el "tamaño" aquí se refiere a la cantidad de archivos de módulos separados), comenzaron a aparecer errores intermitentes. La mayoría de las veces, se trata de un error de objeto:Intermitente RequireJS Error de carga

Uncaught TypeError: object is not a function

De vez en cuando, se queja de un módulo no está cargado.

Estos errores desaparecen una vez que el proyecto se ejecuta a través del optimizador r.js. Solo ocurren cuando RequireJS carga los módulos individuales.

Lo que me lleva a mi pregunta: ¿RequireJS comienza a tener problemas con los módulos que se cargan a tiempo cuando la cantidad de módulos alcanza un cierto número?

+1

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

+0

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

+0

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

Respuesta

5

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?

+1

Tengo exactamente el mismo problema. también vea https://groups.google.com/forum/?fromgroups#!topic/requirejs/Eym3R08Bmmg –

+0

Aparentemente, también requiere la dependencia 'text! ...' de View 2 en la Vista 1 hace que el módulo se cargue correctamente nuevamente. No es hermoso, pero funciona. –

+0

Me alegra saber que no estoy loco, obviamente no puede haber problemas de dependencia circular si es intermitente. Claramente algo más profundo está pasando. También seguiré el hilo de Grupos de Google que abriste, @SteveBeer. – redhotvengeance

5

He estado luchando con el mismo emite los últimos días y esto es lo que descubrí:

Aparentemente, una estructura de dependencia anidada que requiera plantillas a través del complemento text.js puede causar una condición de carrera que permite que el módulo de nivel superior no esté listo cuando lo que creej es. Sólo se encontró con este problema cuando tuve varias estructuras de dependencia anidada módulo de este tipo:

Router 
    -> View1 
    -> text!.../view1.html 
    -> View2 
     -> text!.../view2.html 
    -> View3 
    -> text!.../view3.html 
    -> View4 
     -> text!.../view4.html 
    -> View5 
    -> text!.../view5.html 
    -> View6 
     -> text!.../view6.html 
    -> View7 
    -> text!.../view7.html 
    -> View8 
     -> text!.../view8.html 

que tiene esta estructura, llegué TypeErrors como 'View1 no es un constructor' cuando el router intenta crear una instancia de las vistas.

requiere también las plantillas de las vistas anidadas en las vistas superiores de nivel resuelto el problema para mí:

Router 
    -> View1 
    -> text!.../view1.html 
    -> text!.../view2.html 
    -> View2 
     -> text!.../view2.html 
    -> View3 
    -> text!.../view3.html 
    -> text!.../view4.html 
    -> View4 
     -> text!.../view4.html 
    -> View5 
    -> text!.../view5.html 
    -> text!.../view6.html 
    -> View6 
     -> text!.../view6.html 
    -> View7 
    -> text!.../view7.html 
    -> text!.../view8.html 
    -> View8 
     -> text!.../view8.html 

que no se sabe muy bien cómo require.js obras, pero esto me parece como los anidado ¡texto! las llamadas no se consideran cuando se establece un indicador 'listo' para el módulo padre.

+0

Sí, parece que es lo que está causando el problema. ¡También estoy usando bastante texto! llamadas, por lo que parece que el problema está en algún lugar allí. – redhotvengeance

Cuestiones relacionadas