ΠΡΠΎΡΡΠ²Π°ΠΌΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Sentry Ρ React.
Π’Π°Π·ΠΈ ΡΡΠ°ΡΠΈΡ Π΅ ΡΠ°ΡΡ ΠΎΡ ΠΏΠΎΡΠ΅Π΄ΠΈΡΠ°, Π·Π°ΠΏΠΎΡΠ²Π°ΡΠ° Ρ Π΄ΠΎΠΊΠ»Π°Π΄Π²Π°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ Π½Π° Sentry, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΏΡΠΈΠΌΠ΅Ρ:
ΠΠ½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° 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 ΡΠ΅ ΠΎΡΠ½Π°ΡΡΡ Π΄ΠΎ Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° ΡΠ΅Π΄ΠΎΠ²Π΅ Π² ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ°Π½ΠΈΡ ΠΏΠ°ΠΊΠ΅Ρ; Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ.
Π£ΡΠ»ΡΠ³Π°ΡΠ° Sentry ΠΎΠ±ΡΡΠ½ΡΠ²Π° ΡΠΎΠ²Π°, ΠΊΠ°ΡΠΎ ΠΈΠ·ΡΠ΅Π³Π»Ρ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ ΠΊΠ°ΡΡΠΈ Π·Π° Π½Π°ΠΌΠ°Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΊΠ΅Ρ ΡΠ»Π΅Π΄ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠ°. Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΠ°Π±ΠΎΡΠΈΠΌ ΠΎΡ localhost (Π½Π΅ Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΎΡ ΡΡΠ»ΡΠ³Π°ΡΠ° Sentry).
Π Π΅ΡΠ΅Π½ΠΈΡ (ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ ΠΊΠ°ΡΡΠΈ)
Π Π΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΎΡ ΠΏΡΠ±Π»ΠΈΡΠ΅Π½ ΡΠ΅Π± ΡΡΡΠ²ΡΡ. ΠΠ΄ΠΈΠ½ ΠΏΡΠΎΡΡ Π±ΡΡΠΎΠ½ Π·Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡ, Π·Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΡΠ»ΡΠ³Π°ΡΠ° GitHub Pages (Π±Π΅Π·ΠΏΠ»Π°ΡΠ½ΠΎ). Π‘ΡΡΠΏΠΊΠΈΡΠ΅ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅:
-
ΠΠΎΠΏΠΈΡΠ°ΠΉΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΠ°ΠΏΠΊΠ°ΡΠ° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΊΡΠΌ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΈ Π² ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π½Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ.
-
ΠΠΊΠ»ΡΡΠΈ Π‘ΡΡΠ°Π½ΠΈΡΠΈ Π½Π° GitHub Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ (ΠΎΡ GitHub), Π·Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈ ΠΌΠ°ΠΉΡΡΠΎΡ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅
-
ΠΠ·ΠΏΡΠ°ΡΠ΅ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π² GitHub
ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΠ°Π·Π±ΡΠ°Ρ ΠΊΠ°ΠΊΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅-ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΡ Π·Π° Π½Π°ΡΠ°Π»Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ° Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. Π‘ΡΠΈΠ³Π½Π° ΡΠ΅ Π΄ΠΎ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ ΠΊΡΠΌ package.json:
"homepage": "https://larkintuckerllc.github.io/hello-sentry/"
ΠΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»Π½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° ΡΠ°Π±ΠΎΡΠ΅ΡΠΎΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΅ Π΄ΠΎΡΡΡΠΏΠ½Π° Π½Π°:
ΠΠ»ΡΡΡΡΠ°ΡΠΈΡ Π½Π° Ρ Π²Π°Π½Π°ΡΠΈ Π±ΡΠ³ΠΎΠ²Π΅
ΠΠ΅ΠΊΠ° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΏΡΠ΅Π· ΡΡΠ°ΠΊΠ²Π°Π½Π΅ΡΠΎ Π²ΡΡΡ Ρ Π±ΡΡΠΎΠ½Π° ΠΠ΄ΡΠ°Π²Π΅ΠΉ.
Π‘ Π³ΡΠ΅ΡΠΊΠ°, ΠΏΠΎΡΠ²ΡΠ²Π°ΡΠ° ΡΠ΅ ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½:
ΠΠ°Π±Π»ΡΠ΄Π΅Π½ΠΈΡ:
- Π’ΠΎΠ·ΠΈ Π΄ΠΎΠΊΠ»Π°Π΄ Π·Π° Π³ΡΠ΅ΡΠΊΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎ-ΡΡΠ΅Π½, BRAVO.
ΠΠ»ΡΡΡΡΠ°ΡΠΈΡ Π½Π° Π½Π΅ΠΎΡΡΠ΅ΡΠ΅Π½ΠΈ Π³ΡΠ΅ΡΠΊΠΈ
ΠΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½ Π½Π΅ΠΊΠ° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΏΡΠ΅Π· ΡΡΠ°ΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π±ΡΡΠΎΠ½Π° Π³ΡΠ΅ΡΠΊΠ°.
Π‘ Π³ΡΠ΅ΡΠΊΠ°, ΠΏΠΎΡΠ²ΡΠ²Π°ΡΠ° ΡΠ΅ ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½:
ΠΠΎ-Π΄ΠΎΠ±ΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ Π½Π° Π½Π΅ΠΎΡΡΠ΅ΡΠ΅Π½ΠΈ Π³ΡΠ΅ΡΠΊΠΈ (ΡΠ΅Π½Π΄ΠΈΡΠ°Π½Π΅)
ΠΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π³ΡΠ°Π½ΠΈΡΠΈ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ
ΠΡΠ΅ΡΠΊΠ° Π² 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.
ΠΠ°Π²ΡΡΡΠ²Π°Π½Π΅
ΠΠ°Π΄ΡΠ²Π°ΠΌ ΡΠ΅, ΡΠ΅ ΡΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈΠ»ΠΈ ΡΠΎΠ²Π° Π·Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎ.
PS
PS Π§Π°Ρ Π² Telegram ΡΡΠ΅Π· Sentry
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com