ãã©ã¦ã¶ã® JavaScript å®è¡ããã¼ã¯ãNode.js åæ§ event loop ã«åºã¥ãã¦ãã¾ãã
event loop ã®åä½ãçè§£ãããã¨ã¯æé©åã®ããã«ã¯éè¦ã§ãããé©åãªã¢ã¼ããã¯ãã£ã«ã¨ã£ã¦ãéè¦ã§ããå ´åãããã¾ãã
ãã®ãã£ãã¿ã¼ã§ã¯ãæåã«ãããã©ã®ããã«åä½ãããã«ã¤ãã¦çè«çãªè©³ç´°ã説æããæ¬¡ã«ãã®ç¥èã®å®è·µçãªä½¿ç¨ä¾ãè¦ã¦ããã¾ãã
Event Loop
event loop ã®ã³ã³ã»ããã¯é常ã«ã·ã³ãã«ã§ããç¡éã«ã¼ãã§ JavaScript ã¨ã³ã¸ã³ã¯ã¿ã¹ã¯ãå¾ æ©ããããããå®è¡ããã¾ã次ã®ã¿ã¹ã¯ãå¾ æ©ãã¾ãã
ã¨ã³ã¸ã³ã®ä¸è¬çãªã¢ã«ã´ãªãºã ã¯æ¬¡ã®éãã§ã:
- ã¿ã¹ã¯ãããé:
- æãå¤ãã¿ã¹ã¯ããéå§ããããããå®è¡ãã¾ãã
- ã¿ã¹ã¯ãç¾ããã¾ã§ã¹ãªã¼ãããç¾ãã㨠1. ã«é²ã¿ã¾ãã
ããã¯ããã¼ã¸ãé²è¦§ããã¨ãã«è¦ããããã¨ã®å½¢å¼åã§ããJavaScript ã¨ã³ã¸ã³ã¯ã¹ã¯ãªãã/ãã³ãã©/ã¤ãã³ããã¢ã¯ãã£ãã«ãªã£ãå ´åã«ã®ã¿å®è¡ãããã»ã¨ãã©ã®æéä½ããã¾ããã
ã¿ã¹ã¯ã®ä¾:
- å¤é¨ã¹ã¯ãªãã
<script src="...">ãèªã¿è¾¼ã¾ããã¨ããâã¿ã¹ã¯â ã¯ãããå®è¡ãããã¨ã§ãã - ã¦ã¼ã¶ããã¦ã¹ãåããã¨ããâã¿ã¹ã¯â ã¯
mousemoveã¤ãã³ãããã£ã¹ããããããã³ãã©ãå®è¡ãããã¨ã§ãã setTimeoutã§ã¹ã±ã¸ã¥ã¼ã«ãããæéãããã¨ããâã¿ã¹ã¯â ã¯ãã®ã³ã¼ã«ããã¯ãå®è¡ãããã¨ã§ãã- â¦ç
ã¿ã¹ã¯ãè¨å®ãããã¨ã³ã¸ã³ãããããå¦çãããã¨ãä»ã®ã¿ã¹ã¯ãå¾ æ©ãã¾ã(ã¹ãªã¼ãç¶æ ã§ CPU ã®æ¶è²»ã¯ã»ã¼ã¼ãã§ã)ã
ã¿ã¹ã¯ã¯ã¨ã³ã¸ã³ããã¸ã¼ãªã¨ãã«æ¥ããã¨ãããããã®æã¯ãã¥ã¼ã«å ¥ãããã¾ãã
ã¿ã¹ã¯ã¯ãã¥ã¼ããããã âmacrotask queue(ãã¯ãã¿ã¹ã¯ãã¥ã¼) (v8ç¨èª)â ãå½¢æãã¾ãã
ä¾ãã°ãã¨ã³ã¸ã³ã script ã®å®è¡ã§ãã¸ã¼ã§ããéã«ã¦ã¼ã¶ããã¦ã¹ãç§»åãã㦠mousemove ãå¼ãèµ·ãããããsetTimeout ã®å®è¡äºå®ãæ¥ããããã¨ããããã®ã¿ã¹ã¯ã¯ä¸ã®å³ã«ç¤ºãããã«ãã¥ã¼ãå½¢æãã¾ãã
ãã¥ã¼ã®ã¿ã¹ã¯ã¯ âå
çé â ã§å¦çããã¾ããã¨ã³ã¸ã³ã script ãå®äºãããã¨ãmousemove ã¤ãã³ããå¦çããæ¬¡ã« setTimeout ãã³ãã©ãå®è¡ãã¦ããã¾ãã
ããã¾ã§ã¯ã¨ã¦ãç°¡åã§ããã
ãã¨2ã¤è©³ç´°ã§ã:
- ã¨ã³ã¸ã³ãã¿ã¹ã¯ãå®è¡ãã¦ããéãã¬ã³ããªã³ã°ã¯çºçãã¾ãããã¿ã¹ã¯ãæéãããããã©ããã¯é¢ä¿ããã¾ãããDOM ã¸ã®å¤æ´ã¯ã¿ã¹ã¯ãå®äºããå¾ã«ã®ã¿æç»ããã¾ãã
- ã¿ã¹ã¯ã«æéãããããããå ´åããã©ã¦ã¶ã¯ä»ã®ã¿ã¹ã¯ã®å®è¡ãã¦ã¼ã¶ã¤ãã³ãã®å¦çãã§ããªãããããã°ãããã㨠âãã¼ã¸ãå¿çãã¦ãã¾ããâ ã¨ãã£ãè¦åã表示ãããã¼ã¸å ¨ä½ã®ã¿ã¹ã¯ãå¼·å¶çµäºãããã©ããã訪ãã¾ããããã¯è¤éãªè¨ç®ã夿°ããå ´åããç¡éã«ã¼ãã«é¥ããããªããã°ã©ã ãã¹ã«ããå¼ãèµ·ãããã¾ãã
ããã¾ã§ã¯çè«ã§ãããæ¬¡ãããã®ç¥èãã©ãã®ããã«é©ç¨ã§ãããè¦ã¦ããã¾ãããã
ã¦ã¼ã¹ã±ã¼ã¹1: CPUã大éã«æ¶è²»ããã¿ã¹ã¯ã®åå²
大éã«CPUãé£ãã¿ã¹ã¯ãããã¨ãã¾ãããã
ä¾ãã°ãã·ã³ã¿ãã¯ã¹ãã¤ã©ã¤ã(ãã®ãã¼ã¸ã®ã³ã¼ãä¾ãè²ä»ãããããã«ä½¿ç¨ãã¦ãã¾ã)ã¯ãããªãCPUè² è·ããããã¾ããã³ã¼ãããã¤ã©ã¤ãããããã«åæãè¡ããå¤ãã®è²ä»ããããè¦ç´ ãçæããããã¥ã¡ã³ãã«è¿½å ãã¾ããããã¹ãéãå¤ãå ´åã«ã¯å¤ãã®æéãå¿ è¦ã§ãã
ã¨ã³ã¸ã³ãã·ã³ã¿ãã¯ã¹ãã¤ã©ã¤ããããã®ã«å¿ããéã¯ãä»ã®DOMé¢é£ã®å¦çãã¦ã¼ã¶ã¤ãã³ãã®å¦çãªã©ãè¡ããã¨ã¯ã§ãã¾ãããã¾ãããã©ã¦ã¶ãå°ãã®é â䏿忢â ããã âãã³ã°â ããå¯è½æ§ãããã¾ãããããã¯åãå ¥ãããã¾ããã
ãã®åé¡ã«é¢ãã¦ã¯ã大ããªã¿ã¹ã¯ãç´°ããåå²ãããã¨ã§åé¿ãå¯è½ã§ããæåã« 100 è¡ããã¤ã©ã¤ãå¦çããæ¬¡ã« setTimeout (é
å»¶ã¼ãã§)ã§æ¬¡ã®100è¡ãå¦çããããã¹ã±ã¸ã¥ã¼ã«ãã¦ããã¾ãã
ãã®ã¢ããã¼ãã®ãã¢ã«ã¤ãã¦ã¯ãç°¡åã«ããããã«ã·ã³ã¿ãã¯ã¹ãã¤ã©ã¤ãã§ã¯ãªãã1 ãã 1000000000 ã¾ã§ãã«ã¦ã³ããã颿°ãåãä¸ãã¾ãã
以ä¸ã®ã³ã¼ããå®è¡ããã¨ãã¨ã³ã¸ã³ã¯ãã°ãã âãã³ã°â ãã¾ãããµã¼ããµã¤ãã® JS ã®å ´åã¯é¡èã§ãããã©ã¦ã¶ã§å®è¡ãã¦ããå ´åã«ã¯ããã¼ã¸ä¸ã®ä»ã®ãã¿ã³ãã¯ãªãã¯ãããã¨ãã¦ã¿ã¦ãã ãããã«ã¦ã³ããçµäºããã¾ã§ãä»ã®ã¤ãã³ããå¦çãããªããã¨ã確èªã§ãã¾ãã
let i = 0;
let start = Date.now();
function count() {
// éãå¦çãå®è¡
for (let j = 0; j < 1e9; j++) {
i++;
}
alert("Done in " + (Date.now() - start) + 'ms');
}
count();
ãã©ã¦ã¶ã¯ âã¹ã¯ãªããã®å®è¡ã«æéãããã£ã¦ãã¾ãâ ã¨ããè¦åã表示ããããããã¾ããã
ãã¹ãããã setTimeout ã使ã£ã¦ãã®ã¸ã§ããåå²ãã¾ããã:
let i = 0;
let start = Date.now();
function count() {
// éãå¦çã®ä¸é¨ãå®è¡ (*)
do {
i++;
} while (i % 1e6 != 0);
if (i == 1e9) {
alert("Done in " + (Date.now() - start) + 'ms');
} else {
setTimeout(count); // æ°ããªå¼ã³åºããã¹ã±ã¸ã¥ã¼ã« (**)
}
}
count();
ããã§ âã«ã¦ã³ãâ å¦çã®éããã©ã¦ã¶ã®æä½ã¯å®å ¨ã«æ©è½ãã¾ãã
count ã1åå®è¡ããã¨ã¸ã§ã (*)ã®ä¸é¨ãå®è¡ãããå¿
è¦ã«å¿ã㦠(**) ã§åã¹ã±ã¸ã¥ã¼ã«ãè¡ããã¾ãã:
- æåã®å®è¡ã«ã¦ã³ã:
i=1...1000000. - 2åç®ã®å®è¡ã«ã¦ã³ã:
i=1000001..2000000. - â¦ãªã©ãªã©.
ä»ãã¨ã³ã¸ã³ããã¼ã1ã®å®è¡ã§ãã¸ã¼ãªæä¸ã«æ°ããªå¥ã®ã¿ã¹ã¯(e.g. onclick ã¤ãã³ã)ãçºçããå ´åããã¥ã¼ã«å
¥ããããå¾ããã¼ã1ãçµãã£ãã¨ã(次ã®ãã¼ããå§ã¾ãå)ã«å®è¡ããã¾ããcount å®è¡éã§ã® event loop ã¸ã®å®æçãªæ»ãã«ãããJavaScript ã¨ã³ã¸ã³ã¯ä»ã®ã¦ã¼ã¶æä½ã«åå¿ããããã®åå㪠âã¿ã¤ãã³ã°â ãæã«ãã¾ãã
注ç®ãã¹ãç¹ã¯ã両æ¹ã®ãã¿ã¼ã³(setTimeout ã§ã¸ã§ããåå²ããå ´åã¨ããã§ãªãå ´å)ã®é度ãåçã§ãããã¨ã§ããå
¨ä½ãã«ã¦ã³ãããæéã«å¤§ããªå·®ã¯ããã¾ããã
ããå·®ãè¿ã¥ããããã«æ¹åãã¾ãããã
count() ã®å
é ã«ã¹ã±ã¸ã¥ã¼ãªã³ã°ã®å¦çãç§»åããã¾ã:
let i = 0;
let start = Date.now();
function count() {
// å
é ã«ã¹ã±ã¸ã¥ã¼ãªã³ã°ãç§»åããã
if (i < 1e9 - 1e6) {
setTimeout(count); // æ°ããªå¼ã³åºãã®ã¹ã±ã¸ã¥ã¼ã«
}
do {
i++;
} while (i % 1e6 != 0);
if (i == 1e9) {
alert("Done in " + (Date.now() - start) + 'ms');
}
}
count();
ããã§ãcount() ãéå§ãããã« count() ãå¿
è¦ã§ãããã¨ãåããã¨ãã¸ã§ããå®è¡ããåã«ããã«ã¹ã±ã¸ã¥ã¼ãªã³ã°ãã¾ãã
å®è¡ããã¨ãæéãå¤§å¹ ã«ç縮ããããã¨ãåããã¾ãã
ãªãã§ããã?
ç°¡åãªãã¨ã§ã: ãåç¥ã®ããã«ãå¤ãã®ãã¹ãããã setTimeout å¼ã³åºãã®å ´åããã©ã¦ã¶å
ã§ æå°ã§ã4msã¨ããé
å»¶ãããã¾ãããã¨ã 0 ã«è¨å®ãã¦ã 4ms (ã¾ãã¯ãã以ä¸)ã«ãªãã¾ãããããã£ã¦ãæ©ãã¹ã±ã¸ã¥ã¼ã«ããã»ã©å®è¡ã¯æ©ããªãã¾ãã
ããã§CPUã大éã«æ¶è²»ããã¿ã¹ã¯ãåå²ã§ãã¾ãããããã§ã¦ã¼ã¶ã¤ã³ã¿ãã§ã¼ã¹ã¯ãããã¯ããã¾ãããããã¦å ¨ä½ã®å®è¡æéãããã»ã©é·ãããã¾ããã
ã¦ã¼ã¹ã±ã¼ã¹2: é²è¡ç¶æ³ã®è¡¨ç¤º
ãã©ã¦ã¶ã¹ã¯ãªããã®éãã¿ã¹ã¯ãåå²ããããä¸ã¤ã®ã¡ãªããã¯é²è¡ç¶æ³ã表示ãããã¨ãã§ãããã¨ã§ãã
é常ããã©ã¦ã¶ã¯ç¾å¨ã®ã³ã¼ããå®äºããå¾ã«ã¬ã³ããªã³ã°ãã¾ããã¿ã¹ã¯ã«æéãããã£ããã©ããã¯é¢ä¿ããã¾ãããDOM ã¸ã®å¤æ´ã¯ã¿ã¹ã¯ãçµäºããå¾ã«ã ãè¡ããã¾ãã
䏿¹ãããã¯ç´ æ´ããããã¨ã§ãããã¾ãããªããªãæã ã使ãã颿°ã¯å¤ãã®è¦ç´ ãçæãããã1ã¤1ã¤ããã¥ã¡ã³ãã«è¿½å ããããã¾ããããã®ã¹ã¿ã¤ã«ã夿´ããå¯è½æ§ãããã¾ããã訪åè ããã® âä¸éâ â æªå®äºç¶æ ãè¦ããã¨ã¯ããã¾ãããããã¯éè¦ãªãã¨ã§ãã
ããã¯ãã®ãã¢ã§ããi ã¸ã®å¤æ´ã¯é¢æ°ãçµäºããã¾ã§è¦ãã¾ããããªã®ã§ãæå¾ã®å¤ã ããè¦ãã¾ã:
<div id="progress"></div>
<script>
function count() {
for (let i = 0; i < 1e6; i++) {
i++;
progress.innerHTML = i;
}
}
count();
</script>
â¦ã§ãããã¿ã¹ã¯ã®æä¸ã«ããã°ã¬ã¹ãã¼ãªã©ä½ã表示ãããå ´åãããã¾ãã
setTimeout ã使ã£ã¦éãã¿ã¹ã¯ãå°ããªåä½ã«åå²ããã¨ããããã®éã§å¤æ´ãæç»ããã¾ã:
ããã¯ãããã«è¦ãã¾ã:
<div id="progress"></div>
<script>
let i = 0;
function count() {
// éãå¦çã®ä¸é¨ãå®è¡ (*)
do {
i++;
progress.innerHTML = i;
} while (i % 1e3 != 0);
if (i < 1e7) {
setTimeout(count);
}
}
count();
</script>
ããã§ <div> ã«ã¯ããã°ã¬ã¹ãã¼ã®ãããªãi ã®å¤ã®å¢å ã表示ããã¾ãã
ã¦ã¼ã¹ã±ã¼ã¹3: ã¤ãã³ãã®å¾ã«ãªã«ãããã
ã¤ãã³ããã³ãã©ã®ä¸ã§ã¯ãã¤ãã³ããããã«ã¢ãããã¦ãã¹ã¦ã®é層ã§å¦çãããã¾ã§ããã¤ãã®å¦çãå»¶æããããã¨ãã§ãã¾ããé
å»¶ã¼ãã® setTimeout ã§ã©ãããããã¨ã§å®ç¾ã§ãã¾ãã
ãã£ãã¿ã¼ ã«ã¹ã¿ã ã¤ãã³ãã®ãã£ã¹ããã ã§è¦ãä¾: ã«ã¹ã¿ã ã¤ãã³ã menu-open 㯠setTimeout ã§ãã£ã¹ããããããããããã®ã¤ãã³ã㯠âclickâ ã¤ãã³ããå®å
¨ã«å¦çãããå¾ã«çºçãã¾ãã
menu.onclick = function() {
// ...
// ã¯ãªãã¯ãããã¡ãã¥ã¼é
ç®ã®ã«ã¹ã¿ã ã¤ãã³ãã使
let customEvent = new CustomEvent("menu-open", {
bubbles: true
});
// éåæã§ã«ã¹ã¿ã ã¤ãã³ãããã£ã¹ããã
setTimeout(() => menu.dispatchEvent(customEvent));
};
Macrotasks 㨠Microtasks
ãã®ãã£ãã¿ã¼ã§èª¬æãã macrotasks ã¨ä½µãã¦ããã£ãã¿ã¼ Microtasks ã§è¨åãã microtasks ãåå¨ãã¾ãã
Microtasks ã¯é常㯠promise ã«ãã£ã¦ä½æããã.then/catch/finally ãã³ãã©ã®å®è¡ã¯ microtask ã«ãªãã¾ããMicrotask ã¯åæ§ã« promise ãã³ããªã³ã°ã®å¥ã®å½¢ã® await ã®ä¸ã§ã使ç¨ããã¦ãã¾ãã
Microtask ãã¥ã¼ã§å®è¡ããããã« func ããã¥ã¼ãã queueMicrotask(func) ã¨ããç¹å¥ãªé¢æ°ãããã¾ãã
ãã¹ã¦ã® macrotask ã®ç´å¾ã«ãã¨ã³ã¸ã³ã¯ä»ã® macrotask ãã¬ã³ããªã³ã°ãªã©ãå®è¡ããåã« microtask ãã¥ã¼ã«ãããã¹ã¦ã®ã¿ã¹ã¯ãå®è¡ãã¾ãã
ä¾ãã°ãããè¦ã¦ãã ãã:
setTimeout(() => alert("timeout"));
Promise.resolve()
.then(() => alert("promise"));
alert("code");
ããã§ã®é çªã¯ã©ããªãã§ãããï¼
- é常ã®åæå¼ã³åºãã§ãã
codeãæåã«è¡¨ç¤ºã¾ãã promiseãæ¬¡ã«è¡¨ç¤ºããã¾ãããªããªãã.then㯠microtask ãã¥ã¼ãéãã¦ãç¾å¨ã®ã³ã¼ãã®å¾ã«å®è¡ãããããã§ãã- macrotask ã§ãã
timeoutãæå¾ã«è¡¨ç¤ºããã¾ãã
ãã詳ããã¤ãã³ãã«ã¼ãã¯æ¬¡ã®ããã«ãªãã¾ã:
ãã¹ã¦ã® microtask ã¯ä»ã®ã¤ãã³ããã³ããªã³ã°ãã¬ã³ããªã³ã°ãã¾ãã¯ä»ã® macrotask ãè¡ãããåã«å®äºãã¾ãã
ãã㯠microtask éã§ã¢ããªã±ã¼ã·ã§ã³ç°å¢ãåºæ¬çã«ã¯åã(ãã¦ã¹åº§æ¨ã®å¤æ´ãæ°ãããããã¯ã¼ã¯ãã¼ã¿ãªã©ããªããã¨)ã§ãããã¨ãä¿è¨¼ããããéè¦ãªãã¨ã§ãã
(ç¾å¨ã®ã³ã¼ãã®å¾ã«)颿°ãéåæã«å®è¡ããããã夿´ãã¬ã³ããªã³ã°ããããæ°ããã¤ãã³ããå¦çãããåãããå ´åã¯ãqueueMicrotask ã§ã¹ã±ã¸ã¥ã¼ãªã³ã°ãããã¨ãã§ãã¾ãã
ããã«ä»¥åã«ç¤ºãããã®ã¨é¡ä¼¼ã® âã«ã¦ã³ãããããã°ã¬ã¹ãã¼â ã®ä¾ãããã¾ãããsetTimeout ã®ä»£ããã« queueMicrotask ã使ç¨ããã¦ãã¾ããããã§ã¯åæã³ã¼ãã®ããã«ãã¬ã³ããªã³ã°ãæå¾ã«è¡ããã¦ãããã¨ããããã¾ã:
<div id="progress"></div>
<script>
let i = 0;
function count() {
// éãå¦çã®ä¸é¨ãå®è¡ (*)
do {
i++;
progress.innerHTML = i;
} while (i % 1e3 != 0);
if (i < 1e6) {
queueMicrotask(count);
}
}
count();
</script>
ãµããª
ã¤ãã³ãã«ã¼ãã®ãã詳細ãªã¢ã«ã´ãªãºã (仿§ã¨æ¯ã¹ãã¨ç°¡ç´ åããã¦ãã¾ãã):
- macrotask ãã¥ã¼ã«ããæãå¤ãã¿ã¹ã¯(e.g âã¹ã¯ãªããâ)ãåãåºãã¦å®è¡ãã¾ãã
- ãã¹ã¦ã® microtask ãå®è¡ãã¾ãã
- microtask ãã¥ã¼ã空ã§ãªãé
- æãå¤ã microtask ãåãåºãã¦å®è¡ãã¾ãã
- microtask ãã¥ã¼ã空ã§ãªãé
- 夿´ãããå ´åã¯ã¬ã³ããªã³ã°ãã¾ãã
- macrotask ãã¥ã¼ã空ã§ããã°ãmacrotask ãç¾ããã¾ã§å¾ ã¡ã¾ãã
- ã¹ããã1 ã«æ»ãã¾ãã
æ°ãã macrotask ãã¹ã±ã¸ã¥ã¼ã«ããã«ã¯:
- é
å»¶ã¼ãã®
setTimeout(f)ã使ç¨ãã¾ãã
ããã¯ããã©ã¦ã¶ãã¦ã¼ã¶ã¼ã¤ãã³ãã«åå¿ããããã¿ã¹ã¯ã®é²æç¶æ³ã表示ãããã¨ãã§ãããããè¨ç®éã®å¤ãã¿ã¹ã¯ãå°ããåå²ããããã«ä½¿ç¨ããã¾ãã
ã¾ããã¤ãã³ããå®å ¨ã«å¦çããã(ãããªã³ã°ãå®äºãã)å¾ã«ã¢ã¯ã·ã§ã³ãè¡ãããã¹ã±ã¸ã¥ã¼ã«ããããã«ãã¤ãã³ããã³ãã©å ã§ã使ããããã¨ãããã¾ãã
æ°ãã microtask ãã¹ã±ã¸ã¥ã¼ã«ããã«ã¯:
queueMicrotask(f)ã使ç¨ãã¾ãã- ã¾ããpromise ãã³ãã©ã¯ microtask ãã¥ã¼ã§å¦çããã¾ãã
microtask éã§ã¯ UI ããããã¯ã¼ã¯ã¤ãã³ãã®å¦çã¯ããã¾ãã: ãããã¯ããã«æ¬¡ã ã¨å®è¡ããã¾ãã
ã¤ãã³ãã«ã¼ãããããã¯ãã¦ã¯ãªããªãé·ãéãè¨ç®ã«å¯¾ãã¦ã¯ãWeb Workers ãå©ç¨ãããã¨ãã§ãã¾ãã
ããã¯ä¸¦åã¹ã¬ããã§ã³ã¼ããå®è¡ããæ¹æ³ã§ãã
Web Worker ã¯ã¡ã¤ã³ããã»ã¹ã¨ã¡ãã»ã¼ã¸ã交æãããã¨ãã§ãã¾ãããç¬èªã®å¤æ°ã¨ã¤ãã³ãã«ã¼ããæã¡ã¾ãã
Web Worker 㯠DOM ã«ã¯ã¢ã¯ã»ã¹ã§ããªãã®ã§ã主ã«è¨ç®ã®ããã«è¤æ°ã®CPUã³ã¢ãåæã«ä½¿ç¨ããã®ã«å½¹ç«ã¡ã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã