Sentry - Remote-Bug-Tracking in Frontend-Anwendungen von React

Wir untersuchen die Verwendung von Sentry mit React.

Sentry - Remote-Bug-Tracking in Frontend-Anwendungen von React

Dieser Artikel ist Teil einer Reihe, die mit einem Sentry-Fehlerbericht beginnt: Teil 1.

Implementierung von React

Zuerst mĂŒssen wir ein neues Sentry-Projekt fĂŒr diese Anwendung hinzufĂŒgen; auf der Sentry-Website. In diesem Fall wĂ€hlen wir React.

Wir implementieren erneut unsere beiden SchaltflÀchen, Hello und Error, in die React-Anwendung. Wir beginnen mit der Erstellung unserer Startanwendung:

npx create-react-app react-app

Dann importieren wir das Sentry-Paket:

yarn add @sentry/browser

und initialisieren es:

react-app / src / index.js

...
import * as Sentry from '@sentry/browser';

const RELEASE = '0.1.0';
if (process.env.NODE_ENV === 'production') {
  Sentry.init({
    dsn: 'https://303c04eac89844b5bfc908ceffc6757c@sentry.io/1289887',
    release: RELEASE,
  });
}
...

Beobachtungen:

  • WĂ€hrend der Entwicklung haben wir andere Mechanismen zur Überwachung von Problemen, wie die Konsole, daher aktivieren wir Sentry nur fĂŒr Produktionsbuilds.

Dann implementieren wir unsere SchaltflĂ€chen Hello und Error und fĂŒgen sie der Anwendung hinzu:

react-app / src / Hello.js

import React, { Component } from 'react';
import * as Sentry from '@sentry/browser';

export default class Hello extends Component {
  state = {
    text: '',
  };
  render() {
    const { text } = this.state;
    return (
      <div>
        <button
          onclick="{this.handleClick}"
        >
          Hallo
        </button>
        <div>{text}</div>
      </div>
    )
  }

  handleClick = () =&gt; {
    this.setState({
      text: 'Hallo Welt',
    });
    try {
      throw new Error('Gefangen');
    } catch (err) {
      if (process.env.NODE_ENV !== 'production') {
        return;
      }
      Sentry.captureException(err);
    }
  }
}

react-app / src / MyError.js

import React, { Component } from 'react';

export default class MyError extends Component {
  render() {
    return (
      <div>
        <button
          onclick="{this.handleClick}"
        >
          Fehler
        </button>
      </div>
    )
  }

  handleClick = () =&gt; {
    throw new Error('Uncaught');
  }
}

react-app / src / App.js

...<br />import Hello from './Hello';<br />import MyError from './MyError';<br /><br />class App extends Component {<br />  render() {<br />    return (
      <div classname="App">
        ...
        <hello />
        <myerror />
      </div>
    );<br />  }<br />}<br /><br />export default App;

Problem (Source Maps)

Wir können Sentry mit einem Produktionsbuild testen, indem wir eingeben:

yarn build

und aus dem Build-Ordner eingeben:

npx http-server -c-1

Das Problem, mit dem wir uns sofort befassen mĂŒssen, ist, dass die Sentry-Fehlermeldungen sich auf Zeilennummern im minimierten Paket beziehen; das ist nicht sehr hilfreich.

Sentry - Remote-Bug-Tracking in Frontend-Anwendungen von React

Der Sentry-Dienst erklĂ€rt dies, indem er die Quellkarten fĂŒr das minimierte Paket nach dem Empfang eines Fehlers abruft. In diesem Fall laufen wir von localhost (nicht vom Sentry-Dienst zugĂ€nglich).

Lösungen (Quellkarten)

Die Lösung fĂŒr dieses Problem besteht darin, die Anwendung von einem öffentlichen Webserver aus auszufĂŒhren. Eine einfache Möglichkeit, dies zu erreichen, ist die Verwendung des GitHub Pages-Dienstes (kostenlos). Die Schritte zur Nutzung sind normalerweise die folgenden:

  1. Kopieren Sie den Inhalt des Ordners build in den Ordner ausfĂŒhrt. DarĂŒber hinaus können wir beim HinzufĂŒgen von Daten aus dem Repository nur die notwendigen Verzeichnisse auswĂ€hlen (in unserem Fall ist das das Verzeichnis in das Stammverzeichnis des Repositories.

  2. Aktivieren Sie GitHub Pages im Repository (von GitHub), um den docs-Ordner in master der Branch

  3. Übertragen Sie die Änderungen auf GitHub

Hinweis: nachdem ich verstanden hatte, dass ich die create-create-app Homepage-Funktion nutzen muss, um die Anwendung zu starten. Es bestand darin, Folgendes zu package.json hinzuzufĂŒgen:

"homepage": "https://larkintuckerllc.github.io/hello-sentry/"

Die endgĂŒltige Version der gestarteten Anwendung ist unter folgendem Link verfĂŒgbar:

https://larkintuckerllc.github.io/hello-sentry/

Illustration der erfassten Fehler

Lassen Sie uns die SchaltflĂ€che Hello drĂŒcken.

Sentry - Remote-Bug-Tracking in Frontend-Anwendungen von React

Mit dem folgenden Fehler, der angezeigt wird:

Sentry - Remote-Bug-Tracking in Frontend-Anwendungen von React

Beobachtungen:

  • Dieser Fehlerbericht könnte nicht klarer sein, BRAVO.

Illustration Unbeachteter Fehler

Lass uns ebenso durch den Knopfdruck gehen Fehler.

Sentry - Remote-Bug-Tracking in Frontend-Anwendungen von React

Mit dem folgenden Fehler, der angezeigt wird:

Sentry - Remote-Bug-Tracking in Frontend-Anwendungen von React

Beste Handhabung unbeachteter Fehler (Rendering)

EinfĂŒhrung in Fehlergrenzen

Ein JavaScript-Fehler im BenutzeroberflĂ€chenbereich sollte die FunktionalitĂ€t der gesamten Anwendung nicht beeintrĂ€chtigen. Um dieses Problem fĂŒr React-Nutzer zu lösen, fĂŒhrt React 16 das neue Konzept der "Fehlergrenzen" ein.

Fehlergrenzen sind React-Komponenten, die JavaScript-Fehler an beliebiger Stelle in ihrem untergeordneten Komponentenbaum auffangen, diese Fehler protokollieren und eine Fallback-BenutzeroberflÀche anstelle des beschÀdigten Komponentenbaums anzeigen. Fehlergrenzen fangen Fehler wÀhrend des Renderings, in Lebenszyklusmethoden und in Konstruktoren des gesamten darunter liegenden Baums auf.




Neues Verhalten fĂŒr unbeachtete Fehler

Diese Änderung ist bedeutend. Ab React 16 fĂŒhren Fehler, die von keiner Fehlergrenze aufgefangen werden, zum Abbau des gesamten React-Komponentenbaums.

— Dan Abramov — Fehlerbehandlung in React 16

Eine wichtige Klarstellung, die mich etwas Zeit gekostet hat, um zu verstehen, ist, dass das oben genannte Verhalten nur mit Fehlern funktioniert, die im Renderverfahren (oder wahrscheinlicher, in einer der Lebenszyklusmethoden) erzeugt werden.. Zum Beispiel wĂŒrde die Verwendung von Fehlergrenzen mit unserem Button keinen Nutzen bringen, Fehler; dieser Fehler befand sich im Click-Handler.

Lassen Sie uns ein Beispiel fĂŒr einen Renderfehler erstellen und dann Fehlergrenzen fĂŒr eine elegantere Fehlerbehandlung verwenden.

react-app / src / MyRenderError

import React, { Component } from 'react';

export default class MyRenderError extends Component {
  state = {
    flag: false,
  };
  render() {
    const { flag } = this.state;
    return (
      <div>
        <button
          onclick="{this.handleClick}"
        >
          Renderfehler
        </button>
        { flag &amp;&amp; <div>{flag.busted.bogus}</div> }
      </div>
    )
  }

  handleClick = () =&gt; {
    this.setState({
      flag: true,
    });
  }
}

Beobachtung:

  • Wenn die Taste gedrĂŒckt wird, React wird nun fĂŒr diese Websites flag.busted.bogus, die einen Fehler erzeugt.

  • Ohne Fehlergrenzen wird der gesamte Komponentenbaum demontiert.

Dann schreiben wir unseren Fehlergrenzencode (verwendet die neue Lebenszyklusmethode componentDidCatch); das ist im Wesentlichen das Beispiel, das in Dans Abramovs Artikel angefĂŒhrt wird:

react-app / src / ErrorBoundary.js

import React, { Component } from 'react';
import * as Sentry from '@sentry/browser';

export default class ErrorBoundary extends Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  componentDidCatch(err, info) {
    this.setState({ hasError: true });
    Sentry.captureException(err);
  }

  render() {
    if (this.state.hasError) {
      return <h1>Etwas ist schief gelaufen.</h1>;
    }
    return this.props.children;
  }
}

Zuletzt verwenden wir diese Komponente:

react-app / src / App.js

...
import MyRenderError from './MyRenderError';

class App extends Component {
  render() {
    return (
      <errorboundary>
        <div classname="App">
          ...
        </div>
      </errorboundary>
    );
  }
}
...

Dabei zeigt das DrĂŒcken des Buttons Render Error die ErsatzbenutzeroberflĂ€che an und berichtet den Fehler an Sentry.

Sentry - Remote-Bug-Tracking in Frontend-Anwendungen von React

Sentry - Remote-Bug-Tracking in Frontend-Anwendungen von React

Abschluss

Ich hoffe, dies war hilfreich fĂŒr Sie.

P.S. Link zum Original

P.S. Telegram-Chat zu Sentry https://t.me/sentry_ru

Quelle: habr.com

ZuverlĂ€ssiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen đŸ”„ ZuverlĂ€ssiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster