vanilla js ui race conditions (vrm vs live2d)
4
总安装量
0
周安装量
#50663
全站排名
安装命令
npx skills add https://github.com/project-n-e-k-o/n.e.k.o --skill 'Vanilla JS UI Race Conditions (VRM vs Live2D)'
Skill 文档
åºå¯¹åç JS ä¸ç DOM ç«æä¸ä¹è§æ´æ°é·é±
çç¶
- çé¢ç»ä»¶ï¼å¦ä¾§è¾¹æ ãHUDï¼å¨é¡µé¢å次å è½½æ¶ç±äºä¸¢å¤±ç¶æè䏿¾ç¤ºï¼ä½æå¨äº¤äºååè½å¼¹åºã
- çé¢å¨å¼å¯åå ³éä¹é´åçéªçï¼æè æ æ³éè¿ä»£ç æ£ç¡®å ³éã
- ç»å®å¨ DOM å ç´ ä¸çäºä»¶çå¬å¨æªè½è§¦åã
æ ¹æ¬åå
åå 1: ä¸å模å/模åç DOM æå è½½æ¶æºä¸ä¸è´
- é®é¢: å¨å¤ç跨模åï¼å¦ Live2D å VRMï¼ææ¨¡åååºç¨æ¶ï¼æäºå¼¹çªä¼å¨é¦æ¬¡ç¹å»æ¶æ createElementï¼æå è½½ï¼ã
- 为ä»ä¹åç: æ§è½ä¼åå¯¼è´ DOM å¹¶éä¸ä¸æ¥å°±å¨ HTML éãå¦æä½¿ç¨åºå®ç setTimeout(…, 100) 廿å DOM ç»å®äºä»¶ï¼æå¤§æ¦çä¼é¢ä¸´æç©ºï¼DOM è¿æªçæï¼ã
- è§£å³æ¹æ¡: 使ç¨èªæç»ç»çéå½è½®è¯¢æ¿ä»£æ»çã
åå 2: ä¹è§ UI (Optimistic UI) ä¸åºå±ç¶æçç«æå²çª
- é®é¢: ç¨æ·ç¹å»å¼å ³åï¼å端ä¹è§å°å°æé®ç½®ä¸ºå¼å¯å¹¶é带å¨ç»ï¼åæ¶åå端å起请æ±ãä½å¨å端è¿åçå® lag ä¹åï¼å¦æå ¶ä»ç»ä»¶ï¼å¦è½®è¯¢ç Appï¼æ ¹æ®ç©ºå端æè é»è®¤çé误 DOM è¢«è§¦åæ£æ¥ï¼ä¼äº§çäºç¸è¦çç BUGã
- 为ä»ä¹åç: 缺ä¹ç»ä¸çååæ°æ®æµã
- è§£å³æ¹æ¡: å¨è¯»åæºå¤´ç¶ææ¶ï¼å¤æ UI æ¯å¦å¤äº disabledï¼å è½½ä¸ï¼ã妿æ¯ï¼åä¼å ä¿¡ä»» gent_ui_v2 ç¼åç optimistic ç¶ææå端ç¼å machineFlagsï¼è䏿¯ç²ç®ç¸ä¿¡å建ç«ä¸å°æªåæ¥ç DOM èç¹ã
代ç è§£å³æ¹æ¡
1. åºå¯¹æå è½½ DOM çç»å®è½®è¯¢ï¼å®å ¨å¯é ï¼
`javascript const bindEvents = () => { // å ¼å®¹å¤ä¸ª ID è§£æ const getEl = (ids) => { for (let id of ids) { const el = document.getElementById(id); if (el) return el; } return null; };
const targetEl = getEl(['live2d-agent-keyboard', 'vrm-agent-keyboard']);
// å¦ææ²¡æ¾å°ï¼èªå·±å»ºç«ä¸ä¸ª 500ms åçæ°å®ä»»å¡æ¥éè¯ï¼ç¶å return æ¬æ¬¡ä»»å¡ã
if (!targetEl) {
setTimeout(bindEvents, 500);
return;
}
// æ¾å°äºï¼é¡ºæ¬¡æ§è¡å¹¶ç»æï¼ä¸ä¼çä¸ä»»ä½å®æ¶å¨åå¾
targetEl.addEventListener('change', myLogic);
myLogic(); // æå¨è§¦åç¬¬ä¸æ¬¡æ£æ¥
};
setTimeout(bindEvents, 100); // åå¨ç¬¬ä¸ä¸ `
2. 夿ºç¶æå¤å®é级ï¼é²æ¢è¦çï¼
`javascript const checkState = () => { const isUiInteractive = domCheckbox && !domCheckbox.disabled; let isFeatureOn = false;
if (!isUiInteractive) {
// UI å¨è½¬åå è½½ï¼ä¿¡ä»»ä¹è§ç¶ææå端ç¼å
isFeatureOn = optimisticState !== undefined ? optimisticState : backendFlags;
} else {
// UI å¤äºå¯ç¨äº¤äºæï¼ç¾åç¾ä¿¡ä»»å½å DOM
isFeatureOn = optimisticState !== undefined ? optimisticState : domCheckbox.checked;
}
} `
å ³é®ç»éª
- æ°¸è¿ä¸è¦ç¨ç¡¬ç¼ç ç setTimeout æ¶é¿æ¥åå®æä¸ªèµæºæ DOM ä¸å®ä¼å è½½å®æ¯ã
- å¦ææ²¡æ React è¿ç§ Virtual DOM æ¡æ¶ï¼æå¨å¤çè·¨ç»ä»¶é讯æ¶è¦éæ¶å½å¿å½åèæ¬è¿è¡æ¶ççå® DOM å¿«ç §æ åµã