2016-03-08 16 views
8

wszystko:Jak debugować Angular2 w Chrome

Jestem całkiem nowy Angular2 uważam, że to jest jeszcze trudniejsze niż Angular1 debugowania w Chrome (jest to tylko moje odczucie, kiedy śledzę tutorial na oficjalnej stronie Angular2 , kiedy jest błąd w kodzie, większość czasu, wyjście konsoli pochodzi z pliku system.js lub angular.dev.js, nie pamiętam, z jakiego pliku js pochodzi ten błąd, ale jedno jest najważniejsze, nie może pomocnie wskaż prawdziwe miejsce, w którym powstał błąd).

Zastanawiam się, gdzie mogę znaleźć samouczek dotyczący śledzenia błędu w Chrome dla Angular2?

Dzięki

+0

Spróbuj stworzyć Plunkera, który demonstruje konkretny problem, który napotkasz, a następnie może być w stanie przedstawić sugestie, jak korzystać z dostępnych narzędzi, aby znaleźć przyczynę problemu. –

+0

Zamów ten wpis podczas debugowania Angular2 w chrome: http://stackoverflow.com/questions/34583073/angular-2-errors-and-typescript-how-to-debug?answertab=active#tab-top – Rich

Odpowiedz

10

W rzeczywistości debugowania aplikacji Angular2 jest nieco trudniejsze niż te Angular1 ponieważ istnieje kilka dodatkowych mechanizmów zaangażowanych:

  • maszynopis lub ES6 (klasy, ...)
  • modułów (import, eksport, ...)
  • dekoratorów i metadane

Ponadto wymagane są inne narzędzia, takie jak SystemJS do obsługi modułów.

To powiedziawszy, możesz wykorzystać swoje narzędzia IDE i Dev, aby pomóc w znalezieniu problemów.

Weźmy przykłady klasycznych błędów.

  • Importowanie non-istniejący moduł

    Kod:

    import {Component} from 'angular2/angular2'; // <------- 
    
    @Component({ 
        selector: 'my-app', 
        template: ` 
        (...) 
        ` 
    }) 
    export class AppComponent { 
    } 
    

    Błąd:

    angular2-polyfills.js:1243 Uncaught SyntaxError: Unexpected token < 
        Evaluating http://localhost:3000/angular2/angular2 
        Error loading http://localhost:3000/app/boot.js 
    

    Wyjaśnienie: Jeśli spojrzysz na zakładkę Sieć, zobaczysz, że żądanie http://localhost:3000/angular2/angular2 otrzymuje kod statusu 404, a ładunek odpowiedzi to HTML. SystemJS próbuje ocenić ten kod jako JavaScript. Dlatego pojawia się błąd składni.

    Gdy moduł nie zostanie znaleziony, SystemJS próbuje załadować go z adresu URL.Jeśli nie ma powiązanego konfigurację (w obrębie package kloc, map blok), po prostu używa/

  • Angular2 dołączony plik JS brakujący

    Kod:

    import {Component} from 'angular2/core'; 
    import {Http} from 'angular2/http'; // <----- 
    
    @Component({ 
        selector: 'my-app', 
        template: ` 
        <div>Test</div> 
        ` 
    }) 
    export class AppComponent { 
        constructor(private http:Http) { 
        } 
    } 
    

    błąd:

    angular2-polyfills.js:1243 Uncaught SyntaxError: Unexpected token < 
        Evaluating http://localhost:3000/angular2/http 
        Error loading http://localhost:3000/app/boot.js 
    

    Wyjaśnienie: to jest coś podobnego do poprzedniego problemu. Po dodaniu http.dev.js pliku, moduł angular/http jest automatycznie zarejestrować się na SystemJS użyciu System.register. Jeśli nie jest obecny, SystemJS próbuje załadować go za pomocą żądania HTTP.

  • Błędna konfiguracja SystemJS aby załadować moduły

    Kodeksu:

    import {Component,Inject} from 'angular2/core'; 
    import {TranslateService,TranslateStaticLoader,TranslateLoader} from 'ng2-translate/ng2-translate'; 
    
    @Component({ 
        selector: 'first-app', 
        template: ` 
        (...) 
        ` 
    }) 
    export class AppComponent { 
        constructor(translate:TranslateService) { 
        } 
    } 
    

    Błąd:

    TypeError: Cannot read property 'getOptional' of undefined at runAppInitializers (localhost:8000/angular2.dev.js:12628:25) at PlatformRef.initApp 
    

    Wyjaśnienie: W takim przypadku komunikat o błędzie nie podaje wskazówek. Musimy przetestować nieco, aby dowiedzieć się, że problem występuje, gdy translate:TranslateService jest dodawany w konstruktorze komponentów. Jest to związane z ładowaniem ng2-translate, więc prawdopodobnie do jego konfiguracji w SystemJS. Zobacz to pytanie: ng2-translate: TranslateService and Error: Cannot read property 'getOptional' of undefined(…).

  • Niewłaściwy elementem importu

    Kod:

    import {Component1} from 'angular2/core'; // <----- 
    
    @Component1({ 
        selector: 'my-shop', 
        template: ` 
        (...) 
        ` 
    }) 
    export class AppComponent { 
    } 
    

    Błąd:

    angular2-polyfills.js:1243 Error: core_1.Component1 is not a function(…) 
    

    Wyjaśnienie: Component nie jest czymś, eksportowane przez angular2/core moduł. Oczywiście, jest to oczywiste, ale nie mamy bardzo przydatnych wskazówek w komunikacie o błędzie. Może być trudno dowiedzieć się o dużym kodzie źródłowym. W takich przypadkach należy wykorzystać IDE (nawet w Sublime z wtyczką TypeScript), ponieważ spowoduje to błąd. Tutaj jest błąd mam w tym przypadku:

    Module '".../node_modules/angular2/core"' has no exported member 'Component1'. Line 16, Column 16 
    
  • Błąd podczas wykonywania przetwarzania.

    Kod:

    import {Component} from 'angular2/core'; 
    
    @Component({ 
        selector: 'my-app', 
        template: ` 
        <div>Test</div> 
        ` 
    }) 
    export class AppComponent { 
        constructor() { 
        this.test.test(); 
        } 
    } 
    

    Błąd:

    angular2.dev.js:23083 TypeError: Cannot read property 'test' of undefined 
        at new AppComponent (app-component.ts:33) 
        at angular2.dev.js:1412 
        at Injector._instantiate (angular2.dev.js:11453) 
    

    Wyjaśnienie: Myślę, że jest to proste błąd naprawić skoro masz linię gdzie występuje błąd w pliku TypeScript. Nie zapomnij włączyć sourceMap, aby móc używać odwzorowania liniowego między skompilowanymi plikami JS i plikami źródłowymi TypeScript.

  • ES6 stosowany zamiast maszynopis

    Kod:

    @Page({ 
        templateUrl: 'build/pages/list/list.html' 
    }) 
    export class ListPage { 
        constructor(nav: NavController){ 
        this.nav = nav; 
        } 
    } 
    

    Błąd:

    /app/pages/list/list.js Module build failed: SyntaxError: /focus/projects/ionic-todo/app/pages/list/list.js: 
        Unexpected token (10:17) 8 | 9 | export class ListPage { 
    
    10 | constructor(nav: NavController){ |^11 | this.nav = nav; 12 | 13 | this.items = [ 
    

    Wyjaśnienie: wydaje się, że problem występuje na poziomie definicji parametru konstruktora na znaku :. ES6 obsługuje klas, ale nie na poziomie metody typy ... Zobacz to pytanie: Ionic 2 Syntax Error While Compiling TypeScript

0

dla Chrome użytkowników, można debugowania kodu przy użyciu narzędzi programistycznych dostarczanych przez chrom. Wystarczy nacisnąć klawisz F12, aby go otworzyć

kliknąć na ten link, aby zobaczyć zdjęcie ->Debugging code of angular 2 using chrome developer tools

Po otwarciu narzędzi programistycznych, przejdź do zakładki źródeł gdy kątowe aplikacja jest uruchomiona, wszystkie kątowe pliki idzie wewnątrz folder Webpack. możesz użyć punktu przerwania w plikach składowych kątowych do debugowania kodu.