2010-04-13 11 views
5

Estoy trabajando con Dojo y utilizando el "Patrón de módulo" como se describe en Mastering Dojo. Hasta donde puedo ver, este patrón es un patrón de JavaScript general y ampliamente utilizado. Mi pregunta es: ¿cómo depuramos nuestros módulos?JavaScript/Dojo Module Pattern: ¿cómo depurar?

Hasta ahora no he podido convencer a Firebug para que me muestre el origen de mi módulo. Firebug parece mostrar solo la declaración de evaluación dojo utilizada para ejecutar el método de fábrica. Por lo tanto, no puedo pasar por mi fuente del módulo. Intenté colocar declaraciones de "depurador" en el código de mi módulo, y Firebug parece detenerse correctamente, pero no muestra la fuente.

código de ejemplo a continuación. Este es solo un ejemplo de la complejidad suficiente para hacer plausible la necesidad de depurar, no pretende ser un código útil.

La página

<!-- 
    Experiments with Debugging 
--> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
    "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
    <head> 
    <title>console me</title> 

    <style type="text/css"> 
     @import "../dojoroot/dojo/resources/dojo.css"; 
     @import "../dojoroot/dijit/themes/tundra/tundra.css"; 
     @import "edf.css"; 
    </style>  

    <script type="text/javascript" src="../dojoroot/dojo/dojo.js"> 
    </script> 

    <script type="text/javascript" > 
     dojo.registerModulePath("mytest", "../../mytest"); 

     dojo.require("mytest.example"); 

     dojo.addOnLoad(function(){ 
     mytest.example.greet();      
     }); 
    </script> 

    </head> 
    <body class="tundra"> 
    <div id="bulletin"> 
     <p>Just Testing</p> 
    </div> 
    </body> 
</html> 
<!-- END: snip1 --> 

La java script que me gustaría depurar

dojo.provide("mytest.example"); 
dojo.require("dijit.layout.ContentPane"); 

/** 
* define module 
*/ 
(function(){ 
     //define the main program functions... 
     var example= mytest.example; 
     example.greet= function(args) { 

      var bulletin = dojo.byId("bulletin"); 

      console.log("bulletin:" + bulletin); 

      if (bulletin) { 
       var content = new dijit.layout.ContentPane({ 
        id: "dummy", 
        region: "center" 
        }); 
       content.setContent('Greetings!'); 

       dojo._destroyElement(bulletin); 
       dojo.place(content.domNode, dojo.body(), "first"); 
       console.log("greeting done"); 
      } else { 
       console.error("no bulletin board"); 
      }   
     } 
})(); 

Respuesta

3

(Responder a esta misma, ya que parece un problema común cuya solución no es bien conocido.)

Parece que uno puede muy bien depurar código eval de opinión en FireBug dojo, siempre que lo hace un poco de cooperar. El truco consiste en configurar dojo para permitir dicha depuración utilizando debugAtAllCosts

<script type="text/javascript" src="/dojoroot/dojo/dojo.js" 
     djConfig="parseOnLoad: true, debugAtAllCosts: true"></script> 

Esto se describe en el campus dojo bajo debugging, que también señala que este ajuste no se recomienda en la producción por razones de rendimiento y sugiere un enfoque usando el servidor -la condicionalidad para controlar si dicha depuración está habilitada.

+0

debugAtAllCosts generalmente ya no es necesario en FF y WebKit, por las razones mencionadas en mi respuesta – peller

+0

Todo lo que puedo decir es que sin los djconfigs que se muestran aquí el depurador muestra la línea "eval" en lugar del código eval-ed, y el paso es Inútil. Con el djconfig muestro que la fuente completa es visible y puedo pasarla bien. – djna

+0

En Chrome descubrí que podía depurar el origen de mis módulos, pero no en Firebug (1.8), así que esta respuesta me ahorró mucho tiempo, gracias. – mydoghasworms

1

El patrón es esencialmente xhr + eval ... en realidad es la función eval ese es el problema ... Firefox en particular, no tiene forma de rastrear el código de una evaluación de regreso a su fuente original y en su lugar apunta al eval call site, plus whatever line offset there is en el buffer de evaluación. Firebug ha implementado a clever scheme para solucionar este problema y ha agregado una sugerencia opcional que los cargadores como Dojo pueden usar para incrustar la ruta del archivo original en un comentario. Webkit ahora supports este esquema también. No es perfecto, pero debugger; y otros puntos de interrupción deberían llevarlo al buffer correcto.

No estoy seguro de por qué nada de esto podría funcionar para usted. ¿Qué versión de Firebug estás usando?

+0

Usando Firebug 1.5.3 - y creo que he encontrado una respuesta: debugAtAllCosts, se publicará en un momento. – djna

+0

No funciona para mí con Firebug 1.8, aunque trabajo en Chrome. La respuesta aceptada aquí funcionó para mí. – mydoghasworms

0

La solución debugAtAllCosts de djna funciona para mí, por las razones descritas en http://dojotdg.zaffra.com/tag/dojorequire/.

Sin embargo,, tenga en cuenta que el uso de debugAtAllCosts hace que dojo.require se vuelva asincrónico porque utiliza inserciones de guiones en lugar de xhr + eval. Esto puede causar problemas con el código que espera que dojo.require sea síncrono y que no se haya utilizado utilizando require (como se describe en http://kennethfranqueiro.com/2010/08/dojo-required-reading/). En mi caso, era un código de prueba que estaba siendo ejecutado por el marco de prueba de la unidad. Por lo que el siguiente no pudo decir que no se definió EntityInfo

var e1 = new EntityInfo(); 

hasta que lo cambié a

dojo.addOnLoad(function() { 
    var e1 = new EntityInfo(); 
} 

@peller, Para mí FireBug 1.6.1 me llevará al bloque eval correcto, pero no a los números correctos de archivo y línea (porque es una cadena eval en lugar del archivo original)

1

Además, si está utilizando una versión de Firebug menor que 1.7a10 también verifique que tiene el "Descompilar para la fuente eval()" en la lista desplegable de scripts deshabilitada (extensions.firebug.decompileEvals en about: config). Cuando estoy habilitado, creo que esto hace que Firebug sobrescriba la fuente con su propia versión descompilada y de alguna manera también pierde el nombre de archivo en el camino.

@peller, esta podría ser la razón por la que su respuesta no nos funcionaba.

Está deshabilitado de forma predeterminada, pero lo encendí en algún momento y no me di cuenta.

También se está eliminando por completo en 1.7a10 como parte de la cuestión http://code.google.com/p/fbug/issues/detail?id=4035 de Firebug. También hay discusión relacionada en https://groups.google.com/d/topic/firebug/y2VR17IFHHI/discussion y https://groups.google.com/d/topic/dojo-interest/nWlZdJDlic8/discussion.

0

Añadiré una alternativa más, uso Chrome. Es excelente para depurar evaluaciones (parece captar algunas cosas que Firebug no). Tenga en cuenta su problema con el almacenamiento en caché de archivos JS: http://code.google.com/p/chromium/issues/detail?id=8742.

Personalmente Firebug sigue siendo mi entorno principal, pero ahora también estoy usando Chrome cuando las cosas se complican con las evaluaciones para obtener una segunda vista del problema. Chrome me ayudó dos veces ayer con problemas de función/variable indefinidos con el cargador de dojo que Firebug omitió).

1

Aquí hay una solución que encontré para la imposibilidad de recurrir en dojo.require mudules de la lectura de los NG.

Cambio

<script src="dojoroot/dojo/dojo.js" type="text/javascript"> 

a

<script src="dojoroot/dojo/dojo.js.uncompressed.js" type="text/javascript"> 

Esto fija el menos atento undefineddojo._scopeArgs = [sin definir]; error que uno ve de otra manera.