Մենք ուսումնասիրում ենք Sentry-ի օգտագործումը React-ի հետ:

Այս հոդվածը մի շարքի մի մասն է, որը սկսվում է Sentry-ի սխալների մասին հաղորդումով՝ օգտագործելով օրինակը. .
React Implementation
Սկզբում մենք պետք է ավելացնենք նոր 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://303c04eac89844b5bfc908ceffc6757c@sentry.io/1289887',
release: RELEASE,
});
}
...
Դիտարկումներ:
- Մշակման ընթացքում մենք ունենք խնդիրների վերահսկման այլ մեխանիզմներ, ինչպիսիք են վահանակը, այնպես որ մենք միացնում ենք 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 թղթապանակից մուտքագրեք.
npx http-server -c-1
Խնդիրը, որին մենք անմիջապես հանդիպում ենք, այն է, որ Sentry-ի սխալը գրանցում է հղման տողերի համարները նվազագույն փաթեթում; ոչ շատ օգտակար:

Sentry ծառայությունը հաշվի է առնում դա՝ սխալ ստանալուց հետո սկզբնաղբյուր քարտերը քաշելով կրճատված փաթեթի համար: Այս դեպքում մենք աշխատում ենք localhost-ից (հասանելի չէ Sentry ծառայության կողմից):
Լուծումներ (աղբյուրային քարտեր)
Այս խնդրի լուծումը վերաբերում է հավելվածը հանրային վեբ սերվերից գործարկելուն: Մեկ պարզ պատասխանի կոճակ՝ GitHub Pages ծառայությունից օգտվելու համար (անվճար): Օգտագործման քայլերը սովորաբար հետևյալն են.
-
Պատճենեք թղթապանակի բովանդակությունը կառուցել դեպի թղթապանակ Docs պահոցի արմատային գրացուցակում:
-
Միացնել GitHub Էջեր պահոցում (GitHub-ից)՝ փաստաթղթերի թղթապանակն օգտագործելու համար վարպետ մասնաճյուղերը
-
Տեղադրեք ձեր փոփոխությունները GitHub-ում
ՆշումԱյն բանից հետո, երբ հասկացա, որ պետք է օգտագործել ստեղծել-ստեղծել-հավելված Գլխավոր էջի գործառույթը հավելվածը գործարկելու համար: Այն հանգեցրեց հետևյալն ավելացնելով package.json-ին.
"homepage": "https://larkintuckerllc.github.io/hello-sentry/"
Գործարկված հավելվածի վերջնական տարբերակը հասանելի է հետևյալ հասցեով՝
Բռնված սխալների նկարազարդում
Եկեք անցնենք Բարև կոճակի սեղմման միջոցով:

Սխալով, որը հայտնվում է հետևյալ կերպ.

Դիտարկումներ:
- Այս վրիպակի հաշվետվությունը չէր կարող ավելի պարզ լինել, ԲՐԱՎՈ.
Չհաշվառված սխալների նկարազարդում
Նմանապես, եկեք անցնենք կոճակի սեղմման միջոցով սխալ.

Սխալով, որը հայտնվում է հետևյալ կերպ.

Չհաշվառված սխալների ավելի լավ կառավարում (արտադրում)
Ներկայացնելով սխալների սահմանները
Օգտագործողի միջերեսի մի մասում JavaScript-ի սխալը չպետք է խախտի ամբողջ հավելվածի ֆունկցիոնալությունը: React-ի օգտատերերի համար այս խնդիրը լուծելու համար React 16-ը ներկայացնում է նոր հայեցակարգ, որը կոչվում է «սխալների սահմաններ»:
Սխալների սահմանները React բաղադրիչներն են, որոնք բռնում են JavaScript-ի սխալները իրենց երեխայի բաղադրիչ ծառի ցանկացած կետում, գրանցում այդ սխալները և վերադարձնում UI-ն այն բաղադրիչի ծառի փոխարեն, որը խափանվել է: Սխալների սահմանները հայտնաբերում են սխալները մատուցման ժամանակ, կյանքի ցիկլի մեթոդներում և դրանց տակ գտնվող ծառի կոնստրուկտորներում:
...
Նոր վարքագիծ չբացահայտված սխալների համար
Այս փոփոխությունը նշանակալի է. Սկսած React 16-ից, սխալները, որոնք չեն հայտնաբերվում որևէ սխալի սահմանով, կհանգեցնեն նրան, որ ամբողջ React բաղադրիչի ծառը ապամոնտաժվի:
- Դեն Աբրամով -
Կարևոր պարզաբանում, որն ինձ որոշ ժամանակ պահանջեց պարզելու համար, դա է վերը նշված վարքագիծն աշխատում է միայն ռենդերային մեթոդում (կամ ավելի հավանական է կյանքի ցիկլի ցանկացած եղանակով) սխալներով:. Օրինակ, սխալի սահմանների օգտագործումը ոչ մի լավ բան չի տա մեր կոճակի հետ սխալ; այս սխալը եղել է սեղմման կարգավորիչում:
Եկեք ստեղծենք վիզուալիզացիայի սխալի օրինակ, այնուհետև օգտագործենք սխալի սահմանները՝ սխալն ավելի նրբագեղ կարգավորելու համար:
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,
});
}
}
Դիտարկում:
-
Երբ սեղմում եք կոճակը, Արձագանքել կցուցադրվի դրոշ.փշրված.կեղծ, որը առաջացնում է սխալ
-
Առանց սխալի սահմանի, ամբողջ բաղադրիչ ծառը կհեռացվի:
Այնուհետև մենք գրում ենք մեր սխալի սահմանային կոդը (օգտագործում է կյանքի ցիկլի նոր մեթոդը բաղադրիչDidCatch); Դա, ըստ էության, օրինակ է բերված Դեն Աբրամովի հոդվածում.
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-ի սխալը:


Ավարտում
Հուսով եմ, որ սա օգտակար է ձեզ համար:
PS
P.S. Telegram զրույցը Sentry-ում
Source: www.habr.com
