Дистанционно наблюдСниС Π½Π° бъговС Π² React frontend прилоТСния

ΠŸΡ€ΠΎΡƒΡ‡Π²Π°ΠΌΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Sentry с React.

Дистанционно наблюдСниС Π½Π° бъговС Π² React frontend прилоТСния

Π’Π°Π·ΠΈ статия Π΅ част ΠΎΡ‚ ΠΏΠΎΡ€Π΅Π΄ΠΈΡ†Π°, Π·Π°ΠΏΠΎΡ‡Π²Π°Ρ‰Π° с Π΄ΠΎΠΊΠ»Π°Π΄Π²Π°Π½Π΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π½Π° Sentry, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: Π§Π°ΡΡ‚ΡŒ 1.

ВнСдряванС Π½Π° React

ΠŸΡŠΡ€Π²ΠΎ трябва Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½ΠΎΠ² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Sentry Π·Π° Ρ‚ΠΎΠ²Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅; ΠΎΡ‚ уСбсайта Π½Π° Sentry. Π’ Ρ‚ΠΎΠ·ΠΈ случай ΠΈΠ·Π±ΠΈΡ€Π°ΠΌΠ΅ React.

Π©Π΅ Π²Π½Π΅Π΄Ρ€ΠΈΠΌ ΠΎΡ‚Π½ΠΎΠ²ΠΎ Π½Π°ΡˆΠΈΡ‚Π΅ Π΄Π²Π° Π±ΡƒΡ‚ΠΎΠ½Π°, Hello ΠΈ Error, Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с React. Π—Π°ΠΏΠΎΡ‡Π²Π°ΠΌΠ΅ със ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π½Π°ΡˆΠ΅Ρ‚ΠΎ стартово ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

npx create-react-app react-app

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€Π°ΠΌΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Sentry:

yarn add @sentry/browser

ΠΈ Π³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°ΠΉΡ‚Π΅:

Ρ€Π΅Π°Π³ΠΈΡ€Π°Ρ‚-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅/src/index.js

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

const RELEASE = '0.1.0';
if (process.env.NODE_ENV === 'production') {
  Sentry.init({
    dsn: 'https://[email protected]/1289887',
    release: RELEASE,
  });
}
...

НаблюдСния:

  • По Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° ΠΈΠΌΠ°ΠΌΠ΅ Π΄Ρ€ΡƒΠ³ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΈ Π·Π° наблюдСниС Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΊΠ°Ρ‚ΠΎ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π°, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π²Π°ΠΌΠ΅ Sentry само Π·Π° производствСни ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ†ΠΈΠΈ

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΏΡ€ΠΈΠ»Π°Π³Π°ΠΌΠ΅ Π½Π°ΡˆΠΈΡ‚Π΅ Π±ΡƒΡ‚ΠΎΠ½ΠΈ Hello ΠΈ Error ΠΈ Π³ΠΈ добавямС към ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ:

Ρ€Π΅Π°Π³ΠΈΡ€Π°Ρ‚-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅/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}
        >
          Hello
        </button>
        <div>{text}</div>
      </div>
    )
  }

  handleClick = () => {
    this.setState({
      text: 'Hello World',
    });
    try {
      throw new Error('Caught');
    } catch (err) {
      if (process.env.NODE_ENV !== 'production') {
        return;
      }
      Sentry.captureException(err);
    }
  }
}

Ρ€Π΅Π°Π³ΠΈΡ€Π°Ρ‚-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅/src/MyError.js

import React, { Component } from 'react';

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

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

Ρ€Π΅Π°Π³ΠΈΡ€Π°Ρ‚-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅/src/App.js

...
import Hello from './Hello';
import MyError from './MyError';

class App extends Component {
  render() {
    return (
      <div className="App">
        ...
        <Hello />
        <MyError />
      </div>
    );
  }
}

export default App;

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌ (Π˜Π·Ρ…ΠΎΠ΄Π½ΠΈ ΠΊΠ°Ρ€Ρ‚ΠΈ)

МоТСм Π΄Π° тСствамС Sentry с производствСна компилация, ΠΊΠ°Ρ‚ΠΎ Π²ΡŠΠ²Π΅Π΄Π΅Ρ‚Π΅:

yarn build

ΠΈ ΠΎΡ‚ ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π²ΡŠΠ²Π΅Π΄Π΅Ρ‚Π΅:

npx http-server -c-1

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚, с ΠΊΠΎΠΉΡ‚ΠΎ сС сблъсквамС Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ, Π΅, Ρ‡Π΅ записитС Π·Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π½Π° Sentry сС отнасят Π΄ΠΎ Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° Ρ€Π΅Π΄ΠΎΠ²Π΅ Π² минимизирания ΠΏΠ°ΠΊΠ΅Ρ‚; Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ.

Дистанционно наблюдСниС Π½Π° бъговС Π² React frontend прилоТСния

Услугата Sentry обяснява Ρ‚ΠΎΠ²Π°, ΠΊΠ°Ρ‚ΠΎ изтСгля ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ ΠΊΠ°Ρ€Ρ‚ΠΈ Π·Π° намалСния ΠΏΠ°ΠΊΠ΅Ρ‚ слСд ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ°. Π’ Ρ‚ΠΎΠ·ΠΈ случай Ρ€Π°Π±ΠΎΡ‚ΠΈΠΌ ΠΎΡ‚ localhost (Π½Π΅ Π΅ Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½ ΠΎΡ‚ услугата Sentry).

РСшСния (ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈ ΠΊΠ°Ρ€Ρ‚ΠΈ)

Π Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π΅ Π΄Π° стартиратС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΎΡ‚ ΠΏΡƒΠ±Π»ΠΈΡ‡Π΅Π½ ΡƒΠ΅Π± ΡΡŠΡ€Π²ΡŠΡ€. Π•Π΄ΠΈΠ½ прост Π±ΡƒΡ‚ΠΎΠ½ Π·Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€, Π·Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ услугата GitHub Pages (Π±Π΅Π·ΠΏΠ»Π°Ρ‚Π½ΠΎ). Π‘Ρ‚ΡŠΠΏΠΊΠΈΡ‚Π΅ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ са слСднитС:

  1. ΠšΠΎΠΏΠΈΡ€Π°ΠΉΡ‚Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° към ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈ Π² основната дирСктория Π½Π° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ.

  2. Π’ΠΊΠ»ΡŽΡ‡ΠΈ Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†ΠΈ Π½Π° GitHub Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ (ΠΎΡ‚ GitHub), Π·Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈ майстор ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅

  3. Π˜Π·ΠΏΡ€Π°Ρ‚Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π² GitHub

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: слСд ΠΊΠ°Ρ‚ΠΎ Ρ€Π°Π·Π±Ρ€Π°Ρ… ΠΊΠ°ΠΊΠ²ΠΎ трябва Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ създаванС-създаванС Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ функция Π·Π° Π½Π°Ρ‡Π°Π»Π½Π° страница Π·Π° стартиранС Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ. Π‘Ρ‚ΠΈΠ³Π½Π° сС Π΄ΠΎ добавянС Π½Π° слСдното към package.json:

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

ΠžΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»Π½Π°Ρ‚Π° вСрсия Π½Π° Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ΠΎΡ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΅ Π΄ΠΎΡΡ‚ΡŠΠΏΠ½Π° Π½Π°:

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

Π˜Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ Π½Π° Ρ…Π²Π°Π½Π°Ρ‚ΠΈ бъговС

НСка ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ ΠΏΡ€Π΅Π· Ρ‰Ρ€Π°ΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ Π²ΡŠΡ€Ρ…Ρƒ Π±ΡƒΡ‚ΠΎΠ½Π° Π—Π΄Ρ€Π°Π²Π΅ΠΉ.

Дистанционно наблюдСниС Π½Π° бъговС Π² React frontend прилоТСния

Π‘ Π³Ρ€Π΅ΡˆΠΊΠ°, появяваща сС ΠΏΠΎ слСдния Π½Π°Ρ‡ΠΈΠ½:

Дистанционно наблюдСниС Π½Π° бъговС Π² React frontend прилоТСния

НаблюдСния:

  • Π’ΠΎΠ·ΠΈ Π΄ΠΎΠΊΠ»Π°Π΄ Π·Π° Π³Ρ€Π΅ΡˆΠΊΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΠΎ-ясСн, BRAVO.

Π˜Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ Π½Π° Π½Π΅ΠΎΡ‚Ρ‡Π΅Ρ‚Π΅Π½ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ

По ΡΡŠΡ‰ΠΈΡ Π½Π°Ρ‡ΠΈΠ½ Π½Π΅ΠΊΠ° Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ ΠΏΡ€Π΅Π· Ρ‰Ρ€Π°ΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π±ΡƒΡ‚ΠΎΠ½Π° Π³Ρ€Π΅ΡˆΠΊΠ°.

Дистанционно наблюдСниС Π½Π° бъговС Π² React frontend прилоТСния

Π‘ Π³Ρ€Π΅ΡˆΠΊΠ°, появяваща сС ΠΏΠΎ слСдния Π½Π°Ρ‡ΠΈΠ½:

Дистанционно наблюдСниС Π½Π° бъговС Π² React frontend прилоТСния

По-Π΄ΠΎΠ±Ρ€ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Π½Π΅ Π½Π° Π½Π΅ΠΎΡ‚Ρ‡Π΅Ρ‚Π΅Π½ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ (Ρ€Π΅Π½Π΄ΠΈΡ€Π°Π½Π΅)

Π’ΡŠΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π³Ρ€Π°Π½ΠΈΡ†ΠΈ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ

Π“Ρ€Π΅ΡˆΠΊΠ° Π² JavaScript Π² част ΠΎΡ‚ потрСбитСлския интСрфСйс Π½Π΅ трябва Π΄Π° Π½Π°Ρ€ΡƒΡˆΠ°Π²Π° цялото ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π—Π° Π΄Π° Ρ€Π΅ΡˆΠΈ Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π·Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ Π½Π° React, React 16 въвСТда Π½ΠΎΠ²Π° концСпция, Π½Π°Ρ€Π΅Ρ‡Π΅Π½Π° β€žΠ³Ρ€Π°Π½ΠΈΡ†ΠΈ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π°β€œ.

Π“Ρ€Π°Π½ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈΡ‚Π΅ са ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ Π½Π° React, ΠΊΠΎΠΈΡ‚ΠΎ улавят Π³Ρ€Π΅ΡˆΠΊΠΈ Π½Π° JavaScript навсякъдС Π² Π΄ΡŠΡ€Π²ΠΎΡ‚ΠΎ Π½Π° Ρ‚Π΅Ρ…Π½ΠΈΡ‚Π΅ Π΄ΡŠΡ‰Π΅Ρ€Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ, рСгистрират Ρ‚Π΅Π·ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΈ изобразяват Ρ€Π΅Π·Π΅Ρ€Π²Π΅Π½ потрСбитСлски интСрфСйс вмСсто Π΄ΡŠΡ€Π²ΠΎΡ‚ΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈΡ‚Π΅, ΠΊΠΎΠ΅Ρ‚ΠΎ сС Π΅ сбило. Π“Ρ€Π°Π½ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ улавят Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π΅Π½Π΄ΠΈΡ€Π°Π½Π΅, Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‚Π΅ Π½Π° ТизнСния Ρ†ΠΈΠΊΡŠΠ» ΠΈ Π² конструкторитС Π½Π° цялото Π΄ΡŠΡ€Π²ΠΎ ΠΏΠΎΠ΄ тях.

...

Ново ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π·Π° Π½Π΅ΠΎΡ‚ΠΊΡ€ΠΈΡ‚ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ

Π’Π°Π·ΠΈ промяна Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½Π°. ΠžΡ‚ React 16, Π³Ρ€Π΅ΡˆΠΊΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ са Π±ΠΈΠ»ΠΈ ΡƒΠ»ΠΎΠ²Π΅Π½ΠΈ ΠΎΡ‚ никоя Π³Ρ€Π°Π½ΠΈΡ†Π° Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ°, Ρ‰Π΅ Π΄ΠΎΠ²Π΅Π΄Π°Ρ‚ Π΄ΠΎ Π΄Π΅ΠΌΠΎΠ½Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° цялото Π΄ΡŠΡ€Π²ΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈΡ‚Π΅ Π½Π° React.

- Π”Π°Π½ Абрамов - ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π² React 16

Π’Π°ΠΆΠ½ΠΎ ΡƒΡ‚ΠΎΡ‡Π½Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΠΈ ΠΎΡ‚Π½Π΅ извСстно Π²Ρ€Π΅ΠΌΠ΅, ΠΏΡ€Π΅Π΄ΠΈ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π° Ρ‚ΠΎΠ²Π° Π΅ Ρ‚ΠΎΠ²Π° Π³ΠΎΡ€Π½ΠΎΡ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ само с Π³Ρ€Π΅ΡˆΠΊΠΈ, Ρ…Π²ΡŠΡ€Π»Π΅Π½ΠΈ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π·Π° Ρ€Π΅Π½Π΄ΠΈΡ€Π°Π½Π΅ (ΠΈΠ»ΠΈ ΠΏΠΎ-вСроятно Π² някой ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‚Π΅ Π½Π° ТизнСния Ρ†ΠΈΠΊΡŠΠ»). НапримСр, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π³Ρ€Π°Π½ΠΈΡ†ΠΈ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π° няма Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π΅ с нашия Π±ΡƒΡ‚ΠΎΠ½ Π³Ρ€Π΅ΡˆΠΊΠ°; Ρ‚Π°Π·ΠΈ Π³Ρ€Π΅ΡˆΠΊΠ° бСшС Π² ΠΌΠ°Π½ΠΈΠΏΡƒΠ»Π°Ρ‚ΠΎΡ€Π° Π½Π° кликванията.

НСка създадСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ° ΠΏΡ€ΠΈ Ρ€Π΅Π½Π΄ΠΈΡ€Π°Π½Π΅ ΠΈ слСд Ρ‚ΠΎΠ²Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π³Ρ€Π°Π½ΠΈΡ†ΠΈ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π°, Π·Π° Π΄Π° сС справим с Π³Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π° ΠΏΠΎ-Π΅Π»Π΅Π³Π°Π½Ρ‚Π½ΠΎ.

Ρ€Π΅Π°Π³ΠΈΡ€Π°Ρ‚-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅/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}
        >
          Render Error
        </button>
        { flag && <div>{flag.busted.bogus}</div> }
      </div>
    )
  }

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

НаблюдСниС:

  • ΠšΠΎΠ³Π°Ρ‚ΠΎ натиснСтС Π±ΡƒΡ‚ΠΎΠ½Π°, Π Π΅Π°Π³ΠΈΡ€Π°Ρ‚ Ρ‰Π΅ сС ΠΏΠΎΠΊΠ°ΠΆΠ΅ Ρ„Π»Π°Π³.Ρ€Π°Π·Π±ΠΈΡ‚.Ρ„Π°Π»ΡˆΠΈΠ², ΠΊΠΎΠ΅Ρ‚ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° Π³Ρ€Π΅ΡˆΠΊΠ°

  • Π‘Π΅Π· Π³Ρ€Π°Π½ΠΈΡ†Π° Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π° цялото Π΄ΡŠΡ€Π²ΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈΡ‚Π΅ Ρ‰Π΅ бъдС Π΄Π΅ΠΌΠΎΠ½Ρ‚ΠΈΡ€Π°Π½ΠΎ

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° пишСм нашия Π³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ ΠΊΠΎΠ΄ Π·Π° Π³Ρ€Π΅ΡˆΠΊΠ° (ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° новия ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π° ТизнСния Ρ†ΠΈΠΊΡŠΠ» componentDidCatch); Ρ‚ΠΎΠ²Π° ΠΏΠΎ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΠΎ Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΡŠΡ‚, Π΄Π°Π΄Π΅Π½ Π² статията Π½Π° Π”Π°Π½ Абрамов:

Ρ€Π΅Π°Π³ΠΈΡ€Π°Ρ‚-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅/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>Something went wrong.</h1>;
    }
    return this.props.children;
  }
}

Накрая ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚:

Ρ€Π΅Π°Π³ΠΈΡ€Π°Ρ‚-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅/src/App.js

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

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

Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Ρ‰Ρ€Π°ΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ Π²ΡŠΡ€Ρ…Ρƒ Π±ΡƒΡ‚ΠΎΠ½Π° Render Error ΠΏΠΎΠΊΠ°Π·Π²Π° рСзСрвния потрСбитСлски интСрфСйс ΠΈ ΡΡŠΠΎΠ±Ρ‰Π°Π²Π° Π·Π° Π³Ρ€Π΅ΡˆΠΊΠ° Π½Π° Sentry.

Дистанционно наблюдСниС Π½Π° бъговС Π² React frontend прилоТСния

Дистанционно наблюдСниС Π½Π° бъговС Π² React frontend прилоТСния

Π—Π°Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅

Надявам сС, Ρ‡Π΅ стС Π½Π°ΠΌΠ΅Ρ€ΠΈΠ»ΠΈ Ρ‚ΠΎΠ²Π° Π·Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎ.

PS Π›ΠΈΠ½ΠΊ към ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π°

PS Π§Π°Ρ‚ Π² Telegram Ρ‡Ρ€Π΅Π· Sentry https://t.me/sentry_ru

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€