Sentry เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบ—เบฒเบ‡เป„เบเปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ React frontend

เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบ„เบปเป‰เบ™เบซเบฒเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Sentry เบเบฑเบš React.

Sentry เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบ—เบฒเบ‡เป„เบเปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ React frontend

เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เปเบกเปˆเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบŠเบธเบ”เบ—เบตเปˆเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเบเบฒเบ™เบฅเบฒเบเบ‡เบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ” Sentry เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡: เบชเปˆเบงเบ™ 1.

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ›เบฐเบ•เบดเบเบดเบฅเบดเบเบฒ

เบ—เปเบฒเบญเบดเบ”เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เป€เบžเบตเปˆเบกเป‚เบ„เบ‡เบเบฒเบ™ Sentry เปƒเบซเบกเปˆเบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ™เบตเป‰; เบˆเบฒเบเป€เบงเบฑเบšเป„เบŠเบ—เปŒ Sentry. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบทเบญเบ React.

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบชเบญเบ‡เบ›เบธเปˆเบกเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบชเบฐเบšเบฒเบเบ”เบตเปเบฅเบฐเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”, เปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเบกเบต React. เบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป‚เบ”เบเบเบฒเบ™เบชเป‰เบฒเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

npx create-react-app react-app

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบ™เปเบฒเป€เบ‚เบปเป‰เบฒเบŠเบธเบ” Sentry:

yarn add @sentry/browser

เปเบฅเบฐโ€‹เป€เบฅเบตเปˆเบกโ€‹เบ•เบปเป‰เบ™โ€‹เบกเบฑเบ™โ€‹:

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://[email protected]/1289887',
    release: RELEASE,
  });
}
...

เบ‚เปเป‰เบชเบฑเบ‡เป€เบเบ”:

  • เปƒเบ™โ€‹เบฅเบฐโ€‹เบซเบงเปˆเบฒเบ‡โ€‹เบเบฒเบ™โ€‹เบžเบฑเบ”โ€‹เบ—เบฐโ€‹เบ™เบฒโ€‹, เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบกเบตโ€‹เบเบปเบ™โ€‹เป„เบโ€‹เบญเบทเปˆเบ™เป†โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ•เบดเบ”โ€‹เบ•เบฒเบกโ€‹เบšเบฑเบ™โ€‹เบซเบฒโ€‹, เป€เบŠเบฑเปˆเบ™โ€‹: consoleโ€‹, เบ”เบฑเปˆเบ‡โ€‹เบ™เบฑเป‰เบ™โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เป€เบ›เบตเบ” Sentry เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบœเบฐโ€‹เบฅเบดเบ”โ€‹เบเบฒเบ™โ€‹เบœเบฐโ€‹เบฅเบดเบ”โ€‹.

เบ•เปเปˆเป„เบ›, เบžเบงเบเป€เบฎเบปเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เบ›เบธเปˆเบกเบชเบฐเบšเบฒเบเบ”เบตเปเบฅเบฐเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบฅเบฐเป€เบžเบตเปˆเบกเปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ:

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

react-app/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');
  }
}

react-app/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

เปเบฅเบฐเบˆเบฒเบ build folder เปƒเบชเปˆ:

npx http-server -c-1

เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเปเบฅเปˆเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ—เบฑเบ™เบ—เบตเปเบกเปˆเบ™เบงเปˆเบฒเบšเบฑเบ™เบ—เบถเบเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ‚เบญเบ‡ Sentry เบซเบกเบฒเบเป€เบ–เบดเบ‡เบ•เบปเบงเป€เบฅเบเปเบ–เบงเปƒเบ™ batch เบซเบเปเป‰; เบšเปเปˆเบกเบตเบ›เบฐเป‚เบซเบเบ”เบซเบผเบฒเบ.

Sentry เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบ—เบฒเบ‡เป„เบเปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ React frontend

เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ Sentry เบญเบฐเบ—เบดเบšเบฒเบเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เป‚เบ”เบเบเบฒเบ™เบ”เบถเบ‡เปเบœเบ™เบ—เบตเปˆเปเบซเบผเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเบซเบผเบธเบ”เบฅเบปเบ‡เบซเบผเบฑเบ‡เบˆเบฒเบเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เปเบฅเปˆเบ™เบˆเบฒเบ localhost (เบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰เป‚เบ”เบเบšเปเบฅเบดเบเบฒเบ™ Sentry).

เบงเบดเบ—เบตเปเบเป‰เป„เบ‚ (เปเบœเบ™เบ—เบตเปˆเปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™)

เบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเป„เบŠเบ•เปŒเบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐ. เบ›เบธเปˆเบกเบ•เบญเบšเบเบฑเบšเบ‡เปˆเบฒเบเป†เบญเบฑเบ™เบ”เบฝเบงเป€เบžเบทเปˆเบญเปƒเบŠเป‰เบšเปเบฅเบดเบเบฒเบ™ GitHub Pages (เบŸเบฃเบต). เบ‚เบฑเป‰เบ™โ€‹เบ•เบญเบ™โ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เปเบกเปˆเบ™โ€‹เบ›เบปเบโ€‹เบเบฐโ€‹เบ•เบดโ€‹เบ”เบฑเปˆเบ‡โ€‹เบ•เปเปˆโ€‹เป„เบ›โ€‹เบ™เบตเป‰โ€‹:

  1. เบ„เบฑเบ”เบฅเบญเบเป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เป‚เบŸเบ™เป€เบ”เบต เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ เป„เบ›เบซเบฒเป‚เบŸเบ™เป€เบ”เบต เป€เบญเบเบฐเบชเบฒเบ™ เปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบฎเบฒเบเบ‚เบญเบ‡ repository.

  2. เป€เบ›เบตเบ” เปœเป‰เบฒ GitHub เบขเบนเปˆเปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™ (เบˆเบฒเบ GitHub) เป€เบžเบทเปˆเบญเปƒเบŠเป‰เป‚เบŸเป€เบ”เบต docs เปƒเบ™ เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš เบชเบฒเบ‚เบฒ

  3. เบŠเบธเบเบเบนเป‰เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป„เบ›เบซเบฒ GitHub

ะŸั€ะธะผะตั‡ะฐะฝะธะต: เบซเบผเบฑเบ‡เบˆเบฒเบเบ—เบตเปˆเบ‚เป‰เบญเบเบ„เบดเบ”เบญเบญเบเบชเบดเปˆเบ‡เบ—เบตเปˆเบ‚เป‰เบญเบเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบŠเป‰ create-create-app เบŸเบฑเบ‡เบŠเบฑเบ™เปœเป‰เบฒเบซเบผเบฑเบเป€เบžเบทเปˆเบญเป€เบ›เบตเบ”เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™. เบฅเบปเบ‡เบกเบฒเป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเบชเบดเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰เปƒเบชเปˆ package.json:

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

เป€เบงเบตเบŠเบฑเปˆเบ™เบชเบธเบ”เบ—เป‰เบฒเบเบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเปเบกเปˆเบ™เบกเบตเบขเบนเปˆ:

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

เบžเบฒเบšเบ›เบฐเบเบญเบšเบ‚เบญเบ‡เปเบกเบ‡เป„เบกเป‰เบ—เบตเปˆเบˆเบฑเบšเป„เบ”เป‰

เบเปˆเบฒเบ‡เป„เบ›เป‚เบ”เบเบเบฒเบ™เบ„เบฅเบดเบเบ›เบธเปˆเบกเบชเบฐเบšเบฒเบเบ”เบต.

Sentry เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบ—เบฒเบ‡เป„เบเปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ React frontend

เบกเบตโ€‹เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹เบ›เบฐโ€‹เบเบปเบ”โ€‹เบงเปˆเบฒโ€‹เบ”เบฑเปˆเบ‡โ€‹เบ™เบตเป‰โ€‹:

Sentry เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบ—เบฒเบ‡เป„เบเปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ React frontend

เบ‚เปเป‰เบชเบฑเบ‡เป€เบเบ”:

  • เบฅเบฒเบเบ‡เบฒเบ™เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบ™เบตเป‰เบšเปเปˆเบชเบฒเบกเบฒเบ”เบˆเบฐเปเบˆเป‰เบ‡เบเบงเปˆเบฒ, เบšเบฃเบฒเป‚เบง.

เบฎเบนเบšเบ›เบฐเบเบญเบšเบ‚เบญเบ‡ Unaccounted เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”

เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™, เปƒเบซเป‰เป„เบ›เป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เบ„เบฅเบดเบเบ›เบธเปˆเบก Error.

Sentry เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบ—เบฒเบ‡เป„เบเปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ React frontend

เบกเบตโ€‹เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹เบ›เบฐโ€‹เบเบปเบ”โ€‹เบงเปˆเบฒโ€‹เบ”เบฑเปˆเบ‡โ€‹เบ™เบตเป‰โ€‹:

Sentry เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบ—เบฒเบ‡เป„เบเปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ React frontend

เบเบฒเบ™โ€‹เบˆเบฑเบ”โ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบ”เบตเบโ€‹เบงเปˆเบฒโ€‹เบ‚เบญเบ‡โ€‹เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹เบ—เบตเปˆโ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบšเบฑเบ™โ€‹เบŠเบต (renderingโ€‹)

เบเบฒเบ™เปเบ™เบฐเบ™เบณเบ‚เปเป‰เบˆเบณเบเบฑเบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”

เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบ‚เบญเบ‡ JavaScript เปƒเบ™เบชเปˆเบงเบ™เบ‚เบญเบ‡เบชเปˆเบงเบ™เบ•เบดเบ”เบ•เปเปˆเบœเบนเป‰เปƒเบŠเป‰เบšเปเปˆเบ„เบงเบ™เบ—เปเบฒเบฅเบฒเบเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”. เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เปƒเบŠเป‰ React, React 16 เปเบ™เบฐเบ™เปเบฒเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เปƒเบซเบกเปˆเบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒ "error bounds".

เบ‚เบญเบšเป€เบ‚เบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปเบกเปˆเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบš React เบ—เบตเปˆเบˆเบฑเบšเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบ‚เบญเบ‡ JavaScript เบขเบนเปˆเบ—เบธเบเบšเปˆเบญเบ™เปƒเบ™เบ•เบปเป‰เบ™เป„เบกเป‰เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบฅเบนเบเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ, เบšเบฑเบ™เบ—เบถเบเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™, เปเบฅเบฐเบชเบฐเปเบ”เบ‡ UI เบเบฑเบšเบ„เบทเบ™เปเบ—เบ™เบ•เบปเป‰เบ™เป„เบกเป‰เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆ crashed. เบ‚เบญเบšเป€เบ‚เบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบˆเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบœเบปเบ™, เปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™ lifecycle, เปเบฅเบฐเปƒเบ™เบœเบนเป‰เบเปเปˆเบชเป‰เบฒเบ‡เบ•เบปเป‰เบ™เป„เบกเป‰เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰.

...

เบžเบถเบ”เบ•เบดเบเปเบฒเปƒเบซเบกเปˆเบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบเบงเบ”เบžเบปเบš

เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ™เบตเป‰เปเบกเปˆเบ™เบชเปเบฒเบ„เบฑเบ™. เปƒเบ™เบ–เบฒเบ™เบฐเป€เบ›เบฑเบ™เบ‚เบญเบ‡ React 16, เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบˆเบฑเบšเป‚เบ”เบเบ‚เบญเบšเป€เบ‚เบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ”เป†เบˆเบฐเบชเบปเปˆเบ‡เบœเบปเบ™เปƒเบซเป‰เบ•เบปเป‰เบ™เป„เบกเป‰เบญเบปเบ‡เบ›เบฐเบเบญเบš React เบ—เบฑเบ‡เบซเบกเบปเบ”เบ–เบทเบเบเบปเบเป€เบฅเบตเบ.

- Dan Abramov - เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™ React 16

เบ„เบงเบฒเบกเบเบฐเบˆเปˆเบฒเบ‡เปเบˆเป‰เบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เบ‚เป‰เบญเบเปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบ™เบถเปˆเบ‡เบเปˆเบญเบ™เบ—เบตเปˆเบ‚เป‰เบญเบเบˆเบฐเบฎเบนเป‰เบงเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ™เบฑเป‰เบ™ เบžเบถเบ”เบ•เบดเบเปเบฒเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบ™เบตเป‰เบžเบฝเบ‡เปเบ•เปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบ–เบดเป‰เบกเปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™ render (เบซเบผเบทเบญเบฒเบ”เบˆเบฐเบซเบผเบฒเบเบเบงเปˆเบฒเปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™ lifecycle เปƒเบ”). เบ•เบปเบงเบขเปˆเบฒเบ‡, เบเบฒเบ™เปƒเบŠเป‰เบ‚เบญเบšเป€เบ‚เบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบˆเบฐเบšเปเปˆเป€เบฎเบฑเบ”เบ”เบตเบเบฑเบšเบ›เบธเปˆเบกเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ Error; เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ™เบตเป‰เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบ„เบฅเบดเบ.

เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡ render error เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เปƒเบŠเป‰ error bounds เป€เบžเบทเปˆเบญเบˆเบฑเบ”เบเบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เป„เบ”เป‰เบขเปˆเบฒเบ‡เบชเบฐเบซเบ‡เปˆเบฒเบ‡เบฒเบก.

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}
        >
          Render Error
        </button>
        { flag && <div>{flag.busted.bogus}</div> }
      </div>
    )
  }

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

เบเบฒเบ™เบชเบฑเบ‡เป€เบเบ”:

  • เป€เบกเบทเปˆเบญเบ—เปˆเบฒเบ™เบเบปเบ”เบ›เบธเปˆเบก, React เบˆเบฐเบ–เบทเบเบชเบฐเปเบ”เบ‡ flag.busted.bogus, เป€เบŠเบดเปˆเบ‡เบชเป‰เบฒเบ‡เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”

  • เบ–เป‰เบฒเบšเปเปˆเบกเบตเบ‚เบญเบšเป€เบ‚เบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”, เบ•เบปเป‰เบ™เป„เบกเป‰เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบฑเบ‡เปเบปเบ”เบˆเบฐเบ–เบทเบเบ–เบญเบ™เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เบ‚เบญเบšเป€เบ‚เบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ (เปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™ lifecycle เปƒเบซเบกเปˆ เบชเปˆเบงเบ™เบ›เบฐเบเบญเบšDidCatch); เบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ‚เบญเบ‡ Dan Abramov:

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>Something went wrong.</h1>;
    }
    return this.props.children;
  }
}

เบชเบธเบ”เบ—เป‰เบฒเบเบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ™เบตเป‰:

react-app/src/App.js

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

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

เปเบ™เบงเปƒเบ”เบเปเปˆเบ•เบฒเบก, เบเบฒเบ™เบ„เบฅเบดเบเบ›เบธเปˆเบก Render Error เบชเบฐเปเบ”เบ‡ UI เบชเบณเบฎเบญเบ‡ เปเบฅเบฐเบฅเบฒเบเบ‡เบฒเบ™เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบ•เปเปˆเบเบฑเบš Sentry.

Sentry เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบ—เบฒเบ‡เป„เบเปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ React frontend

Sentry เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบ—เบฒเบ‡เป„เบเปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ React frontend

เบเบฒเบ™เบชเปเบฒเป€เบฅเบฑเบ”

เบ‚เป‰เบญเบเบซเบงเบฑเบ‡เบงเปˆเบฒเป€เบˆเบปเป‰เบฒเบžเบปเบšเบงเปˆเบฒเบญเบฑเบ™เบ™เบตเป‰เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”.

PS เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš

PS Telegram เบชเบปเบ™เบ—เบฐเบ™เบฒเบœเปˆเบฒเบ™ Sentry https://t.me/sentry_ru

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™