Reactã®experimental_useOptimisticããã¯ãæ¢æ±ãã忿޿°ããçããç«¶åç¶æ ã®å¯ŸåŠæ³ãåŠã³ãŸããããŒã¿æŽåæ§ã確ä¿ããã¹ã ãŒãºãªãŠãŒã¶ãŒäœéšãå®çŸããæŠç¥ãçè§£ããŸãããã
Reactã®experimental_useOptimisticã«ãããç«¶åç¶æ ïŒåææŽæ°ã®ãã³ããªã³ã°
Reactã®experimental_useOptimisticããã¯ã¯ãéåæåŠçãé²è¡äžã§ããéã«å³æãã£ãŒãããã¯ãæäŸããããšã§ããŠãŒã¶ãŒäœéšãåäžããã匷åãªæ¹æ³ã§ãããããããã®æ¥œèгçãªã¢ãããŒãã¯ãè€æ°ã®æŽæ°ãåæã«é©çšãããéã«ç«¶åç¶æ
ãåŒãèµ·ããããšããããŸãããã®èšäºã§ã¯ããã®åé¡ã®è€éããæãäžãã忿޿°ãå
ç¢ã«åŠçããããŒã¿ã®æŽåæ§ãšã¹ã ãŒãºãªãŠãŒã¶ãŒäœéšã確ä¿ããããã®æŠç¥ããã°ããŒãã«ãªèªè
ã«åããŠæäŸããŸãã
experimental_useOptimisticãçè§£ãã
ç«¶åç¶æ
ã«é£ã³èŸŒãåã«ãexperimental_useOptimisticãã©ã®ããã«æ©èœããããç°¡åã«æ¯ãè¿ããŸãããããã®ããã¯ã䜿çšãããšã察å¿ãããµãŒããŒãµã€ãã®æäœãå®äºããåã«ãå€ã楜芳çã«UIã«æŽæ°ã§ããŸããããã«ããããŠãŒã¶ãŒã«ã¯å³æã®ã¢ã¯ã·ã§ã³ãå®è¡ããããã®ãããªå°è±¡ãäžããå¿çæ§ãé«ããŸããäŸãã°ããŠãŒã¶ãŒãæçš¿ã«ããããããããå ŽåãèããŠã¿ãŸãããããµãŒããŒããããããã確èªããã®ãåŸ
ã€ä»£ããã«ãUIãå³åº§ã«æŽæ°ããŠæçš¿ããããããããããšè¡šç€ºãããµãŒããŒããšã©ãŒãå ±åããå Žåã«ã¯å
ã«æ»ãããšãã§ããŸãã
åºæ¬çãªäœ¿ãæ¹ã¯æ¬¡ã®ããã«ãªããŸãïŒ
const [optimisticValue, addOptimisticValue] = experimental_useOptimistic(
originalValue,
(currentState, newValue) => {
// çŸåšã®ç¶æ
ãšæ°ããå€ã«åºã¥ããŠæ¥œèгçãªæŽæ°ãè¿ã
return newValue;
}
);
originalValueã¯åæç¶æ
ã§ãã2çªç®ã®åŒæ°ã¯æ¥œèŠ³çæŽæ°é¢æ°ã§ãçŸåšã®ç¶æ
ãšæ°ããå€ãåãåããæ¥œèгçã«æŽæ°ãããç¶æ
ãè¿ããŸããaddOptimisticValueã¯ãæ¥œèŠ³çæŽæ°ãããªã¬ãŒããããã«åŒã³åºãããšãã§ãã颿°ã§ãã
ç«¶åç¶æ ãšã¯äœãïŒ
ç«¶åç¶æ
ã¯ãããã°ã©ã ã®çµæãè€æ°ã®ããã»ã¹ãã¹ã¬ããã®äºæž¬äžå¯èœãªé åºãã¿ã€ãã³ã°ã«äŸåããå Žåã«çºçããŸããexperimental_useOptimisticã®æèã§ã¯ãè€æ°ã®æ¥œèŠ³çæŽæ°ãåæã«ããªã¬ãŒãããããã«å¯Ÿå¿ãããµãŒããŒãµã€ãã®æäœãéå§ãããé åºãšã¯ç°ãªãé åºã§å®äºããå Žåã«ç«¶åç¶æ
ãçºçããŸããããã«ãããããŒã¿ãäžæŽåã«ãªãããŠãŒã¶ãŒäœéšãæ··ä¹±ããå¯èœæ§ããããŸãã
ãŠãŒã¶ãŒãããããããã¿ã³ãçŽ æ©ãè€æ°åã¯ãªãã¯ããã·ããªãªãèããŠã¿ãŸããããåã¯ãªãã¯ã¯æ¥œèŠ³çæŽæ°ãããªã¬ãŒããUIã®ãããããã«ãŠã³ããå³åº§ã«ã€ã³ã¯ãªã¡ã³ãããŸããããããåãããããã«å¯ŸãããµãŒããŒãªã¯ãšã¹ãã¯ããããã¯ãŒã¯ã®é å»¶ããµãŒããŒã®åŠçé å»¶ã«ãããç°ãªãé åºã§å®äºããå¯èœæ§ããããŸãããªã¯ãšã¹ããé åºéãã«å®äºããªãå Žåãæçµçã«ãŠãŒã¶ãŒã«è¡šç€ºããããããããã«ãŠã³ããäžæ£ç¢ºã«ãªãããšããããŸãã
äŸïŒã«ãŠã³ã¿ãŒã0ããå§ãŸããšããŸãããŠãŒã¶ãŒã¯ã€ã³ã¯ãªã¡ã³ããã¿ã³ãçŽ æ©ã2åã¯ãªãã¯ããŸãã2ã€ã®æ¥œèŠ³çæŽæ°ããã£ã¹ããããããŸããæåã®æŽæ°ã¯`0 + 1 = 1`ã§ã2çªç®ã¯`1 + 1 = 2`ã§ãããããããã2åç®ã®ã¯ãªãã¯ã«å¯ŸãããµãŒããŒãªã¯ãšã¹ãã1åç®ãããå ã«å®äºããå ŽåããµãŒããŒã¯å€ãå€ã«åºã¥ããŠç¶æ ã誀ã£ãŠ`0 + 1 = 1`ãšããŠä¿åãããã®åŸãæåã«å®äºãããªã¯ãšã¹ããåã³`0 + 1 = 1`ãšããŠäžæžãããå¯èœæ§ããããŸãããŠãŒã¶ãŒã¯æçµçã«`2`ã§ã¯ãªã`1`ãèŠãããšã«ãªããŸãã
experimental_useOptimisticã«ãããç«¶åç¶æ ã®ç¹å®
ç«¶åç¶æ ãç¹å®ããã®ã¯é£ããããšããããŸãããªããªãããããã¯ãã°ãã°æç¶çã§ãã¿ã€ãã³ã°èŠå ã«äŸåããããã§ããããããããã€ãã®äžè¬çãªå åããã®ååšã瀺ãããšããããŸãïŒ
- UIç¶æ ã®äžæŽåïŒUIãå®éã®ãµãŒããŒãµã€ãã®ããŒã¿ãåæ ããªãå€ã衚瀺ããã
- äºæãã¬ããŒã¿ã®äžæžãïŒããŒã¿ãå€ãå€ã§äžæžããããããŒã¿æå€±ã«ã€ãªããã
- UIèŠçŽ ã®ç¹æ» ïŒç°ãªãæ¥œèŠ³çæŽæ°ãé©çšããããå ã«æ»ããããããã«ã€ããŠãUIèŠçŽ ãã¡ãã€ããããæ¥éã«å€åãããããã
ç«¶åç¶æ ã广çã«ç¹å®ããããã«ã以äžãæ€èšããŠãã ããïŒ
- ãã®ã³ã°ïŒæ¥œèŠ³çæŽæ°ãããªã¬ãŒãããé åºãšãããã«å¯Ÿå¿ãããµãŒããŒãµã€ãã®æäœãå®äºããé åºã远跡ããããã«ã詳现ãªãã®ã³ã°ãå®è£ ããŸããåæŽæ°ã«ã¯ã¿ã€ã ã¹ã¿ã³ããšäžæã®èå¥åãå«ããŸãã
- ãã¹ãïŒåææŽæ°ãã·ãã¥ã¬ãŒãããUIã®ç¶æ ãäžè²«æ§ãä¿ã€ããšãæ€èšŒããçµ±åãã¹ããäœæããŸããããã«ã¯JestãReact Testing Libraryã®ãããªããŒã«ã圹ç«ã¡ãŸããã¢ãã¯ã©ã€ãã©ãªã䜿çšããŠãæ§ã ãªãããã¯ãŒã¯é å»¶ããµãŒããŒå¿çæéãã·ãã¥ã¬ãŒãããããšãæ€èšããŠãã ããã
- ã¢ãã¿ãªã³ã°ïŒæ¬çªç°å¢ã§ã®UIã®äžæŽåãããŒã¿ã®äžæžãã®é »åºŠã远跡ããããã®ã¢ãã¿ãªã³ã°ããŒã«ãå®è£ ããŸããããã«ãããéçºäžã«ã¯æããã«ãªããªãã£ãæœåšçãªç«¶åç¶æ ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
- ãŠãŒã¶ãŒãã£ãŒãããã¯ïŒUIã®äžæŽåãããŒã¿æå€±ã«é¢ãããŠãŒã¶ãŒããã®å ±åã«æ³šæãæããŸãããŠãŒã¶ãŒãã£ãŒãããã¯ã¯ãèªåãã¹ãã§ã¯æ€åºãã«ããæœåšçãªç«¶åç¶æ ã«é¢ãã貎éãªæŽå¯ãæäŸããããšããããŸãã
忿޿°ãåŠçããããã®æŠç¥
experimental_useOptimisticã䜿çšããéã®ç«¶åç¶æ
ãç·©åããããã«ãããã€ãã®æŠç¥ãæ¡çšã§ããŸãã以äžã«æã广çãªã¢ãããŒããããã€ã玹ä»ããŸãïŒ
1. ãããŠã³ã¹ãšã¹ããããªã³ã°
ãããŠã³ã¹ã¯ã颿°ãå®è¡ãããé »åºŠãå¶éããŸãã颿°ãæåŸã«åŒã³åºãããŠããäžå®æéãçµéãããŸã§ããã®é¢æ°ã®åŒã³åºããé å»¶ãããŸããæ¥œèŠ³çæŽæ°ã®æèã§ã¯ããããŠã³ã¹ã¯æ¥éã§é£ç¶çãªæŽæ°ãããªã¬ãŒãããã®ãé²ããç«¶åç¶æ ã®å¯èœæ§ãæžãããŸãã
ã¹ããããªã³ã°ã¯ã颿°ãæå®ãããæéå ã«æå€§ã§1åããåŒã³åºãããªãããšãä¿èšŒããŸããããã«ããã颿°åŒã³åºãã®é »åºŠã調æŽããã·ã¹ãã ã«éè² è·ããããã®ãé²ããŸããæŽæ°ãèš±å¯ãã€ã€ããå¶åŸ¡ãããã¬ãŒãã§è¡ãããå Žåã«åœ¹ç«ã¡ãŸãã
ãããŠã³ã¹é¢æ°ã䜿çšããäŸã§ãïŒ
import { useCallback } from 'react';
import { debounce } from 'lodash'; // ãŸãã¯ã«ã¹ã¿ã ã®ãããŠã³ã¹é¢æ°
function MyComponent() {
const handleClick = useCallback(
debounce(() => {
addOptimisticValue(currentState => currentState + 1);
// ããã§ãµãŒããŒã«ãªã¯ãšã¹ããéä¿¡
}, 300), // 300msã§ãããŠã³ã¹
[addOptimisticValue]
);
return ;
}
2. ã·ãŒã±ã³ã¹çªå·ä»ã
忥œèŠ³çæŽæ°ã«äžæã®ã·ãŒã±ã³ã¹çªå·ãå²ãåœãŠãŸãããµãŒããŒãå¿çããéã«ããã®å¿çãææ°ã®ã·ãŒã±ã³ã¹çªå·ã«å¯Ÿå¿ããŠãããã確èªããŸããå¿çãé åºéãã§ãªãå Žåã¯ç Žæ£ããŸããããã«ãããææ°ã®æŽæ°ã®ã¿ãé©çšãããããšãä¿èšŒãããŸãã
ã·ãŒã±ã³ã¹çªå·ä»ããå®è£ ããæ¹æ³ã¯æ¬¡ã®ãšããã§ãïŒ
import { useRef, useCallback, useState } from 'react';
function MyComponent() {
const [value, setValue] = useState(0);
const [optimisticValue, addOptimisticValue] = experimental_useOptimistic(value, (state, newValue) => newValue);
const sequenceNumber = useRef(0);
const handleIncrement = useCallback(() => {
const currentSequenceNumber = ++sequenceNumber.current;
addOptimisticValue(value + 1);
// ãµãŒããŒãªã¯ãšã¹ããã·ãã¥ã¬ãŒã
simulateServerRequest(value + 1, currentSequenceNumber)
.then((data) => {
if (data.sequenceNumber === sequenceNumber.current) {
setValue(data.value);
} else {
console.log("å€ãå¿çãç Žæ£ããŸã");
}
});
}, [value, addOptimisticValue]);
async function simulateServerRequest(newValue, sequenceNumber) {
// ãããã¯ãŒã¯é
å»¶ãã·ãã¥ã¬ãŒã
await new Promise(resolve => setTimeout(resolve, Math.random() * 500));
return { value: newValue, sequenceNumber: sequenceNumber };
}
return (
å€: {optimisticValue}
);
}
ãã®äŸã§ã¯ãåæŽæ°ã«ã·ãŒã±ã³ã¹çªå·ãå²ãåœãŠãããŸãããµãŒããŒã®å¿çã«ã¯ã察å¿ãããªã¯ãšã¹ãã®ã·ãŒã±ã³ã¹çªå·ãå«ãŸããŠããŸããå¿çãåãåã£ããšããã³ã³ããŒãã³ãã¯ã·ãŒã±ã³ã¹çªå·ãçŸåšã®ã·ãŒã±ã³ã¹çªå·ãšäžèŽãããã©ããããã§ãã¯ããŸããäžèŽããã°æŽæ°ãé©çšãããããã§ãªããã°æŽæ°ã¯ç Žæ£ãããŸãã
3. æŽæ°ã®ããã®ãã¥ãŒã®äœ¿çš
ä¿çäžã®æŽæ°ã®ãã¥ãŒãç¶æããŸããæŽæ°ãããªã¬ãŒãããããããããã¥ãŒã«è¿œå ããŸãããã¥ãŒããé çªã«æŽæ°ãåŠçããéå§ãããé åºã§é©çšãããããã«ããŸããããã«ãããé åºãçã£ãæŽæ°ã®å¯èœæ§ãæé€ããŸãã
æŽæ°ã«ãã¥ãŒã䜿çšããäŸã§ãïŒ
import { useState, useCallback, useRef, useEffect } from 'react';
function MyComponent() {
const [value, setValue] = useState(0);
const [optimisticValue, addOptimisticValue] = experimental_useOptimistic(value, (state, newValue) => newValue);
const updateQueue = useRef([]);
const isProcessing = useRef(false);
const processQueue = useCallback(async () => {
if (isProcessing.current || updateQueue.current.length === 0) {
return;
}
isProcessing.current = true;
const nextUpdate = updateQueue.current.shift();
const newValue = nextUpdate();
try {
// ãµãŒããŒãªã¯ãšã¹ããã·ãã¥ã¬ãŒã
const result = await simulateServerRequest(newValue);
setValue(result);
} finally {
isProcessing.current = false;
processQueue(); // ãã¥ãŒã®æ¬¡ã®é
ç®ãåŠç
}
}, [setValue]);
useEffect(() => {
processQueue();
}, [processQueue]);
const handleIncrement = useCallback(() => {
addOptimisticValue(value + 1);
updateQueue.current.push(() => value + 1);
processQueue();
}, [value, addOptimisticValue, processQueue]);
async function simulateServerRequest(newValue) {
// ãããã¯ãŒã¯é
å»¶ãã·ãã¥ã¬ãŒã
await new Promise(resolve => setTimeout(resolve, Math.random() * 500));
return newValue;
}
return (
å€: {optimisticValue}
);
}
ãã®äŸã§ã¯ãåæŽæ°ããã¥ãŒã«è¿œå ãããŸããprocessQueue颿°ã¯ããã¥ãŒããé çªã«æŽæ°ãåŠçããŸããisProcessingãªãã¡ã¬ã³ã¹ã¯ãè€æ°ã®æŽæ°ãåæã«åŠçãããã®ãé²ããŸãã
4. åªçïŒã¹ããšãïŒãªæäœ
ãµãŒããŒãµã€ãã®æäœãåªçïŒã¹ããšãïŒã§ããããšã確èªããŠãã ãããåªçãªæäœã¯ãæåã®é©çšä»¥éãäœåºŠé©çšããŠãçµæãå€ãããŸãããäŸãã°ãå€ãèšå®ããããšã¯åªçã§ãããå€ãã€ã³ã¯ãªã¡ã³ãããããšã¯ããã§ã¯ãããŸããã
æäœãåªçã§ããã°ãç«¶åç¶æ ã¯ããŸãåé¡ã«ãªããŸãããæŽæ°ãé åºéãã«é©çšãããªããŠããæçµçãªçµæã¯åãã«ãªããŸããã€ã³ã¯ãªã¡ã³ãæäœãåªçã«ããã«ã¯ãã€ã³ã¯ãªã¡ã³ãåœä»€ã§ã¯ãªããç®çã®æçµå€ããµãŒããŒã«éä¿¡ããŸãã
äŸïŒããããæ°ãã€ã³ã¯ãªã¡ã³ãããããªã¯ãšã¹ããéä¿¡ãã代ããã«ãããããæ°ãXã«èšå®ããããªã¯ãšã¹ããéä¿¡ããŸãããµãŒããŒããã®ãããªãªã¯ãšã¹ããè€æ°åä¿¡ããå Žåããªã¯ãšã¹ããåŠçãããé åºã«é¢ä¿ãªããæçµçãªãããããæ°ã¯åžžã«Xã«ãªããŸãã
5. ããŒã«ããã¯ä»ãã®æ¥œèгçãã©ã³ã¶ã¯ã·ã§ã³
ããŒã«ããã¯ã¡ã«ããºã ãå«ã楜芳çãã©ã³ã¶ã¯ã·ã§ã³ãå®è£ ããŸããæ¥œèŠ³çæŽæ°ãé©çšãããããå ã®å€ãä¿åããŠãããŸãããµãŒããŒããšã©ãŒãå ±åããå Žåã¯ãå ã®å€ã«æ»ããŸããããã«ãããUIã®ç¶æ ããµãŒããŒãµã€ãã®ããŒã¿ãšäžè²«æ§ãä¿ã€ããšãä¿èšŒãããŸãã
æŠå¿µçãªäŸã§ãïŒ
import { useState, useCallback } from 'react';
function MyComponent() {
const [value, setValue] = useState(0);
const [optimisticValue, addOptimisticValue] = experimental_useOptimistic(value, (state, newValue) => newValue);
const [previousValue, setPreviousValue] = useState(value);
const handleIncrement = useCallback(() => {
setPreviousValue(value);
addOptimisticValue(value + 1);
simulateServerRequest(value + 1)
.then(newValue => {
setValue(newValue);
})
.catch(() => {
// ããŒã«ããã¯
setValue(previousValue);
addOptimisticValue(previousValue); //ä¿®æ£ãããå€ã§æ¥œèгçã«åã¬ã³ããªã³ã°
});
}, [value, addOptimisticValue, previousValue]);
async function simulateServerRequest(newValue) {
// ãããã¯ãŒã¯é
å»¶ãã·ãã¥ã¬ãŒã
await new Promise(resolve => setTimeout(resolve, Math.random() * 500));
// æœåšçãªãšã©ãŒãã·ãã¥ã¬ãŒã
if (Math.random() < 0.2) {
throw new Error("ãµãŒããŒãšã©ãŒ");
}
return newValue;
}
return (
å€: {optimisticValue}
);
}
ãã®äŸã§ã¯ãæ¥œèŠ³çæŽæ°ãé©çšãããåã«ãå
ã®å€ãpreviousValueã«ä¿åãããŸãããµãŒããŒããšã©ãŒãå ±åããå Žåãã³ã³ããŒãã³ãã¯å
ã®å€ã«æ»ããŸãã
6. äžå€æ§ïŒImmutabilityïŒã®äœ¿çš
äžå€ãªããŒã¿æ§é ãæ¡çšããŸããäžå€æ§ã«ãããããŒã¿ãçŽæ¥å€æŽãããªãããšãä¿èšŒãããŸãã代ããã«ãç®çã®å€æŽãå ããããŒã¿ã®æ°ããã³ããŒãäœæãããŸããããã«ããã倿Žã®è¿œè·¡ã以åã®ç¶æ ãžã®åŸ©åž°ã容æã«ãªããç«¶åç¶æ ã®ãªã¹ã¯ãæžå°ããŸãã
ImmerãImmutable.jsã®ãããªJavaScriptã©ã€ãã©ãªã¯ãäžå€ããŒã¿æ§é ãæ±ãã®ã«åœ¹ç«ã¡ãŸãã
7. ããŒã«ã«ç¶æ ã§ã®ãªããã£ãã¹ãã£ãã¯UI
experimental_useOptimisticã ãã«é Œãã®ã§ã¯ãªããããŒã«ã«ç¶æ
ã§æ¥œèŠ³çæŽæ°ã管çããããšãæ€èšããŠãã ãããããã«ãããæŽæ°ããã»ã¹ããã詳现ã«å¶åŸ¡ã§ãã忿޿°ãåŠçããããã®ã«ã¹ã¿ã ããžãã¯ãå®è£
ã§ããŸãããããã·ãŒã±ã³ã¹çªå·ä»ãããã¥ãŒã€ã³ã°ãªã©ã®ãã¯ããã¯ãšçµã¿åãããããšã§ãããŒã¿ã®æŽåæ§ã確ä¿ã§ããŸãã
8. çµææŽåæ§
çµææŽåæ§ãåãå ¥ããŸããUIã®ç¶æ ãäžæçã«ãµãŒããŒãµã€ãã®ããŒã¿ãšåæããŠããªãå¯èœæ§ãããããšã蚱容ããŸããã¢ããªã±ãŒã·ã§ã³ããã®ç¶æ³ãåªé ã«åŠçã§ããããã«èšèšããŸããäŸãã°ããµãŒããŒãæŽæ°ãåŠçããŠããéã¯ããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã衚瀺ããŸããããŒã¿ãããã€ã¹éã§å³åº§ã«äžè²«ããªãå¯èœæ§ãããããšããŠãŒã¶ãŒã«äŒããŸãã
ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®ããã®ãã¹ããã©ã¯ãã£ã¹
ã°ããŒãã«ãªãŠãŒã¶ãŒåãã®ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããå Žåããããã¯ãŒã¯é å»¶ãã¿ã€ã ãŸãŒã³ãèšèªã®ããŒã«ãªãŒãŒã·ã§ã³ãšãã£ãèŠçŽ ãèæ ®ããããšãéèŠã§ãã
- ãããã¯ãŒã¯é å»¶ïŒããŒã¿ãããŒã«ã«ã«ãã£ãã·ã¥ããããã³ã³ãã³ãé ä¿¡ãããã¯ãŒã¯ïŒCDNïŒã䜿çšããŠå°ççã«åæ£ãããµãŒããŒããã³ã³ãã³ããé ä¿¡ãããªã©ããããã¯ãŒã¯é å»¶ã®åœ±é¿ãç·©åããæŠç¥ãå®è£ ããŸãã
- ã¿ã€ã ãŸãŒã³ïŒç°ãªãã¿ã€ã ãŸãŒã³ã®ãŠãŒã¶ãŒã«ããŒã¿ãæ£ç¢ºã«è¡šç€ºãããããã«ãã¿ã€ã ãŸãŒã³ãæ£ããåŠçããŸããä¿¡é Œã§ããã¿ã€ã ãŸãŒã³ããŒã¿ããŒã¹ã䜿çšããMoment.jsãdate-fnsã®ãããªã©ã€ãã©ãªã䜿çšããŠã¿ã€ã ãŸãŒã³å€æãç°¡çŽ åããããšãæ€èšããŸãã
- ããŒã«ãªãŒãŒã·ã§ã³ïŒè€æ°ã®èšèªãå°åããµããŒãããããã«ãã¢ããªã±ãŒã·ã§ã³ãããŒã«ã©ã€ãºããŸããi18nextãReact Intlã®ãããªããŒã«ãªãŒãŒã·ã§ã³ã©ã€ãã©ãªã䜿çšããŠã翻蚳ã管çãããŠãŒã¶ãŒã®ãã±ãŒã«ã«å¿ããŠããŒã¿ããã©ãŒãããããŸãã
- ã¢ã¯ã»ã·ããªãã£ïŒé害ãæã€ãŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ã§ããããã«ããŸããWCAGãªã©ã®ã¢ã¯ã»ã·ããªãã£ã¬ã€ãã©ã€ã³ã«åŸãã誰ããã¢ããªã±ãŒã·ã§ã³ã䜿çšã§ããããã«ããŸãã
çµè«
experimental_useOptimisticã¯ãŠãŒã¶ãŒäœéšãåäžããã匷åãªæ¹æ³ãæäŸããŸãããç«¶åç¶æ
ã®å¯èœæ§ãçè§£ãã察åŠããããšãäžå¯æ¬ ã§ãããã®èšäºã§æŠèª¬ããæŠç¥ãå®è£
ããããšã§ã忿޿°ãæ±ãå Žåã§ããã¹ã ãŒãºã§äžè²«ãããŠãŒã¶ãŒäœéšãæäŸããå
ç¢ã§ä¿¡é Œæ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããããŒã¿ã®äžè²«æ§ããšã©ãŒãã³ããªã³ã°ããŠãŒã¶ãŒãã£ãŒãããã¯ãåªå
ããã¢ããªã±ãŒã·ã§ã³ãäžçäžã®ãŠãŒã¶ãŒã®ããŒãºãæºããããã«ããããšãå¿ããªãã§ãã ãããæ¥œèŠ³çæŽæ°ãšæœåšçãªäžæŽåãšã®éã®ãã¬ãŒããªããæ
éã«æ€èšããã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®èŠä»¶ã«æãé©ããã¢ãããŒããéžæããŠãã ããã忿޿°ã®ç®¡çã«ç©æ¥µçã«åãçµãããšã§ãç«¶åç¶æ
ãããŒã¿ç Žæã®ãªã¹ã¯ãæå°éã«æããªãããexperimental_useOptimisticã®èœåãæŽ»çšã§ããŸãã