React ã® experimental_TracingMarker ãããŒãžã£ãŒã§é«åºŠãªããã©ãŒãã³ã¹ãã©ããã³ã°ãäœéšããéçºè ãããã«ããã¯ã广çã«ç¹å®ããŠè§£æ±ºã§ããããã«ããŸãã
React experimental_TracingMarker ãããŒãžã£ãŒïŒããã©ãŒãã³ã¹è¿œè·¡ã®åŸ¹åºè§£èª¬
React ã¯åžžã«é²åããŠãããããã©ãŒãã³ã¹ãšéçºè
ã®ãšã¯ã¹ããªãšã³ã¹ãåäžãããããšãç®çãšãããšããµã€ãã£ã³ã°ãªæ©èœãæäŸãããŠããŸãã ãã®ãããªå®éšçãªæ©èœã® 1 ã€ã experimental_TracingMarker ãããŒãžã£ãŒã§ããããã¯ãé«åºŠãªããã©ãŒãã³ã¹ãã©ããã³ã°çšã«èšèšããã匷åãªããŒã«ã§ãã ãã®ããã°æçš¿ã§ã¯ããã®æ©èœã®è€éããæãäžãããã®ç®çãæ©èœãããã³ React ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŠè§£æ±ºããããã«ã©ã®ããã«äœ¿çšã§ãããã説æããŸãã
ããã©ãŒãã³ã¹è¿œè·¡ãšã¯ïŒ
ããã©ãŒãã³ã¹è¿œè·¡ã¯ãããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããããã«ãã¢ããªã±ãŒã·ã§ã³ã®å®è¡ãç£èŠããã³åæããããã«äœ¿çšãããææ³ã§ãã ã€ãã³ããšããã«é¢é£ä»ããããã¿ã€ã ã¹ã¿ã³ããèšé²ããã³ãŒãã®å®è¡äžã«äœãèµ·ãããã®è©³çްãªã¿ã€ã ã©ã€ã³ãæäŸããŸãã æ¬¡ã«ããã®ããŒã¿ãåæããŠãæéãã©ãã«è²»ããããŠããããçè§£ããæé©åã®é åãç¹å®ã§ããŸãã
React ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããã¹ãã§ã¯ãããã©ãŒãã³ã¹è¿œè·¡ã¯ãã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°ãDOM ã®æŽæ°ãããã³ã€ãã³ããã³ãã©ãŒã®å®è¡ã«ãããæéãçè§£ããã®ã«åœ¹ç«ã¡ãŸãã ãããã®ããã«ããã¯ãç¹å®ããããšã§ãéçºè ã¯ã³ãŒãã®æé©åãå šäœçãªå¿çæ§ãããã³ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®åäžã«ã€ããŠãæ å ±ã«åºã¥ããæ±ºå®ãäžãããšãã§ããŸãã
experimental_TracingMarker ãããŒãžã£ãŒã®ç޹ä»
React ã®å®éšçãªæ©èœã®äžéšã§ãã experimental_TracingMarker ãããŒãžã£ãŒã¯ãæšæºã®ãããã¡ã€ãªã³ã°ããŒã«ãšæ¯èŒããŠãããã©ãŒãã³ã¹è¿œè·¡ã«å¯Ÿãããã詳现ã§å¶åŸ¡ãããã¢ãããŒããæäŸããŸãã ããã«ãããéçºè
ã¯è¿œè·¡ããã³ãŒãã®ç¹å®ã®éšåã衚ãã«ã¹ã¿ã ããŒã«ãŒãå®çŸ©ã§ããŸãã ãããã®ããŒã«ãŒã䜿çšããŠããããã®ã»ã¯ã·ã§ã³ã®å®è¡ã«ãããæéãæž¬å®ããããã©ãŒãã³ã¹ã«é¢ããè©³çŽ°ãªæŽå¯ãåŸãããšãã§ããŸãã
ãã®æ©èœã¯ãç¹ã«æ¬¡ã®çšéã«åœ¹ç«ã¡ãŸãã
- é ãã³ã³ããŒãã³ãã®ç¹å®ïŒã¬ã³ããªã³ã°ã«æãæéãããã£ãŠããã³ã³ããŒãã³ããç¹å®ããŸãã
- è€éãªã€ã³ã¿ã©ã¯ã·ã§ã³ã®åæïŒãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãšç¶æ æŽæ°ã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãçè§£ããŸãã
- æé©åã®å¹æã®æž¬å®ïŒæé©åã®é©çšåŸã«åŸãããããã©ãŒãã³ã¹ã®åäžãå®éåããŸãã
experimental_TracingMarker ãããŒãžã£ãŒã®ä»çµã¿
experimental_TracingMarker ãããŒãžã£ãŒã¯ããã¬ãŒã¹ããŒã«ãŒãäœæããã³ç®¡çããããã®äžé£ã® API ãæäŸããŸãã äž»èŠãªã³ã³ããŒãã³ããšãã®æ©èœã®å
èš³ã¯æ¬¡ã®ãšããã§ãã
TracingMarker(id: string, display: string): TracingMarkerInstanceïŒæ°ãããã¬ãŒã¹ããŒã«ãŒã€ã³ã¹ã¿ã³ã¹ãäœæããŸããidã¯ããŒã«ãŒã®äžæã®èå¥åã§ãããdisplayã¯ãããã¡ã€ãªã³ã°ããŒã«ã«è¡šç€ºããã人éãèªããååã§ããTracingMarkerInstance.begin(): voidïŒçŸåšã®ããŒã«ãŒã€ã³ã¹ã¿ã³ã¹ã®ãã¬ãŒã¹ãéå§ããŸãã ããã«ãããããŒã¯ãããã³ãŒãã»ã¯ã·ã§ã³ã®å®è¡ãéå§ããããšãã®ã¿ã€ã ã¹ã¿ã³ããèšé²ãããŸããTracingMarkerInstance.end(): voidïŒçŸåšã®ããŒã«ãŒã€ã³ã¹ã¿ã³ã¹ã®ãã¬ãŒã¹ãçµäºããŸãã ããã«ãããããŒã¯ãããã³ãŒãã»ã¯ã·ã§ã³ã®å®è¡ãçµäºãããšãã®ã¿ã€ã ã¹ã¿ã³ããèšé²ãããŸããbegin()ãšend()ã®éã®æéå·®ã¯ãããŒã¯ãããã»ã¯ã·ã§ã³ã®å®è¡æéã衚ããŸãã
å®è·µçãªäŸïŒã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°æéã®è¿œè·¡
experimental_TracingMarker ãããŒãžã£ãŒã䜿çšã㊠React ã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°æéã远跡ããæ¹æ³ã説æããŸãããã
ãã®äŸã§ã¯ïŒ
unstable_TracingMarkerãreactããã±ãŒãžããã€ã³ããŒãããŸããuseRefã䜿çšããŠTracingMarkerã€ã³ã¹ã¿ã³ã¹ãäœæããã¬ã³ããªã³ã°å šäœã§æ°žç¶åãããããã«ããŸããuseEffectããã¯ã䜿çšããŠãã³ã³ããŒãã³ããããŠã³ãããããšããããã³ prop ã倿ŽããããšãïŒåã¬ã³ããªã³ã°ãããªã¬ãŒããïŒã«ãã¬ãŒã¹ãéå§ããŸããuseEffectå ã®ã¯ãªãŒã³ã¢ãã颿°ã¯ãã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãããŸãã¯æ¬¡ã®åã¬ã³ããªã³ã°ã®åã«ãã¬ãŒã¹ãçµäºããããšãä¿èšŒããŸããbegin()ã¡ãœããã¯ãã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°ã©ã€ããµã€ã¯ã«ã®éå§æã«åŒã³åºãããend()ã¯çµäºæã«åŒã³åºãããŸãã
ã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°ããžãã¯ã begin() ããã³ end() ã§ã©ããããããšã«ãããã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°ã«ãããæ£ç¢ºãªæéãæž¬å®ã§ããŸãã
React Profiler ããã³ DevTools ãšã®çµ±å
experimental_TracingMarker ã®çŸããã¯ãReact Profiler ããã³ DevTools ãšã®ã·ãŒã ã¬ã¹ãªçµ±åã§ãã ãã¬ãŒã¹ããŒã«ãŒã䜿çšããŠã³ãŒããã€ã³ã¹ãã«ã¡ã³ãåãããšããããã¡ã€ãªã³ã°ããŒã«ã¯ãããã®ããŒã«ãŒã«é¢é£ä»ããããã¿ã€ãã³ã°æ
å ±ã衚瀺ããŸãã
ãã¬ãŒã¹ããŒã¿ã衚瀺ããã«ã¯ïŒ
- React DevTools ãéããŸãã
- [Profiler] ã¿ãã«ç§»åããŸãã
- ãããã¡ã€ãªã³ã°ã»ãã·ã§ã³ãéå§ããŸãã
- ã¢ããªã±ãŒã·ã§ã³ãæäœããŠãã€ã³ã¹ãã«ã¡ã³ãåãããã³ãŒãã»ã¯ã·ã§ã³ãããªã¬ãŒããŸãã
- ãããã¡ã€ãªã³ã°ã»ãã·ã§ã³ã忢ããŸãã
Profiler ã«ã¯ãåã³ã³ããŒãã³ãã§è²»ããããæéã瀺ããã¬ãŒã ãã£ãŒããŸãã¯ã©ã³ã¯ä»ãããããã£ãŒãã衚瀺ãããŸãã å®çŸ©ãããã¬ãŒã¹ããŒã«ãŒã¯ãã³ã³ããŒãã³ãã®ã¿ã€ã ã©ã€ã³å ã®ç¹å®ã®ã»ã°ã¡ã³ããšããŠè¡šç€ºãããç¹å®ã®ã³ãŒããããã¯ã®ããã©ãŒãã³ã¹ã詳现ã«èª¿ã¹ãããšãã§ããŸãã
é«åºŠãªäœ¿çšã·ããªãª
ã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°æéã®è¿œè·¡ã«å ããŠãexperimental_TracingMarker ã¯ããŸããŸãªé«åºŠãªã·ããªãªã§äœ¿çšã§ããŸãã
1. éåææäœã®è¿œè·¡
API åŒã³åºããããŒã¿åŠçãªã©ã®éåææäœã®æéã远跡ããŠãããŒã¿ãã§ããããã³åŠçããžãã¯ã®æœåšçãªããã«ããã¯ãç¹å®ã§ããŸãã
```javascript import React, { useState, useEffect, useRef } from 'react'; import { unstable_TracingMarker as TracingMarker } from 'react'; function DataFetcher() { const [data, setData] = useState(null); const fetchMarkerRef = useRef(new TracingMarker('FetchData', 'Fetch Data from API')); useEffect(() => { async function fetchData() { fetchMarkerRef.current.begin(); const response = await fetch('https://api.example.com/data'); const jsonData = await response.json(); setData(jsonData); fetchMarkerRef.current.end(); } fetchData(); }, []); returnãã®äŸã§ã¯ãAPI ããããŒã¿ããã§ããããã®ã«ãããæéã远跡ããAPI åŒã³åºããããã©ãŒãã³ã¹ã®ããã«ããã¯ã§ãããã©ãããç¹å®ã§ããããã«ããŸãã
2. ã€ãã³ããã³ãã©ãŒã®è¿œè·¡
ã€ãã³ããã³ãã©ãŒã®å®è¡æéã远跡ããŠããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãçè§£ã§ããŸãã ããã¯ãéèŠãªèšç®ãŸã㯠DOM æäœã䌎ãè€éãªã€ãã³ããã³ãã©ãŒã«ç¹ã«åœ¹ç«ã¡ãŸãã
```javascript import React, { useRef } from 'react'; import { unstable_TracingMarker as TracingMarker } from 'react'; function MyButton() { const clickMarkerRef = useRef(new TracingMarker('ButtonClick', 'Button Click Handler')); const handleClick = () => { clickMarkerRef.current.begin(); // äœããã®èšç®è² è·ã®é«ãã¿ã¹ã¯ãå®è¡ããŸã for (let i = 0; i < 1000000; i++) { // ããã«äœããã®èšç®ããããŸã } clickMarkerRef.current.end(); }; return ; } export default MyButton; ```ãã®äŸã§ã¯ããã¿ã³ã¯ãªãã¯ãã³ãã©ãŒã®å®è¡æéã远跡ãããã³ãã©ãŒã®ããžãã¯ãããã©ãŒãã³ã¹ã®åé¡ãåŒãèµ·ãããŠãããã©ãããç¹å®ã§ããããã«ããŸãã
3. Redux ã¢ã¯ã·ã§ã³/ãµã³ã¯ã®è¿œè·¡
Redux ã䜿çšããŠããå Žåã¯ãRedux ã¢ã¯ã·ã§ã³ãŸãã¯ãµã³ã¯ã®å®è¡æéã远跡ããŠãç¶æ æŽæ°ã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãçè§£ã§ããŸãã ããã¯ãå€§èŠæš¡ã§è€é㪠Redux ã¢ããªã±ãŒã·ã§ã³ã«ç¹ã«åœ¹ç«ã¡ãŸãã
```javascript import { unstable_TracingMarker as TracingMarker } from 'react'; const myActionMarker = new TracingMarker('MyReduxAction', 'My Redux Action'); export const myAction = () => { return async (dispatch) => { myActionMarker.begin(); // éåææäœãå®è¡ããŸã await new Promise(resolve => setTimeout(resolve, 100)); dispatch({ type: 'MY_ACTION', payload: 'Data' }); myActionMarker.end(); }; }; ```ãã®äŸã§ã¯ãRedux ãµã³ã¯ã®å®è¡æéã远跡ãããµã³ã¯ã®ããžãã¯ãŸãã¯çµæã®ç¶æ æŽæ°ãããã©ãŒãã³ã¹ã®åé¡ãåŒãèµ·ãããŠãããã©ãããç¹å®ã§ããããã«ããŸãã
experimental_TracingMarker ã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
experimental_TracingMarker ã广çã«äœ¿çšããã«ã¯ã次ã®ãã¹ããã©ã¯ãã£ã¹ãæ€èšããŠãã ããã
- ããããããããŒã«ãŒ ID ã䜿çšããïŒè¿œè·¡ãããŠããã³ãŒãã»ã¯ã·ã§ã³ãæç¢ºã«ç€ºã ID ãéžæããŸãã ããã«ããããããã¡ã€ãªã³ã°ããŒã«ã§ããŒã«ãŒãç°¡åã«èå¥ã§ããŸãã
- é床ã®è¿œè·¡ãé¿ããïŒã³ãŒãã®ãã¹ãŠã®è¡ã远跡ãããšãå§åçãªããŒã¿ã«ã€ãªãããå®éã®ããã«ããã¯ãç¹å®ããã®ãé£ãããªãå¯èœæ§ããããŸãã é¢å¿ã®ããç¹å®ã®é åã®è¿œè·¡ã«çŠç¹ãåœãŠãŸãã
- æ¡ä»¶ä»ã远跡ã䜿çšããïŒç°å¢å€æ°ãŸãã¯ãã£ãŒãã£ãŒãã©ã°ã«åºã¥ããŠè¿œè·¡ãæå¹ãŸãã¯ç¡å¹ã«ã§ããŸãã ããã«ãããæ¬çªç°å¢ã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããããšãªããéçºç°å¢ãŸãã¯ã¹ããŒãžã³ã°ç°å¢ã§ããã©ãŒãã³ã¹ã远跡ã§ããŸãã
- ä»ã®ãããã¡ã€ãªã³ã°ããŒã«ãšçµã¿åãããïŒ
experimental_TracingMarkerã¯ãReact Profiler ã Chrome DevTools ãªã©ã®ä»ã®ãããã¡ã€ãªã³ã°ããŒã«ãè£å®ããŸãã å æ¬çãªããã©ãŒãã³ã¹åæã®ããã«ãçµã¿åãããŠäœ¿çšããŸãã - å®éšçãªãã®ã§ããããšãå¿ããªãã§ãã ããïŒååã瀺ãããã«ããã®æ©èœã¯å®éšçãªãã®ã§ãã API ã¯å°æ¥ã®ãªãªãŒã¹ã§å€æŽãããå¯èœæ§ããããããããã«å¿ããŠã³ãŒããé©å¿ãããæºåãããŠãã ããã
å®éã®äŸãšã±ãŒã¹ã¹ã¿ãã£
experimental_TracingMarker ã¯æ¯èŒçæ°ãããã®ã§ãããããã©ãŒãã³ã¹ãã©ããã³ã°ã®ååã¯ãå€ãã®å®éã®ã·ããªãªã§æ£åžžã«é©çšãããŠããŸãã
äŸ 1ïŒå€§èŠæš¡ãª e ã³ããŒã¹ã¢ããªã±ãŒã·ã§ã³ã®æé©å
ãã倧æ e ã³ããŒã¹äŒç€Ÿã¯ã補å詳现ããŒãžã§ã®ã¬ã³ããªã³ã°æéãé ãããšã«æ°ã¥ããŸããã ããã©ãŒãã³ã¹è¿œè·¡ã䜿çšããŠã補åã®æšå¥šäºé ã衚瀺ããç¹å®ã®ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ã«ããªãã®æéãè²»ãããŠããããšãç¹å®ããŸããã ããã«èª¿æ»ããçµæãã³ã³ããŒãã³ããã¯ã©ã€ã¢ã³ãåŽã§è€éãªèšç®ãå®è¡ããŠããããšãæããã«ãªããŸããã ãããã®èšç®ããµãŒããŒåŽã«ç§»åããçµæããã£ãã·ã¥ããããšã§ã補å詳现ããŒãžã®ã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããŸããã
äŸ 2ïŒãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã®å¿çæ§ã®åäž
ãããœãŒã·ã£ã«ã¡ãã£ã¢ãã©ãããã©ãŒã ã§ãæçš¿ãžã®ãããïŒãã³ã¡ã³ãã®è¿œå ãªã©ããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãžã®å¿çãé å»¶ããŸããã ãããã®ã€ã³ã¿ã©ã¯ã·ã§ã³ã«é¢é£ä»ããããã€ãã³ããã³ãã©ãŒã远跡ããããšã«ãããç¹å®ã®ã€ãã³ããã³ãã©ãŒã倿°ã®äžèŠãªåã¬ã³ããªã³ã°ãããªã¬ãŒããŠããããšãçºèŠããŸããã ã€ãã³ããã³ãã©ãŒã®ããžãã¯ãæé©åããäžèŠãªåã¬ã³ããªã³ã°ãé²ãããšã§ããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã®å¿çæ§ãå€§å¹ ã«åäžãããŸããã
äŸ 3ïŒããŒã¿ããŒã¹ã¯ãšãªã®ããã«ããã¯ã®ç¹å®
ããéèã¢ããªã±ãŒã·ã§ã³ã§ãã¬ããŒãããã·ã¥ããŒãã§ã®ããŒã¿ããŒãæéãé ãããšã«æ°ã¥ããŸããã ããŒã¿ãã§ãã颿°ã®å®è¡æéã远跡ããããšã«ãããç¹å®ã®ããŒã¿ããŒã¹ã¯ãšãªã®å®è¡ã«æéãããã£ãŠããããšãç¹å®ããŸããã ã€ã³ããã¯ã¹ã远å ããã¯ãšãªããžãã¯ãæžãçŽãããšã§ããŒã¿ããŒã¹ã¯ãšãªãæé©åããããŒã¿ããŒãæéãå€§å¹ ã«ççž®ããŸããã
çµè«
experimental_TracingMarker ãããŒãžã£ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«é¢ããããæ·±ãæŽå¯ãåŸãããšããŠãã React éçºè
ã«ãšã£ãŠè²ŽéãªããŒã«ã§ãã éçºè
ãã«ã¹ã¿ã ãã¬ãŒã¹ããŒã«ãŒãå®çŸ©ããæ¢åã®ãããã¡ã€ãªã³ã°ããŒã«ãšçµ±åã§ããããã«ããããšã§ãããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŠè§£æ±ºããããã®åŒ·åãªã¡ã«ããºã ãæäŸããŸãã ãŸã å®éšçãªæ®µéã§ãããReact ã®ããã©ãŒãã³ã¹ãã¹ãã®å€§ããªäžæ©ã§ãããReact ã¢ããªã±ãŒã·ã§ã³ã§ã®ããã©ãŒãã³ã¹æé©åã®å°æ¥ãå£éèŠãããšãã§ããŸãã
experimental_TracingMarker ã詊ããšãã¯ãé¢å¿ã®ããç¹å®ã®é åã®è¿œè·¡ã«çŠç¹ãåœãŠãããããããããŒã«ãŒ ID ã䜿çšããå
æ¬çãªããã©ãŒãã³ã¹åæã®ããã«ä»ã®ãããã¡ã€ãªã³ã°ããŒã«ãšçµã¿åãããããšãå¿ããªãã§ãã ããã ããã©ãŒãã³ã¹ãã©ããã³ã°ææ³ãæ¡çšããããšã§ããŠãŒã¶ãŒã«ãšã£ãŠããé«éã§ãå¿çæ§ãé«ããããæ¥œãã React ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã
å 責äºé ïŒãã®æ©èœã¯å®éšçãªãã®ã§ãããããå°æ¥ã® React ããŒãžã§ã³ã§ API ã倿Žãããå¯èœæ§ããããŸãã ææ°ã®æ å ±ã«ã€ããŠã¯ãåžžã«å ¬åŒã® React ããã¥ã¡ã³ããåç §ããŠãã ããã