ã«ã¹ã¿ã ããã¯ãšãšã©ãŒå¢çã䜿çšããŠãReactã¢ããªã±ãŒã·ã§ã³ã§ãšã©ãŒã广çã«åŠçããã³äŒæãããªãœãŒã¹èªã¿èŸŒã¿ã®å€±ææã§ãå ç¢ã§ãŠãŒã¶ãŒãã¬ã³ããªãŒãªãšã¯ã¹ããªãšã³ã¹ã確ä¿ããæ¹æ³ãåŠã³ãŸãã
React use Hookãšã©ãŒäŒæïŒãªãœãŒã¹èªã¿èŸŒã¿ãšã©ãŒãã§ãŒã³ã®ãã¹ã¿ãŒ
ææ°ã®Reactã¢ããªã±ãŒã·ã§ã³ã¯ãããŸããŸãªãœãŒã¹ïŒAPIãããŒã¿ããŒã¹ãããŒã«ã«ã¹ãã¬ãŒãžãªã©ïŒããããŒã¿ããã§ããããããšã«äŸåããããšããããããŸãããããã®ãªãœãŒã¹èªã¿èŸŒã¿æäœã倱æããå Žåããšã©ãŒãé©åã«åŠçãããŠãŒã¶ãŒã«æå³ã®ãããšã¯ã¹ããªãšã³ã¹ãæäŸããããšãéèŠã§ãããã®èšäºã§ã¯ãã«ã¹ã¿ã ããã¯ããšã©ãŒå¢çãããã³å ç¢ãªãšã©ãŒåŠçæŠç¥ã䜿çšããŠãReactã¢ããªã±ãŒã·ã§ã³ã§ãšã©ãŒã广çã«ç®¡çããã³äŒæããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ãšã©ãŒäŒæã®èª²é¡ãçè§£ãã
äžè¬çãªReactã³ã³ããŒãã³ãããªãŒã§ã¯ãããŸããŸãªã¬ãã«ã§ãšã©ãŒãçºçããå¯èœæ§ããããŸããããŒã¿ããã§ããããã³ã³ããŒãã³ãã¯ããããã¯ãŒã¯ãšã©ãŒãè§£æãšã©ãŒããŸãã¯æ€èšŒãšã©ãŒã«ééããå¯èœæ§ããããŸããçæ³çã«ã¯ããããã®ãšã©ãŒããã£ããããŠé©åã«åŠçããå¿ èŠããããŸããããšã©ãŒãçºçããã³ã³ããŒãã³ãã§ãšã©ãŒãåã«ãã°ã«èšé²ããã ãã§ã¯äžååãªããšããããããŸããç§ãã¡ã¯æ¬¡ã®ããã®ã¡ã«ããºã ãå¿ èŠã§ãã
- ãšã©ãŒãäžå€®ã®å Žæã«å ±åããïŒããã«ããããã®ã³ã°ãåæãããã³æœåšçãªå詊è¡ãå¯èœã«ãªããŸãã
- ãŠãŒã¶ãŒãã¬ã³ããªãŒãªãšã©ãŒã¡ãã»ãŒãžã衚瀺ããïŒ å£ããUIã®ä»£ããã«ãåé¡ã«ã€ããŠãŠãŒã¶ãŒã«éç¥ããèãããã解決çãææ¡ããŸãã
- ã«ã¹ã±ãŒããšã©ãŒãé²ãïŒ1ã€ã®ã³ã³ããŒãã³ãã®ãšã©ãŒãã¢ããªã±ãŒã·ã§ã³å šäœãã¯ã©ãã·ã¥ãããã¹ãã§ã¯ãããŸããã
ããããšã©ãŒäŒæãç»å Žããå Žæã§ãããšã©ãŒäŒæã«ã¯ããšã©ãŒãã³ã³ããŒãã³ãããªãŒãäžæ¹åã«æž¡ãããé©åãªãšã©ãŒåŠçå¢çã«å°éãããŸã§ãå«ãŸããŸãã Reactã®ãšã©ãŒå¢çã¯ãã¬ã³ããªã³ã°äžãã©ã€ããµã€ã¯ã«ã¡ãœãããããã³åã³ã³ããŒãã³ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒäžã«çºçãããšã©ãŒããã£ããããããã«èšèšãããŠããŸãããuseEffectã«ãã£ãŠããªã¬ãŒããããã®ãªã©ã®éåææäœå
ã§ã¹ããŒããããšã©ãŒãæ¬è³ªçã«åŠçããŸãããããããã«ã¹ã¿ã ããã¯ãã®ã£ãããåããããšãã§ããå Žæã§ãã
ãšã©ãŒåŠçã«ã«ã¹ã¿ã ããã¯ã掻çšãã
ã«ã¹ã¿ã ããã¯ã䜿çšãããšããšã©ãŒåŠçãå«ãåå©çšå¯èœãªããžãã¯ããåäžã®ã³ã³ããŒã¶ãã«ãŠãããå
ã«ã«ãã»ã«åã§ããŸããããŒã¿ã®ãã§ãããšãšã©ãŒç®¡çãåŠçããã«ã¹ã¿ã ããã¯useFetchãäœæããŸãããã
äŸïŒåºæ¬çãªuseFetchããã¯
useFetchããã¯ã®ç°¡ç¥åãããããŒãžã§ã³ã次ã«ç€ºããŸãã
import { useState, useEffect } from 'react';
function useFetch(url) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchData = async () => {
setLoading(true);
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const json = await response.json();
setData(json);
setError(null); // Clear any previous errors
} catch (e) {
setError(e);
} finally {
setLoading(false);
}
};
fetchData();
}, [url]);
return { data, loading, error };
}
export default useFetch;
ãã®ããã¯ã¯ãç¹å®ã®URLããããŒã¿ããã§ããããããŒãã£ã³ã°ç¶æ
ãšæœåšçãªãšã©ãŒã管çããŸãã errorç¶æ
倿°ã¯ããã§ããåŠçäžã«çºçãããã¹ãŠã®ãšã©ãŒãä¿æããŸãã
ãšã©ãŒãäžæ¹åã«äŒæãã
次ã«ããã®ããã¯ãæ¡åŒµããŠãã³ã³ããã¹ãã䜿çšããŠãšã©ãŒãäžæ¹åã«äŒæãããŸããããããã«ããã芪ã³ã³ããŒãã³ãã¯ãuseFetchããã¯å
ã§çºçãããšã©ãŒã«ã€ããŠéç¥ãåããããšãã§ããŸãã
1. ãšã©ãŒã³ã³ããã¹ããäœæãã
ãŸãããšã©ãŒãã³ãã©ãŒé¢æ°ãä¿æããReactã³ã³ããã¹ããäœæããŸãã
import { createContext, useContext } from 'react';
const ErrorContext = createContext(null);
export const ErrorProvider = ErrorContext.Provider;
export const useError = () => useContext(ErrorContext);
2. useFetchããã¯ã倿Žãã
次ã«ãuseFetchããã¯ã倿ŽããŠãšã©ãŒã³ã³ããã¹ãã䜿çšããŸãã
import { useState, useEffect } from 'react';
import { useError } from './ErrorContext';
function useFetch(url) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [localError, setLocalError] = useState(null); // Local error state
const handleError = useError(); // Get the error handler from context
useEffect(() => {
const fetchData = async () => {
setLoading(true);
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const json = await response.json();
setData(json);
setLocalError(null);
} catch (e) {
setLocalError(e);
if (handleError) {
handleError(e); // Propagate the error to the context
}
} finally {
setLoading(false);
}
};
fetchData();
}, [url, handleError]);
// Return both data and local error. Component can decide which to display.
return { data, loading, localError };
}
export default useFetch;
ããã§ãããã¯å
ã§ç®¡çãããlocalErrorãšãã³ã³ããã¹ããä»ããŠäŒæããããšã©ãŒã®2ã€ã®ãšã©ãŒç¶æ
ãããããšã«æ³šæããŠãã ãããå
éšçã«localErrorã䜿çšããŸãããã³ã³ããŒãã³ãã¬ãã«ã®åŠçã«ãã¢ã¯ã»ã¹ã§ããŸãã
3. ã¢ããªã±ãŒã·ã§ã³ãErrorProviderã§ã©ãããã
ã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒãã§ãuseFetchã䜿çšããã³ã³ããŒãã³ããErrorProviderã§ã©ããããŸããããã«ããããšã©ãŒåŠçã³ã³ããã¹ãããã¹ãŠã®åã³ã³ããŒãã³ãã«æäŸãããŸãã
import React, { useState } from 'react';
import { ErrorProvider } from './ErrorContext';
import MyComponent from './MyComponent';
function App() {
const [globalError, setGlobalError] = useState(null);
const handleError = (error) => {
console.error("Error caught at the top level:", error);
setGlobalError(error);
};
return (
{globalError ? (
Error: {globalError.message}
) : (
)}
);
}
export default App;
4. ã³ã³ããŒãã³ãã§useFetchããã¯ã䜿çšãã
import React from 'react';
import useFetch from './useFetch';
function MyComponent() {
const { data, loading, localError } = useFetch('https://api.example.com/data');
if (loading) {
return Loading...
;
}
if (localError) {
return Error loading data: {localError.message}
;
}
return (
Data:
{JSON.stringify(data, null, 2)}
);
}
export default MyComponent;
説æ
- ãšã©ãŒã³ã³ããã¹ãïŒ
ErrorContextã¯ããšã©ãŒåŠç颿°ïŒhandleErrorïŒãã³ã³ããŒãã³ãéã§å ±æããæ¹æ³ãæäŸããŸãã - ãšã©ãŒäŒæïŒ
useFetchã§ãšã©ãŒãçºçãããšãhandleError颿°ãåŒã³åºããããšã©ãŒãAppã³ã³ããŒãã³ãã«äŒæãããŸãã - éäžãšã©ãŒåŠçïŒ
Appã³ã³ããŒãã³ãã¯ããšã©ãŒãéäžç®¡çãããæ¹æ³ã§åŠçãããã°ã«èšé²ãããããšã©ãŒã¡ãã»ãŒãžã衚瀺ãããããã®ä»ã®é©åãªã¢ã¯ã·ã§ã³ãå®è¡ãããã§ããããã«ãªããŸããã
ãšã©ãŒå¢çïŒäºæããªããšã©ãŒã®å®å šããã
ã«ã¹ã¿ã ããã¯ãšã³ã³ããã¹ãã¯ãéåææäœããã®ãšã©ãŒãåŠçããæ¹æ³ãæäŸããŸããããšã©ãŒå¢çã¯ãã¬ã³ããªã³ã°äžã«çºçããå¯èœæ§ã®ããäºæããªããšã©ãŒããã£ããããããã«äžå¯æ¬ ã§ãããšã©ãŒå¢çã¯ãåã³ã³ããŒãã³ãããªãŒå ã®ã©ããã§çºçããJavaScriptãšã©ãŒããã£ãããããããã®ãšã©ãŒããã°ã«èšé²ããã¯ã©ãã·ã¥ããã³ã³ããŒãã³ãããªãŒã®ä»£ããã«ãã©ãŒã«ããã¯UIã衚瀺ããReactã³ã³ããŒãã³ãã§ããã¬ã³ããªã³ã°äžãã©ã€ããµã€ã¯ã«ã¡ãœãããããã³ãããã®äžã®ããªãŒå šäœã®ã³ã³ã¹ãã©ã¯ã¿ãŒäžã«ãšã©ãŒããã£ããããŸãã
ãšã©ãŒå¢çã³ã³ããŒãã³ãã®äœæ
import React from 'react';
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false, error: null, errorInfo: null };
}
static getDerivedStateFromError(error) {
// Update state so the next render will show the fallback UI.
return { hasError: true, error: error };
}
componentDidCatch(error, errorInfo) {
// You can also log the error to an error reporting service
console.error("Caught error in ErrorBoundary:", error, errorInfo);
this.setState({errorInfo: errorInfo});
}
render() {
if (this.state.hasError) {
// You can render any custom fallback UI
return (
Something went wrong.
{this.state.error && this.state.error.toString()}
{this.state.errorInfo && this.state.errorInfo.componentStack}
);
}
return this.props.children;
}
}
export default ErrorBoundary;
ãšã©ãŒå¢çã®äœ¿çš
ãšã©ãŒãã¹ããŒããå¯èœæ§ã®ããã³ã³ããŒãã³ããErrorBoundaryã³ã³ããŒãã³ãã§ã©ããããŸãã
import React from 'react';
import ErrorBoundary from './ErrorBoundary';
import MyComponent from './MyComponent';
function App() {
return (
);
}
export default App;
ãšã©ãŒå¢çãšã«ã¹ã¿ã ããã¯ã®çµã¿åãã
æãå
ç¢ãªãšã©ãŒåŠçãè¡ãã«ã¯ããšã©ãŒå¢çãuseFetchãªã©ã®ã«ã¹ã¿ã ããã¯ãšçµã¿åãããŸãããšã©ãŒå¢çã¯äºæããªãã¬ã³ããªã³ã°ãšã©ãŒããã£ããããã«ã¹ã¿ã ããã¯ã¯éåææäœããã®ãšã©ãŒã管çããããããäžæ¹åã«äŒæãããŸãã ErrorProviderãšErrorBoundaryã¯å
±åã§ããŸãã ErrorProviderã¯ãã现ãããšã©ãŒåŠçãšã¬ããŒããå¯èœã«ããErrorBoundaryã¯å£æ»
çãªã¢ããªã±ãŒã·ã§ã³ã¯ã©ãã·ã¥ãé²ããŸãã
Reactã§ã®ãšã©ãŒåŠçã®ãã¹ããã©ã¯ãã£ã¹
- éäžãšã©ãŒãã®ã³ã°ïŒãšã©ãŒãç£èŠãšåæã®ããã«äžå€®ã®ãã®ã³ã°ãµãŒãã¹ã«éä¿¡ããŸãã SentryãRollbarãBugsnagãªã©ã®ãµãŒãã¹ã¯åªãããªãã·ã§ã³ã§ããã€ãã³ãã®é倧床ãåºå¥ããããã«ããã®ã³ã°ã¬ãã«ïŒäŸïŒ
console.errorãconsole.warnãconsole.infoïŒã䜿çšããããšãæ€èšããŠãã ããã - ãŠãŒã¶ãŒãã¬ã³ããªãŒãªãšã©ãŒã¡ãã»ãŒãžïŒãŠãŒã¶ãŒã«æç¢ºã§åœ¹ç«ã€ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããŸããå°éçšèªã¯é¿ããåé¡ã®è§£æ±ºçãææ¡ããŸããããŒã«ãªãŒãŒã·ã§ã³ã«ã€ããŠèããŠãã ããããšã©ãŒã¡ãã»ãŒãžãããŸããŸãªèšèªãšæåã®ã³ã³ããã¹ãã§ãŠãŒã¶ãŒãçè§£ã§ããããšã確èªããŠãã ããã
- 段éçãªå£åïŒãšã©ãŒãçºçããå Žåã«ãã¢ããªã±ãŒã·ã§ã³ãé©åã«å£åããããã«èšèšããŸããããšãã°ãç¹å®ã®APIåŒã³åºãã倱æããå Žåã察å¿ããã³ã³ããŒãã³ããé衚瀺ã«ããããã¢ããªã±ãŒã·ã§ã³å šäœãã¯ã©ãã·ã¥ãã代ããã«ãã¬ãŒã¹ãã«ããŒã衚瀺ããŸãã
- å詊è¡ã¡ã«ããºã ïŒãããã¯ãŒã¯ã®äžå ·åãªã©ã®äžæçãªãšã©ãŒã«å¯ŸããŠãå詊è¡ã¡ã«ããºã ãå®è£ ããŸãããã ããåé¡ãæªåããå¯èœæ§ããããããç¡éã®å詊è¡ã«ãŒãã¯é¿ããŠãã ãããææ°ããã¯ãªãã¯è¯ãæŠç¥ã§ãã
- ãã¹ãïŒãšã©ãŒåŠçããžãã¯ãæåŸ ã©ããã«æ©èœããããšã確èªããããã«ã培åºçã«ãã¹ãããŸãããããã¯ãŒã¯é害ãç¡å¹ãªããŒã¿ããµãŒããŒãšã©ãŒãªã©ãããŸããŸãªãšã©ãŒã·ããªãªãã·ãã¥ã¬ãŒãããŸãã JestãReact Testing Libraryãªã©ã®ããŒã«ã䜿çšããŠãåäœãã¹ããšçµ±åãã¹ããèšè¿°ããããšãæ€èšããŠãã ããã
- ç£èŠïŒãšã©ãŒãšããã©ãŒãã³ã¹ã®åé¡ã«ã€ããŠã¢ããªã±ãŒã·ã§ã³ãç¶ç¶çã«ç£èŠããŸãããšã©ãŒãçºçãããšãã«éç¥ãããããã«ã¢ã©ãŒããèšå®ãããšãåé¡ã«ãã°ãã察å¿ã§ããŸãã
- ã»ãã¥ãªãã£ãèæ ®ããïŒãšã©ãŒã¡ãã»ãŒãžã«æ©å¯æ å ±ã衚瀺ãããªãããã«ããŸããã¹ã¿ãã¯ãã¬ãŒã¹ãå éšãµãŒããŒã®è©³çްããŠãŒã¶ãŒåãã®ã¡ãã»ãŒãžã«å«ããªãããã«ããŠãã ããããã®æ å ±ã¯ãæªæã®ããã¢ã¯ã¿ãŒã«ãã£ãŠæªçšãããå¯èœæ§ããããŸãã
é«åºŠãªãšã©ãŒåŠçãã¯ããã¯
ã°ããŒãã«ãšã©ãŒç¶æ 管çãœãªã¥ãŒã·ã§ã³ã®äœ¿çš
ããè€éãªã¢ããªã±ãŒã·ã§ã³ã®å Žåã¯ãReduxãZustandãRecoilãªã©ã®ã°ããŒãã«ç¶æ 管çãœãªã¥ãŒã·ã§ã³ã䜿çšããŠããšã©ãŒç¶æ ã管çããããšãæ€èšããŠãã ãããããã«ãããã¢ããªã±ãŒã·ã§ã³å ã®ã©ãããã§ããšã©ãŒç¶æ ã«ã¢ã¯ã»ã¹ããŠæŽæ°ã§ããããããšã©ãŒãåŠçããããã®äžå€®éæš©çãªæ¹æ³ãæäŸãããŸããããšãã°ããšã©ãŒãçºçãããšãã«ãšã©ãŒç¶æ ãæŽæ°ããã¢ã¯ã·ã§ã³ããã£ã¹ãããããŠãããã»ã¬ã¯ã¿ãŒã䜿çšããŠãä»»æã®ã³ã³ããŒãã³ãã§ãšã©ãŒç¶æ ãååŸã§ããŸãã
ã«ã¹ã¿ã ãšã©ãŒã¯ã©ã¹ã®å®è£
ã¢ããªã±ãŒã·ã§ã³ã§çºçããå¯èœæ§ã®ããããŸããŸãªã¿ã€ãã®ãšã©ãŒã衚ãã«ã¹ã¿ã ãšã©ãŒã¯ã©ã¹ãäœæããŸããããã«ãããããŸããŸãªã¿ã€ãã®ãšã©ãŒãç°¡åã«åºå¥ããããã«å¿ããŠåŠçã§ããŸããããšãã°ãNetworkErrorã¯ã©ã¹ãValidationErrorã¯ã©ã¹ãããã³ServerErrorã¯ã©ã¹ãäœæã§ããŸããããã«ããããšã©ãŒåŠçããžãã¯ãããæŽçãããä¿å®æ§ãåäžããŸãã
ãµãŒããããã¬ãŒã«ãŒãã¿ãŒã³ã®äœ¿çš
ãµãŒããããã¬ãŒã«ãŒãã¿ãŒã³ã¯ã忣ã·ã¹ãã ã§ã®ã«ã¹ã±ãŒãé害ãé²ãã®ã«åœ¹ç«ã€èšèšãã¿ãŒã³ã§ããåºæ¬çãªèãæ¹ã¯ãå€éšãµãŒãã¹ãžã®åŒã³åºãããµãŒããããã¬ãŒã«ãŒãªããžã§ã¯ãã§ã©ããããããšã§ãããµãŒããããã¬ãŒã«ãŒãç¹å®ã®ãšã©ãŒæ°ãæ€åºããå ŽåããµãŒãããããéãããå€éšãµãŒãã¹ãžã®ãã以äžã®åŒã³åºãã鲿¢ããŸããäžå®æéãçµéãããšããµãŒããããã¬ãŒã«ãŒã¯ãµãŒãããããååéãããå€éšãµãŒãã¹ãžã®åäžã®åŒã³åºããèš±å¯ããŸããåŒã³åºããæåããå ŽåããµãŒããããã¬ãŒã«ãŒã¯ãµãŒãããããéãããå€éšãµãŒãã¹ãžã®ãã¹ãŠã®åŒã³åºããåéãããŸããããã«ãããå€éšãµãŒãã¹ã§ã®é害ã«ãã£ãŠã¢ããªã±ãŒã·ã§ã³ãå§åãããã®ãé²ãããšãã§ããŸãã
åœéåïŒi18nïŒã®èæ ®äºé
ã°ããŒãã«ãªèŠèŽè
ãæ±ãå Žåãåœéåãæåªå
äºé
ã§ãããšã©ãŒã¡ãã»ãŒãžã¯ããŠãŒã¶ãŒã®åžæããèšèªã«ç¿»èš³ããå¿
èŠããããŸãã i18nextã®ãããªã©ã€ãã©ãªã䜿çšããŠã翻蚳ã广çã«ç®¡çããããšãæ€èšããŠãã ãããããã«ããšã©ãŒãã©ã®ããã«èªèããããã«ã€ããŠãæåçãªéãã«æ³šæããŠãã ãããããšãã°ãåçŽãªèŠåã¡ãã»ãŒãžã¯ãããŸããŸãªæåã§ç°ãªãããã«è§£éãããå¯èœæ§ããããããããŒã³ãšè¡šçŸã察象ãŠãŒã¶ãŒã«é©ããŠããããšã確èªããŠãã ããã
äžè¬çãªãšã©ãŒã·ããªãªãšè§£æ±ºç
ãããã¯ãŒã¯ãšã©ãŒ
ã·ããªãªïŒAPIãµãŒããŒãå©çšã§ããªããããŠãŒã¶ãŒã®ã€ã³ã¿ãŒãããæ¥ç¶ãããŠã³ããŠããŸãã
解決çïŒãããã¯ãŒã¯ã®åé¡ãããããšã瀺ãã¡ãã»ãŒãžã衚瀺ããã€ã³ã¿ãŒãããæ¥ç¶ã®ç¢ºèªãææ¡ããŸããææ°ããã¯ãªãã䜿çšããŠå詊è¡ã¡ã«ããºã ãå®è£ ããŸãã
ç¡å¹ãªããŒã¿
ã·ããªãªïŒAPIããäºæãããã¹ããŒããšäžèŽããªãããŒã¿ãè¿ããŸãã
解決çïŒã¯ã©ã€ã¢ã³ãåŽã§ããŒã¿æ€èšŒãå®è£ ããŠãç¡å¹ãªããŒã¿ããã£ããããŸããããŒã¿ãç ŽæãŸãã¯ç¡å¹ã§ããããšã瀺ããšã©ãŒã¡ãã»ãŒãžã衚瀺ããŸãã TypeScriptã䜿çšããŠãã³ã³ãã€ã«æã«ããŒã¿åãé©çšããããšãæ€èšããŠãã ããã
èªèšŒãšã©ãŒ
ã·ããªãªïŒãŠãŒã¶ãŒã®èªèšŒããŒã¯ã³ãç¡å¹ãŸãã¯æéåãã§ãã
解決çïŒãŠãŒã¶ãŒããã°ã€ã³ããŒãžã«ãªãã€ã¬ã¯ãããŸããã»ãã·ã§ã³ãæéåãã«ãªããå床ãã°ã€ã³ããå¿ èŠãããããšã瀺ãã¡ãã»ãŒãžã衚瀺ããŸãã
èªå¯ãšã©ãŒ
ã·ããªãªïŒãŠãŒã¶ãŒãç¹å®ã®ãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããæš©éãæã£ãŠããŸããã
解決çïŒå¿ èŠãªæš©éããªãããšã瀺ãã¡ãã»ãŒãžã衚瀺ããŸããã¢ã¯ã»ã¹ããå¿ èŠããããšæãããå Žåã¯ããµããŒãã«é£çµ¡ããããã®ãªã³ã¯ãæäŸããŸãã
ãµãŒããŒãšã©ãŒ
ã·ããªãªïŒAPIãµãŒããŒã§äºæããªããšã©ãŒãçºçããŸããã
解決çïŒãµãŒããŒã«åé¡ãããããšã瀺ãäžè¬çãªãšã©ãŒã¡ãã»ãŒãžã衚瀺ããŸãããããã°ã®ããã«ãµãŒããŒåŽã§ãšã©ãŒããã°ã«èšé²ããŸãã SentryãŸãã¯Rollbarã®ãããªãµãŒãã¹ã䜿çšããŠããµãŒããŒãšã©ãŒã远跡ããããšãæ€èšããŠãã ããã
çµè«
广çãªãšã©ãŒåŠçã¯ãå ç¢ã§ãŠãŒã¶ãŒãã¬ã³ããªãŒãªReactã¢ããªã±ãŒã·ã§ã³ãäœæããããã«äžå¯æ¬ ã§ããã«ã¹ã¿ã ããã¯ããšã©ãŒå¢çãããã³å æ¬çãªãšã©ãŒåŠçæŠç¥ãçµã¿åãããããšã§ãã¢ããªã±ãŒã·ã§ã³ããšã©ãŒãé©åã«åŠçãããªãœãŒã¹èªã¿èŸŒã¿ã®å€±ææã§ããŠãŒã¶ãŒã«æå³ã®ãããšã¯ã¹ããªãšã³ã¹ãæäŸã§ããããã«ããããšãã§ããŸããéäžãšã©ãŒãã®ã³ã°ããŠãŒã¶ãŒãã¬ã³ããªãŒãªãšã©ãŒã¡ãã»ãŒãžã段éçãªå£åãåªå ããããšãå¿ããªãã§ãã ããããããã®ãã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ããŠãŒã¶ãŒã®å Žæãèæ¯ã«é¢ä¿ãªããå埩åããããä¿¡é Œæ§ãé«ããä¿å®ã容æãªReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã