Reactã®ãšã©ãŒåŠçããã¹ã¿ãŒããå®çšçãªã¢ãŒããã¯ãã£ãã¿ãŒã³ãšã°ããŒãã«ãªãã¹ããã©ã¯ãã£ã¹ã§ãå ç¢ã§ãã©ãŒã«ããã¬ã©ã³ããªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŸãã
Reactã®ãšã©ãŒãªã«ããªïŒå埩åã®ããã³ã³ããŒãã³ãã¢ãŒããã¯ãã£ãã¿ãŒã³
ããã³ããšã³ãéçºã®ããŒã¹ãéãäžçã§ã¯ãå ç¢ã§å埩åã®ããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããšãæãéèŠã§ããReactã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæ§ç¯ããããã®äººæ°ã®ããJavaScriptã©ã€ãã©ãªã§ããã匷åãªã³ã³ããŒãã³ãããŒã¹ã®ã¢ãããŒããæäŸããŸãããã ããæé«ã®ã³ãŒãã£ã³ã°ãã©ã¯ãã£ã¹ã䜿çšããŠãããšã©ãŒã¯é¿ããããŸããããããã®ãšã©ãŒã¯ãåçŽãªæ§æãã¹ããè€éãªã©ã³ã¿ã€ã ã®åé¡ãŸã§å€å²ã«ããããŸãããã®ããã°æçš¿ã§ã¯ãReactã®ãšã©ãŒãªã«ããªã«ã€ããŠè©³ãã説æãããšã©ãŒãé©åã«åŠçããã¢ããªã±ãŒã·ã§ã³å šäœãã¯ã©ãã·ã¥ããã®ãé²ãããã«èšèšãããã¢ãŒããã¯ãã£ãã¿ãŒã³ãæ¢ããŸãããšã©ãŒå¢çããã®å®è£ ãããã³ãããã广çã«äœ¿çšããŠãã°ããŒãã«ã«é©çšå¯èœãªãã©ãŒã«ããã¬ã©ã³ããªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãäœæããæ¹æ³ãæ€èšããŸãã
Reactã§ã®ãšã©ãŒåŠçã®éèŠæ§
ãšã©ãŒåŠçã¯ããã°ãä¿®æ£ããã ãã§ã¯ãããŸãããããã¯ãããžãã£ããªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæ§ç¯ããããšã§ããé©åã«èšèšããããšã©ãŒåŠçæŠç¥ã«ããããŠãŒã¶ãŒãå£ããã€ã³ã¿ãŒãã§ãŒã¹ãå¿çã®ãªãã¢ããªã±ãŒã·ã§ã³ã«çªç¶çŽé¢ããããšããªããªããŸãã代ããã«ãæ å ±ãæäŸãããã¬ã€ãã³ã¹ãæäŸããããšã©ãŒããå埩ããæ©äŒãäžããããŸããããã¯ããŠãŒã¶ãŒã®ä¿¡é Œãšæºè¶³åºŠãç¶æããããã«éåžžã«éèŠã§ãããšã©ãŒã®åŠçãäžååã ãšãããŒã¿æå€±ããã©ã¹ãã¬ãŒã·ã§ã³ããããŠæçµçã«ã¯ãŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ãæŸæ£ããå¯èœæ§ããããŸããã°ããŒãã«ãªèŠç¹ããèŠããšãããŸããŸãªããã€ã¹ãã€ã³ã¿ãŒãããé床ãããã³ãŠãŒã¶ãŒç°å¢ãèæ ®ãããšãå ç¢ãªãšã©ãŒåŠçã¯ããã«éèŠã«ãªããŸããã€ã³ã¿ãŒãããæ¥ç¶ãé ãããŸãã¯ä¿¡é Œæ§ã®äœãããã€ã¹ã䜿çšããŠããå°åã®ãŠãŒã¶ãŒã¯ãããé »ç¹ã«ãšã©ãŒãçºçããå¯èœæ§ããããŸãããããã£ãŠã广çãªãšã©ãŒå埩ã¡ã«ããºã ãå®è£ ããããšã¯ãäžçäžã®ãã¹ãŠã®ãŠãŒã¶ãŒã«ã¹ã ãŒãºã§äžè²«ãããšã¯ã¹ããªãšã³ã¹ãä¿èšŒããããã«äžå¯æ¬ ã§ãã
Reactã®ãšã©ãŒå¢çã®çè§£
Reactã¯ãã¬ã³ããªã³ã°äžãã©ã€ããµã€ã¯ã«ã¡ãœãããããã³åã³ã³ããŒãã³ãã®ã³ã³ã¹ãã©ã¯ã¿ã§çºçããJavaScriptãšã©ãŒãåŠçããããã®ç¹å®ã®ã¡ã«ããºã ã§ãããšã©ãŒå¢çãæäŸããŸãããšã©ãŒå¢çã¯ãåã³ã³ããŒãã³ãããªãŒå ã®ã©ããã§JavaScriptãšã©ãŒããã£ãããããããã®ãšã©ãŒããã°ã«èšé²ããã¢ããªã±ãŒã·ã§ã³å šäœãã¯ã©ãã·ã¥ããã代ããã«ãã©ãŒã«ããã¯UIã衚瀺ããReactã³ã³ããŒãã³ãã§ãããšã©ãŒå¢çã¯åºæ¬çã«ãã¢ããªã±ãŒã·ã§ã³ã®äžéšãã©ãããããšã©ãŒãã£ããã£ãŒãšããŠæ©èœããReactã³ã³ããŒãã³ãã§ããåã³ã³ããŒãã³ãã§ãšã©ãŒãçºçãããšããšã©ãŒå¢çã¯ãšã©ãŒãæäžäœã¬ãã«ã«ãããªã³ã°ããŠã¢ããªã±ãŒã·ã§ã³å šäœãã¯ã©ãã·ã¥ããã®ãé²ãããšãã§ããŸããããã«ãããæçãªãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããããŠãŒã¶ãŒããšã©ãŒãå ±åããæ¹æ³ãæäŸãããããšã©ãŒããèªåçã«å埩ã詊ã¿ãããããªã©ããšã©ãŒãé©åã«åŠçããã¡ã«ããºã ãæäŸãããŸãã
ãšã©ãŒå¢çã®äž»ãªç¹æ§ïŒ
- ãšã©ãŒã®ãã£ããïŒã¬ã³ããªã³ã°äžãã©ã€ããµã€ã¯ã«ã¡ãœãããããã³ãã¹ãŠã®åã³ã³ããŒãã³ãã®ã³ã³ã¹ãã©ã¯ã¿ã§ãšã©ãŒããã£ããããŸãã
- ãã£ããããªããã®ïŒã€ãã³ããã³ãã©ãŒïŒäŸïŒ`onClick`ïŒãŸãã¯éåæã³ãŒãïŒäŸïŒ`setTimeout`ãŸãã¯`fetch`ïŒå ã®ãšã©ãŒã¯ãã£ããããŸããã
- ãã©ãŒã«ããã¯UIïŒãšã©ãŒãçºçãããšããã©ãŒã«ããã¯UIãã¬ã³ããªã³ã°ããŸãã
- ã©ã€ããµã€ã¯ã«ã¡ãœããïŒéåžžã`static getDerivedStateFromError()`ããã³`componentDidCatch()`ã©ã€ããµã€ã¯ã«ã¡ãœãããå©çšããŸãã
ãšã©ãŒå¢çã®å®è£ ïŒã¹ããããã€ã¹ãããã¬ã€ã
ãšã©ãŒå¢çã®å®è£ ã«ã¯ãç¹å®ã®ã©ã€ããµã€ã¯ã«ã¡ãœãããæã€Reactã³ã³ããŒãã³ãã®äœæãå«ãŸããŸããæãéèŠãªåŽé¢ãèŠãŠã¿ãŸãããã
1. ãšã©ãŒå¢çã³ã³ããŒãã³ãã®äœæ
ãšã©ãŒå¢çã³ã³ããŒãã³ãã®åºæ¬çãªæ§é ãæ¬¡ã«ç€ºããŸãã
import React from 'react';
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// Update state so the next render will show the fallback UI.
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
// You can also log the error to an error reporting service
console.error('Caught error:', error, errorInfo);
// Consider using a service like Sentry, Bugsnag, or Rollbar for error logging.
}
render() {
if (this.state.hasError) {
// You can render any custom fallback UI
return Something went wrong.
;
}
return this.props.children;
}
}
2. ã©ã€ããµã€ã¯ã«ã¡ãœããã®èª¬æ
getDerivedStateFromError(error)ïŒãã®éçã¡ãœããã¯ãåå«ã³ã³ããŒãã³ãããšã©ãŒãã¹ããŒããåŸã«åŒã³åºãããŸããã¹ããŒããããšã©ãŒããã©ã¡ãŒã¿ãšããŠåãåããç¶æ ãæŽæ°ããããã«ãªããžã§ã¯ããè¿ãå¿ èŠããããŸããããã¯ããšã©ãŒãçºçããããšã瀺ãããã«ã³ã³ããŒãã³ãã®ç¶æ ãæŽæ°ããããã«äœ¿çšãããŸãããã®ã¡ãœããã¯ãã¬ã³ããªã³ã°ãã§ãŒãºåã«åŒã³åºãããããããã®äžã§ç¶æ ãèšå®ããŠãå®å šã§ããcomponentDidCatch(error, errorInfo)ïŒãã®ã¡ãœããã¯ãåå«ã³ã³ããŒãã³ãã«ãã£ãŠãšã©ãŒãã¹ããŒãããåŸã«åŒã³åºãããŸãã2ã€ã®ãã©ã¡ãŒã¿ãåãåããŸããã¹ããŒããããšã©ãŒãšããšã©ãŒã«é¢ããæ å ±ãå«ããªããžã§ã¯ãã§ãããã®ã¡ãœããã䜿çšããŠããšã©ãŒã®ãã°èšé²ããšã©ãŒã¬ããŒãã®ãµãŒãã¹ãžã®éä¿¡ããŸãã¯ãã®ä»ã®å¯äœçšã®å®è¡ãè¡ããŸãã
3. ãšã©ãŒå¢çã«ããã³ã³ããŒãã³ãã®ã©ãã
ãšã©ãŒå¢çã䜿çšããã«ã¯ãä¿è·ããã³ã³ããŒãã³ããã©ããããŸãã
å埩åã®ããã³ã³ããŒãã³ãã®ã¢ãŒããã¯ãã£ãã¿ãŒã³
ãšã©ãŒå¢çã¯åç¬ã§ã匷åã§ãããä»ã®ã¢ãŒããã¯ãã£ãã¿ãŒã³ãšçµã¿åããããšããã«å¹æçã§ãããããã®ãã¿ãŒã³ã¯ããšã©ãŒã®åé¢ãã³ãŒãã®æŽçãããã³ãã管çããããä¿å®ããããã¢ããªã±ãŒã·ã§ã³ã®äœæã«åœ¹ç«ã¡ãŸãã
1. ãã¹ãããããšã©ãŒå¢ç
ãšã©ãŒå¢çããã¹ããããšããšã©ãŒåŠçã现ããå¶åŸ¡ã§ããŸããã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®ã³ã³ããŒãã³ããŸãã¯ã»ã¯ã·ã§ã³ããããããç¬èªã®ãã©ãŒã«ããã¯UIãæã€ãšã©ãŒå¢çã§ã©ããã§ããŸãããã®ã¢ãããŒãã¯ããšã©ãŒãã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®éšåã«åé¢ããã¢ããªã±ãŒã·ã§ã³å šäœã®ãšã¯ã¹ããªãšã³ã¹ã«åœ±é¿ãäžããªãããã«ããŸãããã®ãã¿ãŒã³ã¯ã倿°ã®ã³ã³ããŒãã³ããæã€å€§èŠæš¡ã§è€éãªã¢ããªã±ãŒã·ã§ã³ã«ç¹ã«åœ¹ç«ã¡ãŸããããšãã°ãã¢ããªã±ãŒã·ã§ã³å šäœãã©ãããããšã©ãŒå¢çããŠãŒã¶ãŒãããã¡ã€ã«ãªã©ã®ç¹å®ã®ã»ã¯ã·ã§ã³ãã©ããããå¥ã®ãšã©ãŒå¢çãããã³åã ã®ã³ã³ããŒãã³ãå ã®ãšã©ãŒãåŠçããããã«å¥ã®å¢çãããå ŽåããããŸãã
äŸïŒ
2. ã³ã³ããã¹ãèªèãšã©ãŒåŠç
React Contextã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³å šäœã«ãšã©ãŒæ å ±ãäŒæããŸãããã®ã¢ãããŒãã«ãããã³ã³ããŒãã³ãã¯ãšã©ãŒç¶æ ã«ã¢ã¯ã»ã¹ãããã飿ºããæ¹æ³ã§ãšã©ãŒãåŠçã§ããŸããããšãã°ãã³ã³ããã¹ãã䜿çšããŠã°ããŒãã«ãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããããšã©ãŒãçºçãããšãã«ç¹å®ã®ã¢ã¯ã·ã§ã³ãããªã¬ãŒãããã§ããŸãããã®ãã¿ãŒã³ã¯ãè€æ°ã®ã³ã³ããŒãã³ãã«åœ±é¿ãäžãããšã©ãŒããã¢ããªã±ãŒã·ã§ã³å šäœã®å¿çãå¿ èŠãªãšã©ãŒãåŠçããå Žåã«åœ¹ç«ã¡ãŸããããšãã°ãAPIåŒã³åºãã倱æããå Žåãã³ã³ããã¹ãã䜿çšããŠã°ããŒãã«éç¥ã衚瀺ããããç¹å®ã®æ©èœãç¡å¹ã«ãããã§ããŸãã
äŸïŒ
// ErrorContext.js
import React, { createContext, useState } from 'react';
export const ErrorContext = createContext();
export const ErrorProvider = ({ children }) => {
const [error, setError] = useState(null);
return (
{children}
);
};
// App.js
import React from 'react';
import { ErrorProvider } from './ErrorContext';
import MyComponent from './MyComponent';
function App() {
return (
);
}
// MyComponent.js
import React, { useContext, useEffect } from 'react';
import { ErrorContext } from './ErrorContext';
function MyComponent() {
const { setError } = useContext(ErrorContext);
useEffect(() => {
try {
// Simulate an error
throw new Error('Something went wrong!');
} catch (error) {
setError(error);
}
}, []);
return (
{/* Rest of the component */}
);
}
3. ã³ã³ããŒãã³ãã¬ãã«ã®ãšã©ãŒåŠç
åã ã®ã³ã³ããŒãã³ãå ã§ã`try...catch`ãããã¯ã䜿çšããŠãAPIåŒã³åºããããŒã¿è§£æãªã©ã®ç¹å®ã®æäœã«é¢é£ãããšã©ãŒãåŠçããŸãããã®ææ³ã¯ããœãŒã¹ã§ãšã©ãŒããã£ããããŠåŠçãããšã©ãŒå¢çã«äŒæããã®ãé²ãã®ã«åœ¹ç«ã¡ãŸããããã«ãããããæ£ç¢ºãªãšã©ãŒç®¡çãå¯èœã«ãªããçºçããç¹å®ã®ãšã©ãŒã«å¯Ÿããå¿çã調æŽã§ããŸããã³ã³ããŒãã³ãèªäœã«ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããããé å»¶åŸã«æäœãå詊è¡ãããããããšãæ€èšããŠãã ããããã®ã¿ãŒã²ãããçµã£ãã¢ãããŒãã«ããããšã©ãŒãéå®ãããå埩ããã现ããå¶åŸ¡ã§ããŸãã
äŸïŒ
function MyComponent() {
const [data, setData] = React.useState(null);
const [error, setError] = React.useState(null);
React.useEffect(() => {
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const jsonData = await response.json();
setData(jsonData);
} catch (err) {
setError(err);
}
}
fetchData();
}, []);
if (error) {
return <p>Error loading data: {error.message}</p>;
}
return (
<div>
{data ? <p>Data loaded!</p> : <p>Loading...</p>}
</div>
);
}
4. åã¬ã³ããªã³ã°ãšå詊è¡ã¡ã«ããºã
ãšã©ãŒãçºçããåŸãã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ããããæäœãå詊è¡ãããããã¡ã«ããºã ãå®è£ ããŸããããšãã°ããããã¯ãŒã¯ãªã¯ãšã¹ãã倱æããåŸããšã©ãŒã¡ãã»ãŒãžã衚瀺ããåã«ããªã¯ãšã¹ããæ°åå詊è¡ããå ŽåããããŸããå Žåã«ãã£ãŠã¯ããšã©ãŒãäžæçãªããŒã¿ç Žæãªã©ã®äžæçãªåé¡ã«ãã£ãŠçºçããå Žåãåã«ã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ããã ãã§åé¡ã解決ã§ããŸããç¡éã«ãŒãããµãŒããŒã®éè² è·ãé²ãããã«ãå詊è¡ããžãã¯ãæ éã«æ€èšããŠãã ãããããå埩åã®ããã·ã¹ãã ãäœæããããã«ãå詊è¡éã®é å»¶ãšå詊è¡ã®æå€§åæ°ãå®è£ ããŸãããããã®æŠç¥ã¯ãäžçã®å€ãã®å°åã§äžè¬çãªäžå®å®ãªãããã¯ãŒã¯æ¥ç¶ç°å¢ã§ç¹ã«åœ¹ç«ã¡ãŸãã
äŸïŒ
function MyComponent() {
const [data, setData] = React.useState(null);
const [error, setError] = React.useState(null);
const [retries, setRetries] = React.useState(0);
const maxRetries = 3;
React.useEffect(() => {
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const jsonData = await response.json();
setData(jsonData);
setError(null);
} catch (err) {
setError(err);
if (retries < maxRetries) {
setTimeout(() => {
setRetries(retries + 1);
}, 1000); // Retry after 1 second
}
}
}
fetchData();
}, [retries]);
if (error && retries === maxRetries) {
return <p>Failed to load data after multiple retries.</p>;
}
return (
<div>
{data ? <p>Data loaded!</p> : <p>Loading...</p>}
</div>
);
}
5. ããŒã¿ã®æ€èšŒãšå€æ
ãšã©ãŒã¯ãäºæããªãããŒã¿ãŸãã¯ç¡å¹ãªããŒã¿ããçºçããããšããããããŸãããã®ãããªãšã©ãŒãé²ãããã«ãå ç¢ãªããŒã¿æ€èšŒããã³å€æææ³ãå®è£ ããŸããå ¥åæã«ããŒã¿ãæ€èšŒãããã®åœ¢åŒãšæ§é ãæ£ããããšã確èªããŸããããŒã¿å€æã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšããåã«ããŒã¿ããµãã¿ã€ãºããã³æ£èŠåããŸãããã®ãã©ã¯ãã£ã¹ã¯ãããŒã¿é¢é£ã®è匱æ§ããã¢ããªã±ãŒã·ã§ã³ãä¿è·ããããŸããŸãªããŒã¿ãœãŒã¹éã§ããŒã¿ã®äžè²«æ§ã確ä¿ããããã«éåžžã«éèŠã§ããYupãJoiãªã©ã®ã©ã€ãã©ãªãå©çšãããšãæ€èšŒããã»ã¹ãåçåããå€§å¹ ãªå¹çåäžãåŸãããŸãã
äŸïŒ
import * as Yup from 'yup';
const schema = Yup.object().shape({
email: Yup.string().email().required(),
password: Yup.string().min(8).required(),
});
async function validateForm(values) {
try {
await schema.validate(values, { abortEarly: false });
return {}; // No errors
} catch (errors) {
const formattedErrors = {};
errors.inner.forEach((error) => {
formattedErrors[error.path] = error.message;
});
return formattedErrors;
}
}
ã°ããŒãã«ãªèæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
ã°ããŒãã«ãªãŒãã£ãšã³ã¹åãã«Reactã¢ããªã±ãŒã·ã§ã³ãèšèšããå Žåã¯ã次ã®èŠçŽ ãèæ ®ããŠãã ããã
1. ããŒã«ãªãŒãŒã·ã§ã³ãšåœéåïŒi18nïŒ
ã¢ããªã±ãŒã·ã§ã³ãè€æ°ã®èšèªãšæåããµããŒãããŠããããšã確èªããŸãã`react-i18next`ã`formatjs`ãªã©ã®i18nã©ã€ãã©ãªã䜿çšããŠãããã¹ãã®ç¿»èš³ãæ¥ä»ãæ°å€ãé貚ã®åœ¢åŒèšå®ãããŸããŸãªæ¥ä»ãšã¿ã€ã ãŸãŒã³ãžã®å¯Ÿå¿ãè¡ããŸããããã¯ãããŸããŸãªå°åã®ãŠãŒã¶ãŒã«ãªãŒããããŠãŒã¶ãŒãã¬ã³ããªãŒãªãšã¯ã¹ããªãšã³ã¹ãäœæããããã«éåžžã«éèŠã§ããç¹ã«ãç°ãªãæåäœç³»ãæåçèŠç¯ãæã€å°åã§ã¯éèŠã§ããå³ããå·ŠïŒRTLïŒã®èšèªãèæ ®ããããã«å¿ããŠã¬ã€ã¢ãŠããèšèšããŸããããŸããŸãªèšèªã§ããã¹ããæ£ãã衚瀺ãããããã«ãé©åãªæåã»ãããšãšã³ã³ãŒãã䜿çšããŸãã
2. ã¢ã¯ã»ã·ããªãã£ïŒa11yïŒ
é害ã®ãããŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ã§ããããã«ããŸããARIA屿§ãã»ãã³ãã£ãã¯HTMLã䜿çšããé©åãªããŒããŒãããã²ãŒã·ã§ã³ã確ä¿ããŸããç»åã®ä»£æ¿ããã¹ããæäŸããååãªè²ã®ã³ã³ãã©ã¹ãã䜿çšããŸããã¢ã¯ã»ã·ããªãã£ã¯ãã¢ããªã±ãŒã·ã§ã³ãèœåã«é¢ä¿ãªããã§ããã ãå€ãã®äººã䜿çšã§ããããã«ããããã«éåžžã«éèŠã§ããã¹ã¯ãªãŒã³ãªãŒããŒããã®ä»ã®æ¯æŽæè¡ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ããã¹ãããäºææ§ã確èªããŸããå®å šãªæšæºæºæ ã«ã€ããŠã¯ãWCAGïŒWeb Content Accessibility GuidelinesïŒããæ€èšãã ããã
3. ããã©ãŒãã³ã¹ã®æé©å
ç¹ã«ã€ã³ã¿ãŒãããæ¥ç¶ãé ãå°åã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæé©åããŸãããã³ãã«ãµã€ãºãæå°éã«æããã³ãŒãåå²ã䜿çšããç»åãæé©åããŸããã³ã³ãã³ãé ä¿¡ãããã¯ãŒã¯ïŒCDNïŒã䜿çšããŠãäžçäžã®ãŠãŒã¶ãŒã«è¿ããµãŒããŒããã¢ã»ãããæäŸããããšãæ€èšããŠãã ãããããã©ãŒãã³ã¹ã®æé©åã¯ããŠãŒã¶ãŒã®æºè¶³åºŠã«çŽæ¥è²¢ç®ããã€ã³ã¿ãŒãããã¢ã¯ã»ã¹ãä¿¡é Œæ§ã®äœãå°åã§ã¯ç¹ã«éèŠã§ããããŸããŸãªãããã¯ãŒã¯æ¡ä»¶äžã§ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã宿çã«ãã¹ãããŸããç»åãã³ã³ããŒãã³ãã®é å»¶èªã¿èŸŒã¿ãªã©ã®ææ³ã䜿çšãããã該åœããå Žåã¯ãµãŒããŒåŽã®ã¬ã³ããªã³ã°ãæé©åãããããããšãæ€èšããŠãã ããã
4. ãšã©ãŒå ±åãšç£èŠ
æ¬çªç°å¢ã§ãšã©ãŒã远跡ããããã«ãå ç¢ãªãšã©ãŒå ±åããã³ç£èŠã·ã¹ãã ãå®è£ ããŸããSentryãBugsnagããŸãã¯Rollbarãªã©ã®ãµãŒãã¹ã䜿çšããŠããšã©ãŒããã£ããã£ãããã°ã«èšé²ããã¢ã©ãŒããåä¿¡ããŸããããã«ããããšã©ãŒãè¿ éã«ç¹å®ããŠä¿®æ£ãããã¹ãŠã®ãŠãŒã¶ãŒã«ã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãä¿èšŒã§ããŸãããŠãŒã¶ãŒã³ã³ããã¹ããããã€ã¹æ å ±ãªã©ããšã©ãŒã«é¢ãã詳现æ å ±ããã°ã«èšé²ããããšãæ€èšããŠãã ããããšã©ãŒã®é »åºŠãšé倧床ã«åºã¥ããŠã¢ã©ãŒããèšå®ããããã¢ã¯ãã£ãã«å¯Ÿå¿ããŸãããšã©ãŒã¬ããŒãã宿çã«ç¢ºèªãããŠãŒã¶ãŒãšã¢ããªã±ãŒã·ã§ã³ã®æ©èœãžã®åœ±é¿ã«åºã¥ããŠä¿®æ£ã®åªå é äœãä»ããŸãã
5. ãŠãŒã¶ãŒãã£ãŒãããã¯ãšãã¹ã
ããŸããŸãªå°åãæåããã®ãŠãŒã¶ãŒãã£ãŒãããã¯ãåéããŸãããŠãŒã¶ããªãã£ã®åé¡ãç¹å®ãããŠãŒã¶ãŒã®æåŸ ã«é¢ããæŽå¯ãåŸãããã«ããŠãŒã¶ãŒãã¹ãã宿œããŸãããã®ãã£ãŒãããã¯ã¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããã¢ããªã±ãŒã·ã§ã³ãã°ããŒãã«ãªãŒãã£ãšã³ã¹ã®ããŒãºãæºããããã«ããããã«éåžžã«è²Žéã§ãããã£ãŒãããã¯ãã©ãŒã ãšã¢ã³ã±ãŒããè€æ°ã®èšèªã«ç¿»èš³ããŸãããã¹ãã宿œããå Žåã¯ãåã¿ãŒã²ããåžå Žã§äžè¬çã«äœ¿çšãããŠãããã¯ãããžãŒãèæ ®ããŠãããŸããŸãªããã€ã¹ãšç»é¢ãµã€ãºãèæ ®ããŠãã ãããã¢ããªã±ãŒã·ã§ã³å šäœã®æ¹åç¹ãç¹å®ããããã«ããŠãŒã¶ããªãã£ãšãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®ãã¹ããæ€èšããŠãã ããã
é«åºŠãªãã¯ããã¯ïŒåºæ¬ãè¶ ããŠ
åºæ¬ã«æ £ããããå ç¢ãªãšã©ãŒåŠçã®ããã®ããé«åºŠãªãã¯ããã¯ãæ¢æ±ããŠãã ããã
1. ã«ã¹ã¿ã ãšã©ãŒåŠçããã¯
ã«ã¹ã¿ã Reactããã¯ãäœæããŠããšã©ãŒåŠçããžãã¯ãã«ãã»ã«åããã³ã³ããŒãã³ãå šäœã§åå©çšããŸããããã¯ãã³ãŒããDRYïŒDon't Repeat YourselfïŒã«ä¿ã¡ãä¿å®æ§ãåäžãããã®ã«åœ¹ç«ã¡ãŸããããšãã°ãAPIãªã¯ãšã¹ããšã©ãŒãåŠçããããã¯ãããšã©ãŒã¡ãã»ãŒãžã®è¡šç€ºã管çããããã¯ãäœæã§ããŸããããã«ãããããžãã¯ãéäžåããç¹°ãè¿ããæå°éã«æããããšã§ãã¢ããªã±ãŒã·ã§ã³å šäœã®ãšã©ãŒåŠçãåçåãããŸãã
äŸïŒ
import { useState, useCallback } from 'react';
function useApiRequest(apiCall) {
const [data, setData] = useState(null);
const [error, setError] = useState(null);
const [loading, setLoading] = useState(false);
const fetchData = useCallback(async (...args) => {
setLoading(true);
try {
const result = await apiCall(...args);
setData(result);
setError(null);
} catch (err) {
setError(err);
setData(null);
} finally {
setLoading(false);
}
}, [apiCall]);
return { data, error, loading, fetchData };
}
// Usage
function MyComponent() {
const { data, error, loading, fetchData } = useApiRequest(async () => {
const response = await fetch('/api/data');
if (!response.ok) {
throw new Error('Network response was not ok');
}
return await response.json();
});
useEffect(() => {
fetchData();
}, [fetchData]);
if (loading) return Loading...
;
if (error) return Error: {error.message}
;
if (!data) return null;
return Data: {data.value}
;
}
2. ç¶æ 管çã©ã€ãã©ãªãšã®çµ±å
ã¢ããªã±ãŒã·ã§ã³ãReduxãZustandãªã©ã®ç¶æ 管çã©ã€ãã©ãªã䜿çšããŠããå Žåã¯ããšã©ãŒåŠçãç¶æ 管çããžãã¯ã«çµ±åããŸããããã«ããããšã©ãŒç¶æ ãäžå çã«ç®¡çããã¢ã¯ã·ã§ã³ããã£ã¹ãããããŠäžè²«ããæ¹æ³ã§ãšã©ãŒãåŠçã§ããŸãããšã©ãŒæ å ±ã¯ã°ããŒãã«ç¶æ ã«ä¿åã§ããå¿ èŠãªã³ã³ããŒãã³ãããã¢ã¯ã»ã¹ã§ããŸãããã®æŠç¥ã«ããããšã©ãŒç¶æ ã®åäžã®ä¿¡é Œã§ããæ å ±æºãç¶æã§ãããããã¢ããªã±ãŒã·ã§ã³å šäœã§åé¡ã远跡ããã³è§£æ±ºããã®ãç°¡åã«ãªããŸããã¢ã¯ã·ã§ã³ããã£ã¹ãããããããšã«ãããç¶æ ã®å€æŽã¯ãšã©ãŒç¶æ ã«ãµãã¹ã¯ã©ã€ããããŠããã³ã³ããŒãã³ãã®æŽæ°ãããªã¬ãŒããŸãããã®é£æºããåŠçã«ããããšã©ãŒãçºçããå Žåã«ãã¹ãŠã®ã³ã³ããŒãã³ããäžè²«ããŠå¿çããããšãä¿èšŒãããŸãã
äŸïŒReduxïŒïŒ
// actions.js
export const fetchData = () => async (dispatch) => {
dispatch({ type: 'FETCH_DATA_REQUEST' });
try {
const response = await fetch('/api/data');
const data = await response.json();
dispatch({ type: 'FETCH_DATA_SUCCESS', payload: data });
} catch (error) {
dispatch({ type: 'FETCH_DATA_FAILURE', payload: error });
}
};
// reducers.js
const initialState = {
data: null,
loading: false,
error: null,
};
const rootReducer = (state = initialState, action) => {
switch (action.type) {
case 'FETCH_DATA_REQUEST':
return { ...state, loading: true, error: null };
case 'FETCH_DATA_SUCCESS':
return { ...state, loading: false, data: action.payload, error: null };
case 'FETCH_DATA_FAILURE':
return { ...state, loading: false, error: action.payload };
default:
return state;
}
};
export default rootReducer;
3. ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒããã³éçãµã€ãçæïŒSSGïŒã§ã®ãšã©ãŒåŠç
Reactã§SSRãŸãã¯SSGïŒäŸïŒNext.jsãGatsbyïŒã䜿çšããŠããå Žåããšã©ãŒåŠçã«ã¯ç¹å¥ãªèæ ®ãå¿ èŠã§ãããµãŒããŒåŽã®ããŒã¿ãã§ããã³ã°ãšã¬ã³ããªã³ã°äžã«ãšã©ãŒãåŠçããŠãå éšãšã©ãŒãã¯ã©ã€ã¢ã³ãã«å ¬éãããªãããã«ããŸããããã«ã¯éåžžããšã©ãŒãçºçããå Žåã«ãµãŒããŒã«ãã©ãŒã«ããã¯ããŒãžã衚瀺ããããšãå«ãŸããŸããé©åãªãšã©ãŒã³ãŒãïŒäŸïŒHTTPã¹ããŒã¿ã¹ã³ãŒãïŒã䜿çšããŠããšã©ãŒãã¯ã©ã€ã¢ã³ãã«äŒããŸãããšã©ãŒå¢çãå®è£ ããã¯ã©ã€ã¢ã³ãåŽã§ããšã©ãŒãåŠçããŠãã·ãŒã ã¬ã¹ãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããŸããSSR/SSGã³ã³ããã¹ãã§ã®æ éãªãšã©ãŒåŠçã«ããããŠãŒã¶ãŒã«ã¯æ£åžžãªãã©ãŒã«ããã¯ããŒãžã衚瀺ããããµãŒããŒã§çºçããåé¡ãé©åã«ãã°ã«èšé²ããã察åŠãããããšãä¿èšŒãããŸããããã«ããããµãŒããŒåŽã®ããã»ã¹ã§åé¡ãçºçããå Žåã§ããã¢ããªã±ãŒã·ã§ã³ã®å¯çšæ§ãšããžãã£ããªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãç¶æãããŸãã
çµè«ïŒã°ããŒãã«ã«å埩åã®ããReactã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯
Reactã§å¹æçãªãšã©ãŒåŠçãå®è£ ããããšã¯ãå ç¢ã§ãŠãŒã¶ãŒãã¬ã³ããªãŒãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«éåžžã«éèŠã§ãããšã©ãŒå¢çãã¢ãŒããã¯ãã£ãã¿ãŒã³ãããã³ã°ããŒãã«ãªãã¹ããã©ã¯ãã£ã¹ã掻çšããããšã«ããããšã©ãŒãé©åã«åŠçãããŠãŒã¶ãŒã®å Žæãã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠããæ¡ä»¶ã«é¢ä¿ãªããããžãã£ããªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããå埩åã®ããã³ã³ããŒãã³ããäœæã§ããŸãããããã®ãã¯ããã¯ãæ¡çšããŠãã¢ããªã±ãŒã·ã§ã³ãä¿¡é Œæ§ãé«ããä¿å®ãããããã°ããŒãã«Webã®èª²é¡ã«å¯Ÿå¿ã§ããããšã確èªããŠãã ããã
ã¢ããªã±ãŒã·ã§ã³ãç¶ç¶çã«ç£èŠãããã£ãŒãããã¯ãåéããæœåšçãªåé¡ãåé¿ããããã«ããšã©ãŒåŠçæŠç¥ãç¶ç¶çã«æ¹åããããšãå¿ããªãã§ãã ããããšã©ãŒåŠçã¯ã1åéãã®ä¿®æ£ã§ã¯ãªããç¶ç¶çãªããã»ã¹ã§ããã¢ããªã±ãŒã·ã§ã³ãé²åããã«ã€ããŠããšã©ãŒã®å¯èœæ§ãé«ãŸããŸãããšã©ãŒã«ããã¢ã¯ãã£ãã«å¯ŸåŠããå ç¢ãªãšã©ãŒå埩ã¡ã«ããºã ãå®è£ ããããšã«ãããäžçäžã®ãŠãŒã¶ãŒãä¿¡é Œã§ããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãããããã®ãã¿ãŒã³ãçè§£ããŠå®è£ ããããšã«ãããæ©èœçã§ããã ãã§ãªããã°ããŒãã«èŠæš¡ã§å埩åãããããŠãŒã¶ãŒãã¬ã³ããªãŒãªReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã匷åãªãšã©ãŒåŠçæŠç¥ã®æ§ç¯ã«æè³ããåŽåã¯ããŠãŒã¶ãŒã®æºè¶³åºŠãã¢ããªã±ãŒã·ã§ã³ã®å®å®æ§ãããã³å šäœçãªæåã«åœ¹ç«ã¡ãŸãã