EventSource
åºçº¿
广æ³å¯ç¨
*
èª 2020å¹´1æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
* æ¤ç¹æ§çæäºé¨åçæ¯æç¨åº¦å¯è½ææä¸åã
EventSource æ¥å£æ¯ web å
容䏿å¡å¨åéäºä»¶éä¿¡çæ¥å£ã
ä¸ä¸ª EventSource å®ä¾ä¼å¯¹ HTTP æå¡å¨å¼å¯ä¸ä¸ªæä¹
åçè¿æ¥ï¼ä»¥ text/event-stream æ ¼å¼åéäºä»¶ï¼æ¤è¿æ¥ä¼ä¸ç´ä¿æå¼å¯ç´å°éè¿è°ç¨ EventSource.close() å
³éã
䏿¦è¿æ¥å¼å¯ï¼æ¥èªæå¡ç«¯ä¼ å
¥çæ¶æ¯ä¼ä»¥äºä»¶çå½¢å¼ååè³ä½ 代ç ä¸ãå¦ææ¥æ¶æ¶æ¯ä¸æä¸ä¸ª event åæ®µï¼è§¦åçäºä»¶ä¸ event åæ®µçå¼ç¸åã妿ä¸åå¨ event åæ®µï¼åå°è§¦åéç¨ç message äºä»¶ã
ä¸ WebSocket ä¸åçæ¯ï¼æå¡å¨åéäºä»¶æ¯ååçãæ°æ®æ¶æ¯åªè½ä»æå¡ç«¯å°åéå°å®¢æ·ç«¯ï¼å¦ç¨æ·çæµè§å¨ï¼ãè¿ä½¿å
¶æä¸ºä¸éè¦ä»å®¢æ·ç«¯å¾æå¡å¨åéæ¶æ¯çæ
åµä¸çæä½³éæ©ãä¾å¦ï¼å¯¹äºå¤çå¦ç¤¾äº¤åªä½ç¶ææ´æ°ãæ¶æ¯æ¥æºï¼news feedï¼æå°æ°æ®ä¼ éå°å®¢æ·ç«¯å卿ºå¶ï¼å¦ IndexedDB æ web åå¨ï¼ä¹ç±»çï¼EventSource æ çæ¯ä¸ä¸ªæææ¹æ¡ã
è¦åï¼å½ä¸ä½¿ç¨ HTTP/2 æ¶ï¼æå¡å¨åéäºä»¶ï¼SSEï¼åå°æå¼è¿æ¥æ°çéå¶ï¼è¿ä¸ªéå¶æ¯å¯¹äºæµè§å¨çï¼å¹¶ä¸è®¾ç½®ä¸ºé常ä½çæ°åï¼6ï¼ï¼æå¼å¤ä¸ªé项塿¶å¯è½ä¼ç¹å«çè¦ãå¨ Chrome å Firefox ä¸ï¼è¿ä¸ªé®é¢å·²è¢«æ 记为âä¸ä¼ä¿®å¤âãè¿ä¸ªéå¶æ¯æ¯ä¸ªæµè§å¨åååçï¼è¿æå³çä½ å¯ä»¥å¨æææ ç¾é¡µä¸æå¼ 6 个 SSE è¿æ¥å° www.example1.comï¼ä»¥åå¦å¤ 6 个 SSE è¿æ¥å° www.example2.comï¼æ¥æºï¼Stackoverflowï¼ãå½ä½¿ç¨ HTTP/2 æ¶ï¼æå¤§å¹¶å HTTP æµçæ°éæ¯ç±æå¡å¨å客æ·ç«¯ååçï¼é»è®¤ä¸º 100ï¼ã
æé 彿°
EventSource()-
å建ä¸ä¸ªæ°ç
EventSourceï¼ç¨äºä»æå®ç URL æ¥æ¶æå¡å¨åéäºä»¶ï¼å¯ä»¥éæ©å¼å¯åæ®æ¨¡å¼ã
å®ä¾å±æ§
æ¤æ¥å£ä»å
¶ç¶æ¥å£ EventTarget ç»§æ¿å±æ§ã
EventSource.readyStateåªè¯»-
ä¸ä¸ªä»£è¡¨è¿æ¥ç¶æçæ°åãå¯è½å¼æ¯
CONNECTINGï¼0ï¼ãOPENï¼1ï¼æCLOSEDï¼2ï¼ã EventSource.urlåªè¯»-
ä¸ä¸ªè¡¨ç¤ºäºä»¶æºç URL å符串ã
EventSource.withCredentialsåªè¯»-
ä¸ä¸ªå¸å°å¼ï¼è¡¨ç¤º
EventSource对象æ¯å¦ä½¿ç¨è·¨æºèµæºå ±äº«ï¼CORSï¼åæ®æ¥å®ä¾åï¼trueï¼ï¼æè ä¸ä½¿ç¨ï¼falseï¼å³é»è®¤å¼ï¼ã
å®ä¾æ¹æ³
æ¤æ¥å£ä¹ä»å
¶ç¶æ¥å£ EventTarget ç»§æ¿äºæ¹æ³ã
EventSource.close()-
å ³éè¿æ¥ï¼å¦ææï¼ï¼å¹¶å°
readyState屿§è®¾ç½®ä¸ºCLOSEDãå¦æè¿æ¥å·²ç»å ³éï¼åè¯¥æ¹æ³ä¸æ§è¡ä»»ä½æä½ã
äºä»¶
error-
å¨äºä»¶æºè¿æ¥æªè½æå¼æ¶è§¦åã
message-
å¨ä»äºä»¶æºæ¥æ¶å°æ°æ®æ¶è§¦åã
open-
å¨ä¸äºä»¶æºçè¿æ¥æå¼æ¶è§¦åã
æ¤å¤ï¼äºä»¶æºæ¬èº«å¯ä»¥åéå ·æ event åæ®µçæ¶æ¯ï¼è¿å°å建ä¸ä¸ªä»¥è¯¥å¼ä¸ºé®çç¹å®äºä»¶ã
示ä¾
å¨è¿ä¸ªåºæ¬çä¾åä¸ï¼å建äºä¸ä¸ª EventSource æ¥ä»æå¡å¨æ¥æ¶æªå½åçäºä»¶ï¼ä¸ä¸ªå为 sse.php ç页é¢è´è´£çæè¿äºäºä»¶ã
const evtSource = new EventSource("sse.php");
const eventList = document.querySelector("ul");
evtSource.onmessage = (e) => {
const newElement = document.createElement("li");
newElement.textContent = `message: ${e.data}`;
eventList.appendChild(newElement);
};
æ¯ä¸ªæ¥æ¶å°çäºä»¶é½ä¼å¯¼è´æä»¬ç EventSource 对象ç onmessage äºä»¶å¤çç¨åºè¿è¡ãå®ä¼å建ä¸ä¸ªæ°ç <li> å
ç´ ï¼å¹¶å°æ¶æ¯çæ°æ®åå
¥å
¶ä¸ï¼ç¶åå°æ°å
ç´ éå å°ææ¡£ä¸å·²æçå表å
ç´ ä¸ã
夿³¨ï¼ä½ å¯ä»¥å¨ Github 䏿¾å°å®æ´ç示ä¾ââä½¿ç¨ PHP è¯è¨çç®å SSE 示ä¾ã
è¦çå¬å ·åäºä»¶ï¼ä½ éè¦ä¸ºæ¯ç§ç±»åçäºä»¶æ·»å ä¸ä¸ªçå¬å¨ã
const sse = new EventSource("/api/v1/sse");
/*
* è¿å°ä»
çå¬ç±»ä¼¼ä¸é¢çäºä»¶
*
* event: notice
* data: useful data
* id: someid
*/
sse.addEventListener("notice", (e) => {
console.log(e.data);
});
/*
* åçï¼ä»¥ä¸ä»£ç å°çå¬å
·æå段 `event: update` çäºä»¶
*/
sse.addEventListener("update", (e) => {
console.log(e.data);
});
/*
* âmessageâäºä»¶æ¯ä¸ä¸ªç¹ä¾ï¼å 为å®å¯ä»¥æè·æ²¡æ event åæ®µçäºä»¶ï¼
* 以åå
·æç¹å®ç±»å `eventï¼message` çäºä»¶ã
* å®ä¸ä¼è§¦åä»»ä½å
¶ä»ç±»åçäºä»¶ã
*/
sse.addEventListener("message", (e) => {
console.log(e.data);
});
è§è
| è§è |
|---|
| HTML > # the-eventsource-interface > |