เบเบงเบเปเบฎเบปเบฒเบเปเบฒเบฅเบฑเบเบเบปเปเบเบซเบฒเบเบฒเบเบเปเบฒเปเบเป Sentry เบเบฑเบ React.
เบเบปเบเบเบงเบฒเบกเบเบตเปเปเบกเปเบเบชเปเบงเบเบซเบเบถเปเบเบเบญเบเบเบธเบเบเบตเปเปเบฅเบตเปเบกเบเบปเปเบเบเปเบงเบเบเบฒเบเบฅเบฒเบเบเบฒเบเบเบงเบฒเบกเบเบดเบเบเบฒเบ Sentry เปเบเบเปเบเปเบเบปเบงเบขเปเบฒเบ:
เบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบฐเบเบดเบเบดเบฅเบดเบเบฒ
เบเปเบฒเบญเบดเบเบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเปเบเบตเปเบกเปเบเบเบเบฒเบ 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 เบญเบฐเบเบดเบเบฒเบเปเบฅเบทเปเบญเบเบเบตเปเปเบเบเบเบฒเบเบเบถเบเปเบเบเบเบตเปเปเบซเบผเปเบเบชเปเบฒเบฅเบฑเบเปเบเบฑเบเปเบเบฑเบเบเบตเปเบซเบผเบธเบเบฅเบปเบเบซเบผเบฑเบเบเบฒเบเปเบเปเบฎเบฑเบเบเปเปเบเบดเบเบเบฒเบ. เปเบเบเปเบฅเบฐเบเบตเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเบฒเบฅเบฑเบเปเบฅเปเบเบเบฒเบ localhost (เบเปเปเบชเบฒเบกเบฒเบเปเบเบปเปเบฒเปเบเบดเบเปเบเปเปเบเบเบเปเบฅเบดเบเบฒเบ Sentry).
เบงเบดเบเบตเปเบเปเปเบ (เปเบเบเบเบตเปเปเบซเบผเปเบเบเปเปเบกเบนเบ)
เบเบฒเบเปเบเปเปเบเบเบฑเบเบซเบฒเบเบตเปเปเบกเปเบเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบเบเบฒเบเปเบเบทเปเบญเบเปเบกเปเบเปเบฒเบเปเบงเบฑเบเปเบเบเปเบชเบฒเบเบฒเบฅเบฐเบเบฐ. เบเบธเปเบกเบเบญเบเบเบฑเบเบเปเบฒเบเปเบญเบฑเบเบเบฝเบงเปเบเบทเปเบญเปเบเปเบเปเบฅเบดเบเบฒเบ GitHub Pages (เบเบฃเบต). เบเบฑเปเบโเบเบญเบโเบเบฒเบโเบเปเบฒโเปเบเปโเปเบกเปเบโเบเบปเบโเบเบฐโเบเบดโเบเบฑเปเบโเบเปเปโเปเบโเบเบตเปโ:
-
เบเบฑเบเบฅเบญเบเปเบเบทเปเบญเปเบเบเบญเบเปเบเบเปเบเบต เบเบฒเบเบเปเปเบชเปเบฒเบ เปเบเบซเบฒเปเบเบเปเบเบต เปเบญเบเบฐเบชเบฒเบ เปเบเปเบเปเบฅเบเบฐเบเปเบฅเบตเบฎเบฒเบเบเบญเบ repository.
-
เปเบเบตเบ เปเปเบฒ GitHub เบขเบนเปเปเบเบเปเบญเบเปเบเบฑเบเบกเปเบฝเบ (เบเบฒเบ GitHub) เปเบเบทเปเบญเปเบเปเปเบเปเบเบต docs เปเบ เบเบปเปเบเบชเบฐเบเบฑเบ เบชเบฒเบเบฒ
-
เบเบธเบเบเบนเปเบเบฒเบเบเปเบฝเบเปเบเบเปเบเบซเบฒ GitHub
ะัะธะผะตัะฐะฝะธะต: เบซเบผเบฑเบเบเบฒเบเบเบตเปเบเปเบญเบเบเบดเบเบญเบญเบเบชเบดเปเบเบเบตเปเบเปเบญเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเป create-create-app เบเบฑเบเบเบฑเบเปเปเบฒเบซเบผเบฑเบเปเบเบทเปเบญเปเบเบตเบเปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบ. เบฅเบปเบเบกเบฒเปเบเบทเปเบญเปเบเบตเปเบกเบชเบดเปเบเบเปเปเปเบเบเบตเปเปเบชเป package.json:
"homepage": "https://larkintuckerllc.github.io/hello-sentry/"
เปเบงเบตเบเบฑเปเบเบชเบธเบเบเปเบฒเบเบเบญเบเปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบเบเบตเปเปเบฎเบฑเบเบงเบฝเบเปเบกเปเบเบกเบตเบขเบนเป:
เบเบฒเบเบเบฐเบเบญเบเบเบญเบเปเบกเบเปเบกเปเบเบตเปเบเบฑเบเปเบเป
เบเปเบฒเบเปเบเปเบเบเบเบฒเบเบเบฅเบดเบเบเบธเปเบกเบชเบฐเบเบฒเบเบเบต.
เบกเบตโเบเบงเบฒเบกโเบเบดเบโเบเบฒเบโเบเบฐโเบเบปเบโเบงเปเบฒโเบเบฑเปเบโเบเบตเปโ:
เบเปเปเบชเบฑเบเปเบเบ:
- เบฅเบฒเบเบเบฒเบเบเปเปเบเบดเบเบเบฒเบเบเบตเปเบเปเปเบชเบฒเบกเบฒเบเบเบฐเปเบเปเบเบเบงเปเบฒ, เบเบฃเบฒเปเบง.
เบฎเบนเบเบเบฐเบเบญเบเบเบญเบ Unaccounted เบชเปเบฒเบฅเบฑเบเบเบงเบฒเบกเบเบดเบเบเบฒเบ
เปเบเบฑเปเบเบเบฝเบงเบเบฑเบ, เปเบซเปเปเบเปเบเบเบเปเบฒเบเบเบฒเบเบเบฅเบดเบเบเบธเปเบก Error.
เบกเบตโเบเบงเบฒเบกโเบเบดเบโเบเบฒเบโเบเบฐโเบเบปเบโเบงเปเบฒโเบเบฑเปเบโเบเบตเปโ:
เบเบฒเบโเบเบฑเบโเบเบฒเบโเบเบตเปโเบเบตเบโเบงเปเบฒโเบเบญเบโเบเบงเบฒเบกโเบเบดเบโเบเบฒเบโเบเบตเปโเบเปเปโเปเบเปโเบเบฑเบโเบเบต (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.
เบเบฒเบเบชเปเบฒเปเบฅเบฑเบ
เบเปเบญเบเบซเบงเบฑเบเบงเปเบฒเปเบเบปเปเบฒเบเบปเบเบงเปเบฒเบญเบฑเบเบเบตเปเปเบเบฑเบเบเบฐเปเบซเบเบ.
PS
PS Telegram เบชเบปเบเบเบฐเบเบฒเบเปเบฒเบ Sentry
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com