2010-04-13 13 views
5

Sto lavorando con Dojo e utilizzo il "Pattern modulo" come descritto in Mastering Dojo. Per quanto posso vedere, questo pattern è un pattern JavaScript generale e ampiamente utilizzato. La mia domanda è: come facciamo il debug dei nostri moduli?Pattern modulo JavaScript/Dojo: come eseguire il debug?

Finora non sono riuscito a convincere Firebug a mostrarmi la fonte del mio modulo. Firebug sembra mostrare solo l'istruzione eval dojo usata per eseguire il metodo factory. Quindi non sono in grado di scorrere la mia fonte del modulo. Ho provato a mettere le istruzioni "debugger" nel mio codice del modulo, e Firebug sembra fermarsi correttamente, ma non mostra la fonte.

Codice di esempio conteggiato di seguito. Questo è solo un esempio di complessità sufficiente per rendere plausibile la necessità di debugging, non è destinato a essere codice utile.

La pagina

<!-- 
    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 --> 

Lo script java mi piacerebbe eseguire il debug

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"); 
      }   
     } 
})(); 

risposta

3

(Rispondere a questo me stesso perché sembra un problema comune la cui soluzione non è ben nota.)

Sembra che si può ben eseguire il debug di codice eval-ed in FireBug a condizione che dojo fa un po 'di collaborazione. Il trucco è quello di configurare dojo per abilitare tale debug usando debugAtAllCosts

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

Questo è descritto nel campus dojo sotto debugging, che rileva inoltre che questa impostazione non è consigliata in produzione per motivi di prestazioni e suggerisce un approccio utilizzando il server condizionale per controllare se tale debug è abilitato.

+0

debugAtAllCosts in genere non è più necessario su FF e WebKit, per le ragioni menzionate nella mia risposta – peller

+0

Tutto quello che posso dire è che senza i djconfigs qui mostrati il ​​debugger mostra la riga "eval" piuttosto che il codice eval-ed, e stepping è inutile. Con il djconfig mostro che l'intera fonte è visibile e posso attraversarla piacevolmente. – djna

+0

In Chrome ho scoperto che ero in grado di eseguire il debug dei sorgenti dei miei moduli, ma non in Firebug (1.8), quindi questa risposta è stata abbastanza rapida, grazie. – mydoghasworms

1

Il modello è essenzialmente XHR + eval ... in realtà è l'eval che è il problema ... Firefox in particolare non ha modo di tracciare il codice da un'eval alla sua fonte originale e punta invece allo eval call site, plus whatever line offset there is nel buffer di eval. Firebug ha implementato a clever scheme per risolvere questo problema e aggiunto un suggerimento opzionale che i caricatori come Dojo possono utilizzare per incorporare il percorso del file originale in un commento. Webkit ora supports anche questo schema. Non è perfetto, ma debugger; e altri punti di interruzione dovrebbero portarti nel buffer corretto.

Non sono sicuro del motivo per cui nulla di tutto ciò potrebbe funzionare per voi. Quale versione di Firebug stai usando?

+0

Utilizzo di Firebug 1.5.3 - e penso di aver trovato una risposta: debugAtAllCosts, lo pubblicherà in un attimo. – djna

+0

Non funziona per me con Firebug 1.8, sebbene funzioni in Chrome. La risposta accettata qui ha funzionato per me. – mydoghasworms

0

La soluzione debugAtAllCosts di djna funziona per me, per le ragioni descritte allo http://dojotdg.zaffra.com/tag/dojorequire/.

Tuttavia, notare che l'uso di debugAtAllCosts fa sì che dojo.require diventi asincrono poiché utilizza inserimenti di script anziché xhr + eval. Questo può causare problemi con il codice che si aspetta che dojo.require sia sincrono e che non viene portato usando require stesso (come descritto in http://kennethfranqueiro.com/2010/08/dojo-required-reading/). Nel mio caso si trattava di testare il codice che avevo gestito da un framework di test unitario. Così il seguente fallito dicendo che EntityInfo non è stato definito

var e1 = new EntityInfo(); 

fino a quando ho cambiato in

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

@peller, per me FireBug 1.6.1 mi porterà al blocco eval corretto ma non al numero corretto di file e numeri di riga (perché è una stringa eval anziché il file originale) ..

1

Inoltre, se si utilizza anche una versione di Firebug inferiore a 1.7a10 verifica di avere "Decompile per eval() source" nel menu a discesa degli script disabilitato (extensions.firebug.decompileEvals in about: config). Se abilitato, penso che questo faccia sì che Firebug sovrascriva il sorgente con la sua versione decompilata e in qualche modo perde il nome del file lungo la strada.

@peller, Questo potrebbe essere il motivo per cui la tua risposta non funzionava per noi.

È disabilitato per impostazione predefinita, ma a un certo punto l'ho acceso e non me ne sono reso conto.

Viene inoltre rimosso completamente in 1.7a10 come parte del problema Firebug http://code.google.com/p/fbug/issues/detail?id=4035. Discussione anche relativa a https://groups.google.com/d/topic/firebug/y2VR17IFHHI/discussion e https://groups.google.com/d/topic/dojo-interest/nWlZdJDlic8/discussion.

0

Aggiungerò un'altra alternativa, utilizzare Chrome. È ottimo per eseguire il debug delle evals (sembra che catturi alcune cose di Firebug). Essere a conoscenza del suo problema con la cache dei file JS - http://code.google.com/p/chromium/issues/detail?id=8742.

Personalmente Firebug è ancora il mio ambiente principale, ma ora sto utilizzando anche Chrome quando le cose si complicano con le valutazioni per ottenere una seconda visione del problema. Chrome mi ha aiutato due volte ieri con problemi di funzioni/variabili non definiti con il caricatore dojo che Firebug ha saltato subito dopo).

1

Ecco una soluzione che ho trovato per l'incapacità di recedere in dojo.require i fanghi dalla lettura dei NG.

Change

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

a

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

questo risolve il meno disponibile undefineddojo._scopeArgs = [undefined]; errore che si vede altrimenti.