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

и инициализируем его:

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

Байкоо:

  • Во время разработки у нас есть другие механизмы для наблюдения за проблемами, например консоль, поэтому мы включаем Sentry только для производственных сборок

Затем мы реализуем наши кнопки Hello и Error и добавляем их в приложение:

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 папки введите:

npx http-server -c-1

Проблема, с которой мы немедленно столкнемся, заключается в том, что записи об ошибке Sentry ссылаются на номера строк в уменьшенном пакете; не очень полезно.

React frontend тиркемелериндеги мүчүлүштүктөрдү алыстан көзөмөлдөө

Служба Sentry объясняет это, вытягивая исходные карты для уменьшенного пакета после получения ошибки. В этом случае мы бежим от localhost (недоступного службой Sentry).

Решения (Исходные Карты)

Решение этой проблемы сводится к запуску приложения с общедоступного веб-сервера. Одна простая кнопка ответа на него, чтобы использовать сервис GitHub Pages (бесплатно). Шаги для использования обычно следующие:

  1. Скопируйте содержимое папки куруу папкага Документтер в корневом каталоге репозитория.

  2. Күйгүзүү GitHub баракчалары в репозитории (из GitHub), чтобы использовать папку docs в кожоюн бутактары

  3. Перенесите изменения на GitHub

пикир: после того, как я понял, что мне нужно использовать create-create-app функция домашней страницы для запуска приложения. Сводилось к добавлению следующего к package.json:

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

Окончательная версия запущенного приложения доступна по адресу:

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

Иллюстрация Пойманных Ошибок

Давайте пройдем через нажатие кнопки Hello.

React frontend тиркемелериндеги мүчүлүштүктөрдү алыстан көзөмөлдөө

С ошибкой, появляющейся следующим образом:

React frontend тиркемелериндеги мүчүлүштүктөрдү алыстан көзөмөлдөө

Байкоо:

  • Этот отчет об ошибке не может быть более ясным, МЫКТЫ ЖАСАЛДЫ.

Иллюстрация Неучтенных Ошибок

Аналогично, давайте пройдем через нажатие кнопки ката.

React frontend тиркемелериндеги мүчүлүштүктөрдү алыстан көзөмөлдөө

С ошибкой, появляющейся следующим образом:

React frontend тиркемелериндеги мүчүлүштүктөрдү алыстан көзөмөлдөө

Лучшая обработка неучтенных ошибок (рендеринг)

Введение Границ Ошибок

Ошибка JavaScript в части пользовательского интерфейса не должна нарушать работу всего приложения. Чтобы решить эту проблему для пользователей React, React 16 вводит новое понятие "границы ошибок".

Границы ошибок – это компоненты React, которые ловят ошибки JavaScript в любом месте своего дочернего дерева компонентов, регистрируют эти ошибки и отображают резервный пользовательский интерфейс вместо дерева компонентов, которое разбилось. Границы ошибок улавливают ошибки во время рендеринга, в методах жизненного цикла и в конструкторах всего дерева под ними.

...

Новое поведение для необнаруженных ошибок

Это изменение имеет важное значение. Начиная с React 16, ошибки, которые не были пойманы какой-либо границей ошибок, приведут к размонтированию всего дерева компонентов React.

- Dan Abramov — Error Handling in React 16

Важное уточнение, которое заняло у меня некоторое время, прежде чем я понял это, заключается в том, что вышеупомянутое поведение работает только с ошибками, генерируемыми в методе рендеринга (или, что более вероятно, в любом из методов жизненного цикла). Например, использование границ ошибок не принесло бы никакой пользы с нашей кнопкой ката; эта ошибка была в обработчике щелчка.

Давайте создадим пример ошибки визуализации, а затем используем границы ошибок для более изящной обработки ошибки.

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

Байкоо:

  • При нажатии кнопки, иш-аракет кылгыла көрсөтүлөт flag.busted.bogus, которая порождает ошибку

  • Без границы ошибки все дерево компонентов будет размонтировано

Затем мы пишем наш код границы ошибки (использует новый метод жизненного цикла componentDidCatch); это, по сути, пример, приведенный в статье Дэна Абрамова:

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 отображает резервный пользовательский интерфейс и сообщает об ошибке Sentry.

React frontend тиркемелериндеги мүчүлүштүктөрдү алыстан көзөмөлдөө

React frontend тиркемелериндеги мүчүлүштүктөрдү алыстан көзөмөлдөө

айактоо

Надеюсь, вам было это полезно.

PS Ссылка на оригинал

P.S. Телеграм чат по Sentry https://t.me/sentry_ru

Source: www.habr.com

Комментарий кошуу