2010-04-13 18 views
5

Pracuję z Dojo i używam "Wzorca modułu", jak opisano w Mastering Dojo. O ile widzę, ten wzorzec jest powszechnym i powszechnie stosowanym wzorcem JavaScript. Moje pytanie brzmi: w jaki sposób debugujemy nasze moduły?Model modułu JavaScript/Dojo - jak debugować?

Do tej pory nie udało mi się przekonać Firebuga, by pokazał mi źródło mojego modułu. Firebug wydaje się pokazywać tylko instrukcję dojo eval używaną do wykonania metody fabrycznej. Dlatego nie jestem w stanie przejść przez moje źródło modułu. Próbowałem wstawiania "debugger" w moim module code i Firebug wydaje się zatrzymywać poprawnie, ale nie pokazuje źródła.

Wymyślony kod przykładowy poniżej. Jest to tylko przykład wystarczającej złożoności, która sprawia, że ​​debugowanie jest wiarygodne, nie ma być przydatnym kodem.

Strona

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

skrypt java Chciałbym debugowania

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

Odpowiedz

3

(Odpowiadając na ten sam, ponieważ wydaje się być wspólnym problemem, którego rozwiązanie nie jest znany).

Wydaje się, że można ładnie debugowania kodu eval-ed w Firebug pod warunkiem, że robi się trochę dojo współpracujących. Sztuką jest, aby skonfigurować dojo, aby umożliwić taką debugowanie przy użyciu debugAtAllCosts

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

Jest to opisane na dojo kampusu pod debugging, który zauważa również, że ta opcja nie jest zalecana w produkcji ze względu na wydajność i sugeruje podejście przy użyciu serwera -side warunkowość do kontrolowania, czy takie debugowanie jest włączone.

+0

debugAtAllCosts nie powinny być już konieczne na FF i WebKit, z powodów wymienionych w mojej odpowiedzi – peller

+0

Wszystko, co mogę powiedzieć, to to, że bez pokazanych tutaj djconfig debugger pokazuje raczej linię "eval" niż eval-ed, a stepping is nieprzydatne. Dzięki djconfig pokazuję, że pełne źródło jest widoczne i mogę przejść przez nie ładnie. – djna

+0

W Chrome stwierdziłem, że udało mi się zdebugować źródło moich modułów, ale nie w Firebug (1.8), więc ta odpowiedź była oszczędna, dzięki. – mydoghasworms

1

Wzór jest zasadniczo XHR + eval ... naprawdę jest to eval w tym tkwi problem ... Firefox w szczególności nie ma możliwości śledzenia kodu z eval z powrotem do jego oryginalnego źródła i zamiast tego wskazuje na eval call site, plus whatever line offset there is w buforze eval. Firebug wdrożył a clever scheme, aby obejść ten problem, i dodał opcjonalną podpowiedź, którą ładowarki, takie jak Dojo, mogą użyć do osadzenia oryginalnej ścieżki pliku w komentarzu. Webkit teraz supports ten schemat również. Nie jest doskonały, ale debugger; i inne punkty przerwania powinny doprowadzić cię do właściwego bufora.

Nie jestem pewien, dlaczego nic z tego nie zadziała. Którą wersję Firebug używasz?

+0

Korzystanie z Firebug 1.5.3 - i myślę, że znalazłem odpowiedź: debugAtAllCosts, opublikuje to za chwilę. – djna

+0

Nie działa dla mnie z Firebug 1.8, ale działa w Chrome. Przyjęta tutaj odpowiedź zadziałała właśnie dla mnie. – mydoghasworms

0

Rozwiązanie djna dla debugAtAllCosts działa u mnie z przyczyn opisanych w http://dojotdg.zaffra.com/tag/dojorequire/.

Jednak , należy pamiętać, że użycie debugAtAllCosts powoduje, że dojo.require staje się asynchroniczne, ponieważ używa skryptów zamiast xhr + eval. Może to powodować problemy z kodem, który oczekuje, że dojo.require będzie synchroniczne, które nie zostanie wprowadzone przy użyciu samego require (jak opisano w http://kennethfranqueiro.com/2010/08/dojo-required-reading/). W moim przypadku było to testowanie kodu, który był uruchamiany przez framework testów jednostkowych. Więc dodaje się udało mówiąc, że EntityInfo nie została zdefiniowana

var e1 = new EntityInfo(); 

aż zmieniłem go

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

@peller dla mnie FireBug 1.6.1 przeniesie mnie do właściwego bloku eval, ale nie do właściwych numerów plików i linii (ponieważ jest to ciąg eval zamiast oryginalnego pliku) ..

1

Również, jeśli używasz wersji Firebug mniejszej niż 1.7a10 również sprawdź, czy masz wyłączone "Decompile for eval() source" na liście skryptów (extensions.firebug.decompileEvals w about: config). Kiedy jest włączony, myślę, że to powoduje, że Firebug nadpisuje źródło swoją własną wersją dekompilowaną i jakoś również traci nazwę pliku.

@peller, może to być powodem, dla którego Twoja odpowiedź nie działa dla nas.

Domyślnie jest wyłączona, ale w pewnym momencie włączyłem ją i nie zdawałem sobie z tego sprawy.

Jest również całkowicie usunięty w wersji 1.7a10 w ramach wydania Firebug http://code.google.com/p/fbug/issues/detail?id=4035. Również związana dyskusja pod adresem https://groups.google.com/d/topic/firebug/y2VR17IFHHI/discussion i https://groups.google.com/d/topic/dojo-interest/nWlZdJDlic8/discussion.

0

Dodam jeszcze jedną alternatywę, użyj Chrome. Jest świetny do debugowania zła (wydaje się, że łapie pewne rzeczy, których Firebug nie ma). Należy pamiętać o problemie z buforowaniem plików JS - http://code.google.com/p/chromium/issues/detail?id=8742.

Osobiście Firebug jest nadal moim głównym środowiskiem, ale teraz używam również Chrome, gdy sprawy stają się trudne, w celu uzyskania drugiego spojrzenia na problem. Chrome pomógł mi wczoraj dwa razy z nieokreślonymi problemami związanymi z funkcją/zmienną z ładowarką dojo, którą Firebug pominął w przeszłości).

1

Oto rozwiązanie, które znalazłem dla niemożności powrotu do dojo.require mudules z czytania NG.

Zmiana

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

do

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

rozwiązuje to, że mniej niż pomocne undefineddojo._scopeArgs = [zdefiniowana]; błąd, który można zobaczyć inaczej.