ααΎααααα»ααααααααααΆαααααΎααααΆαα Sentry ααΆαα½α Reactα
α’ααααααααααΊααΆααααααα½ααααααααΈαααα
αΆααααααΎαααΆαα½αααΉαααΆαααΆαααΆαααααα α»α Sentry αααααααΎα§ααΆα ααααα½αα
ααΆαα’αα»ααααααααα·αααα
ααααΌαααΎαααααΌααααααααααααα 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 αααα ααΎααααααααΆαααα αααα»ααααα»ααααααΆαααααα½αααΌα α αα·αααΆαααααααααααααΆααααΆααα
ααααΆ Sentry ααααααααΏαααααααααΆααααααΈααααααααααΆαααααα ααααααααΆααααααΆαααΆααααααααααααΆααααΈααα½αααΆαααα α»αα αααα»αααααΈαααααΎααααα»αααααΎαααΆαααΈ localhost (αα·αα’αΆα α αΌαααααΎααΆααααααααΆ Sentry)α
αααααααααΆα (αααααΈααααα)
αααααααααΆαα αααααααα αΆαααααΊααααΌαααααΎαααΆααααααα·ααΈααΈαααΆαααΈααααααααΆαααΆααΆαααα αααΌαα»αααααΎαααααααΆαααααα½αααΎααααΈααααΎααααΆααααααΆαααα GitHub Pages (α₯ααα·ααααα)α ααα αΆααααα»αααΆαααααΎααααΆααααΆααααααΆααΆαααΌα ααΆααααααα
-
α ααααααΆαα·ααΆααααα―αααΆα ααααΆαααΆ αα αα α―αααΆα αα αααα»ααα root ααααααΆααα
-
ααΎα α αααΈαα ααααααα αα αααα»αααααΆαα (ααΈ GitHub) ααΎααααΈααααΎααα―αααΆααα αααα»α αα ααΆααΆα
-
αααα»αααΆαααααΆααααααΌααα GitHub
ααΆαααααααααΆααα αααααΆααβααΈβαααα»αβααβααΎαβα’αααΈβαααβαααα»αβααααΌαβααααΎ αααααΎα-αααααΎα-αααααα·ααΈ αα»αααΆααααααααΎα ααΎααααΈααΎαααααΎαααΆααααααα·ααΈα ααΆαα α»αααααΎααααΈααααααααΌα ααΆαααααααα package.jsonα
"homepage": "https://larkintuckerllc.github.io/hello-sentry/"
ααααα α»αααααααααααααα·ααΈααααααα»αααααΎαααΆαααΆααα α
ααΌαααΆααα Caught Bugs
αααβα αΌαβαα βα α»α βαααΌαα»α Helloα
ααΆαα½αααΉαααα α»αααα α‘αΎαααΌα αααα
ααΆαααααααα
- αααΆαααΆαααααα α»αααααα·αα’αΆα α αααΆααααΆαααααα ααααα’αΌ.
ααΌαααΆααα Unaccounted αααααΆααααα α»α
ααΌα ααααΆααααααααΌαα αΌααα ααΆααααααΆαα α»α αααΌαα»α ααα α»ααααα»αααΆα.
ααΆαα½αααΉαααα α»αααα α‘αΎαααΌα αααα
ααΆαβαααααααΆαβααα α»αβαααβαα·αβααΆαβααααΈβααΆαβααα’βαααααΎα (ααΆαβαααα αΆαβ)
ααα ααααΈααααΎαααααααααααααα α»α
ααα α»α JavaScript αα αααα»ααααααααα ααα»α αααααΆααα’αααααααΎαα·ααα½αααααααααααα·ααΈααΆααααΌαααα ααΎααααΈαααααααΆααααα αΆααααααααΆααα’αααααααΎααααΆαα React React 16 ααααΆαααΌαααααααα·αααααΈα α ααΆ "error bounds"α
αααααααααα α»αααΊααΆαααΆαααΆαα» React αααα αΆααααα α»α JavaScript αααααααΈαααααααα αααα»ααααααΆααααΆαααΆαααΌααααααα½ααα αααααααΆααα α»αααΆααααα αα·ααααααΎα UI αααα½ααααα½ααααααΆααααΆαααΆααααααΆαααΆααα αααααααααα α»αα αΆααααα α»αααα‘α»αααααααα αΆα αα·ααΈααΆαααααααααααΈαα·α αα·ααα αααα»αα’αααααΆααααααΎαααΎααΆααααΌααα ααΆαααααααα½αααΆα
...
α₯αα·ααΆααααααΈαααααΆααααα α»αααααα·αααΆαααααΎα
ααΆαααααΆααααααΌααααααΊααααΆααα αα·αααααΉα React 16 ααα α»αααααα·αααααΌαααΆαα αΆααααΆαααααααααααααα α»αααΆαα½αααΉααααααΆαα±αααααααΆααααΆαααΆα React ααΆααααΌαααααΌαααΆαααα ααα
- Dan Abramov -
ααΆααααααααΆαααα α»ααααα»αααααα·αααα α‘α¦
ααΆαβαααααΆααβααβααααΆααβαα½αβαααβααΆαβα αααΆαβαααβαα½αβαααβαα»αβαααβαααα»αβααΉαβααΆβαααβααΆβααΏαβαααα α₯αα·ααΆααααΆαααΎααααΎαααΆαααααΆαα½αααα α»ααααααΆααααα αααα αααα»ααα·ααΈααΆααααααααα αΆα (α¬ααααααΆαα αααα»ααα·ααΈααΆαα½αααααααααΈαα·α). α§ααΆα ααα ααΆαααααΎβαααααααβααα α»αβααΉαβαα·αβααααΎβα’αααΈβααα’βααΆαα½αβααΉαβαααΌαα»αβααααβααΎαβααα ααα α»ααααα»αααΆα; ααα α»ααααααΊαα αααα»ααααααα·ααΈαααααααααααΆαα α»α α
ααααααααΎαα§ααΆα ααααααα αΆαααα α»α α αΎααααααΆααααααααΎαααααααααα α»α ααΎααααΈαααααααΆαααα α»αααΆααααααα’
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ααααααααΎαααα α»α
-
ααΎααααΆααααααααααα α»ααα αααααΆααααΆαααΆαααΆααααΌαααΉααα·αααααΌαααΆαααααΆαα
αααααΆααααααΎααααααααΌααααααααααα α»αααααααΎα (ααααΎαα·ααΈααΆαααααααααααΈαα·αααααΈα αααΆαααΆα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>
);
}
}
...
ααααααΆαααΆααααα ααΆαα α»α αααΌαα»α αααα αΆαααα α»ααααα αΆα UI αααααααααα·α α αΎαααΆαααΆαααααΈααα α»ααα Sentry α
ααΆααααα αα
αααα»ααααααΉαααΆα’αααααΆαααααΎαααΆααΆαααααααααα
PS
PS Telegram ααααααΆα Sentry
ααααα: www.habr.com