JavaScriptã®éåæã€ãã¬ãŒã¿ãã«ããŒãã¡ã¢ãªã«äžãã圱é¿ãæ¢ããå¹ççãªããŒã¿åŠçãšã¢ããªã±ãŒã·ã§ã³ããã©ãŒãã³ã¹åäžã®ããã«éåæã¹ããªãŒã ã®ã¡ã¢ãªäœ¿çšéãæé©åããŸãã
JavaScriptã®éåæã€ãã¬ãŒã¿ãã«ããŒã®ã¡ã¢ãªãžã®åœ±é¿ïŒéåæã¹ããªãŒã ã®ã¡ã¢ãªäœ¿çšé
JavaScriptã«ãããéåæããã°ã©ãã³ã°ã¯ãç¹ã«ãµãŒããŒãµã€ãéçºã®ããã®Node.jsã®å°é ããWebã¢ããªã±ãŒã·ã§ã³ã«ãããå¿çæ§ã®é«ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®å¿ èŠæ§ããããŸããŸãæ®åããŠããŸãã éåæã€ãã¬ãŒã¿ãšéåæãžã§ãã¬ãŒã¿ã¯ãéåæããŒã¿ã®ã¹ããªãŒã ãæ±ãããã®åŒ·åãªã¡ã«ããºã ãæäŸããŸãã ãããããããã®æ©èœãç¹ã«éåæã€ãã¬ãŒã¿ãã«ããŒã®å°å ¥ã«äŒŽãäžé©åãªäœ¿çšã¯ãé倧ãªã¡ã¢ãªæ¶è²»ã«ã€ãªãããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšã¹ã±ãŒã©ããªãã£ã«åœ±é¿ãäžããå¯èœæ§ããããŸãããã®èšäºã§ã¯ãéåæã€ãã¬ãŒã¿ãã«ããŒãã¡ã¢ãªã«äžãã圱é¿ãæãäžããéåæã¹ããªãŒã ã®ã¡ã¢ãªäœ¿çšéãæé©åããããã®æŠç¥ãæäŸããŸãã
éåæã€ãã¬ãŒã¿ãšéåæãžã§ãã¬ãŒã¿ã®çè§£
ã¡ã¢ãªæé©åã«é£ã³èŸŒãåã«ãåºæ¬çãªæŠå¿µãçè§£ããããšãéèŠã§ãïŒ
- éåæã€ãã¬ãŒã¿ïŒ éåæã€ãã¬ãŒã¿ãããã³ã«ã«æºæ ãããªããžã§ã¯ãã§ãã€ãã¬ãŒã¿ã®çµæã«è§£æ±ºããããããã¹ãè¿ã
next()ã¡ãœãããå«ã¿ãŸãããã®çµæã«ã¯ãvalueããããã£ïŒçæãããããŒã¿ïŒãšdoneããããã£ïŒå®äºã瀺ãïŒãå«ãŸããŸãã - éåæãžã§ãã¬ãŒã¿ïŒ
async function*æ§æã§å®£èšããã颿°ã§ãããããã¯èªåçã«éåæã€ãã¬ãŒã¿ãããã³ã«ãå®è£ ããéåæããŒã¿ã¹ããªãŒã ãçæããããã®ç°¡æœãªæ¹æ³ãæäŸããŸãã - éåæã¹ããªãŒã ïŒ éåæã€ãã¬ãŒã¿ãŸãã¯éåæãžã§ãã¬ãŒã¿ã䜿çšããŠéåæã«åŠçãããããŒã¿ã®æµããè¡šãæœè±¡åã§ãã
éåæãžã§ãã¬ãŒã¿ã®ç°¡åãªäŸãèããŠã¿ãŸãããïŒ
async function* generateNumbers(count) {
for (let i = 0; i < count; i++) {
await new Promise(resolve => setTimeout(resolve, 100)); // Simulate async operation
yield i;
}
}
async function main() {
for await (const number of generateNumbers(5)) {
console.log(number);
}
}
main();
ãã®ãžã§ãã¬ãŒã¿ã¯ã100ããªç§ã®é å»¶ã§éåææäœãã·ãã¥ã¬ãŒãããªããã0ãã4ãŸã§ã®æ°å€ãéåæã«çæããŸãã
éåæã¹ããªãŒã ã®ã¡ã¢ãªãžã®åœ±é¿
éåæã¹ããªãŒã ã¯ããã®æ§è³ªäžãæ³šææ·±ã管çããªããšå€§éã®ã¡ã¢ãªãæ¶è²»ããå¯èœæ§ããããŸããããã«ã¯ããã€ãã®èŠå ãå¯äžããŸãïŒ
- ããã¯ãã¬ãã·ã£ãŒïŒ ã¹ããªãŒã ã®ã³ã³ã·ã¥ãŒãïŒæ¶è²»è ïŒããããã¥ãŒãµïŒçç£è ïŒãããé ãå ŽåãããŒã¿ãã¡ã¢ãªå ã«èç©ãããã¡ã¢ãªäœ¿çšéã®å¢å ã«ã€ãªããå¯èœæ§ããããŸããé©åãªããã¯ãã¬ãã·ã£ãŒåŠçã®æ¬ åŠã¯ãã¡ã¢ãªåé¡ã®äž»èŠãªåå ã§ãã
- ãããã¡ãªã³ã°ïŒ äžéæäœã¯ãããŒã¿ãåŠçããåã«å éšã§ãããã¡ãªã³ã°ããããšããããã¡ã¢ãªãããããªã³ããå¢å ãããå¯èœæ§ããããŸãã
- ããŒã¿æ§é ïŒ éåæã¹ããªãŒã åŠçãã€ãã©ã€ã³å ã§äœ¿çšãããããŒã¿æ§é ã®éžæã¯ãã¡ã¢ãªäœ¿çšéã«åœ±é¿ãäžããå¯èœæ§ããããŸããäŸãã°ã倧ããªé åãã¡ã¢ãªå ã«ä¿æããããšã¯åé¡ãšãªãããšããããŸãã
- ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒ JavaScriptã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒGCïŒã¯éèŠãªåœ¹å²ãæãããŸããäžèŠã«ãªã£ããªããžã§ã¯ããžã®åç §ãä¿æãç¶ãããšãGCãã¡ã¢ãªãè§£æŸããã®ã劚ããŸãã
éåæã€ãã¬ãŒã¿ãã«ããŒã®ç޹ä»
éåæã€ãã¬ãŒã¿ãã«ããŒïŒäžéšã®JavaScriptç°å¢ãããªãã£ã«ãéããŠå©çšå¯èœïŒã¯ãé
åã®mapãfilterãreduceã®ãããªã¡ãœããã«äŒŒããéåæã€ãã¬ãŒã¿ãæ±ãããã®äžé£ã®ãŠãŒãã£ãªãã£ã¡ãœãããæäŸããŸãããããã®ãã«ããŒã¯éåæã¹ããªãŒã åŠçããã䟿å©ã«ããŸãããè³¢æã«äœ¿çšããªããšã¡ã¢ãªç®¡çã®èª²é¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
éåæã€ãã¬ãŒã¿ãã«ããŒã®äŸã«ã¯ã以äžã®ãããªãã®ããããŸãïŒ
AsyncIterator.prototype.map(callback)ïŒéåæã€ãã¬ãŒã¿ã®åèŠçŽ ã«ã³ãŒã«ããã¯é¢æ°ãé©çšããŸããAsyncIterator.prototype.filter(callback)ïŒã³ãŒã«ããã¯é¢æ°ã«åºã¥ããŠèŠçŽ ããã£ã«ã¿ãªã³ã°ããŸããAsyncIterator.prototype.reduce(callback, initialValue)ïŒéåæã€ãã¬ãŒã¿ãåäžã®å€ã«éçŽããŸããAsyncIterator.prototype.toArray()ïŒéåæã€ãã¬ãŒã¿ãæ¶è²»ãããã®ãã¹ãŠã®èŠçŽ ã®é åãè¿ããŸããïŒåãæ±ãæ³šæïŒïŒ
mapãšfilterã䜿çšããäŸã§ãïŒ
async function* generateNumbers(count) {
for (let i = 0; i < count; i++) {
await new Promise(resolve => setTimeout(resolve, 10)); // Simulate async operation
yield i;
}
}
async function main() {
const asyncIterable = generateNumbers(100);
const mappedAndFiltered = asyncIterable
.map(x => x * 2)
.filter(x => x > 50);
for await (const number of mappedAndFiltered) {
console.log(number);
}
}
main();
éåæã€ãã¬ãŒã¿ãã«ããŒã®ã¡ã¢ãªãžã®åœ±é¿ïŒé ããã³ã¹ã
éåæã€ãã¬ãŒã¿ãã«ããŒã¯äŸ¿å©ããæäŸããäžæ¹ã§ãé ããã¡ã¢ãªã³ã¹ããããããå¯èœæ§ããããŸããäž»ãªæžå¿µã¯ããããã®ãã«ããŒããã°ãã°ã©ã®ããã«åäœãããã«èµ·å ããŸãïŒ
- äžéãããã¡ãªã³ã°ïŒ å€ãã®ãã«ããŒãç¹ã«å
èªã¿ãå¿
èŠãªãã®ïŒ
filterãããã¯ãã¬ãã·ã£ãŒã®ã«ã¹ã¿ã å®è£ ãªã©ïŒã¯ãäžéçµæããããã¡ãªã³ã°ããå¯èœæ§ããããŸãããã®ãããã¡ãªã³ã°ã¯ãå ¥åã¹ããªãŒã ã倧ããå Žåããã£ã«ã¿ãªã³ã°ã®æ¡ä»¶ãè€éãªå Žåã«ãé倧ãªã¡ã¢ãªæ¶è²»ã«ã€ãªããå¯èœæ§ããããŸããtoArray()ãã«ããŒã¯ãé åãè¿ãåã«ã¹ããªãŒã å šäœãã¡ã¢ãªã«ãããã¡ãªã³ã°ãããããç¹ã«åé¡ããããŸãã - ãã§ã€ãã³ã°ïŒ è€æ°ã®ãã«ããŒãé£çµãããšãåã¹ããããç¬èªã®ãããã¡ãªã³ã°ãªãŒããŒããããå°å ¥ãããã€ãã©ã€ã³ãäœæãããå¯èœæ§ããããŸãããã®çޝç©çãªåœ±é¿ã¯çžåœãªãã®ã«ãªãåŸãŸãã
- ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®åé¡ïŒ ãã«ããŒå ã§äœ¿çšãããã³ãŒã«ããã¯ãã倧ããªãªããžã§ã¯ããžã®åç §ãä¿æããã¯ããŒãžã£ãäœæããå Žåããããã®ãªããžã§ã¯ãã¯éããã«ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããããã¡ã¢ãªãªãŒã¯ã«ã€ãªããå¯èœæ§ããããŸãã
ãã®åœ±é¿ã¯ãåãã«ããŒãããŒã¿ãäžæµã«æž¡ãåã«æ°ŽïŒããŒã¿ïŒãä¿æããå¯èœæ§ã®ãããäžé£ã®æ»ãšããŠèŠèŠåã§ããŸãã
éåæã¹ããªãŒã ã®ã¡ã¢ãªäœ¿çšéãæé©åããããã®æŠç¥
éåæã€ãã¬ãŒã¿ãã«ããŒãéåæã¹ããªãŒã å šè¬ã®ã¡ã¢ãªãžã®åœ±é¿ã軜æžããããã«ã以äžã®æŠç¥ãæ€èšããŠãã ããïŒ
1. ããã¯ãã¬ãã·ã£ãŒã®å®è£
ããã¯ãã¬ãã·ã£ãŒã¯ãã¹ããªãŒã ã®ã³ã³ã·ã¥ãŒãããããã¥ãŒãµã«å¯ŸããŠãããå€ãã®ããŒã¿ãåãåãæºåãã§ããããšãéç¥ã§ããããã«ããã¡ã«ããºã ã§ããããã«ããããããã¥ãŒãµãã³ã³ã·ã¥ãŒããå§åããããŒã¿ãã¡ã¢ãªã«èç©ãããã®ãé²ããŸããããã¯ãã¬ãã·ã£ãŒã«ã¯ããã€ãã®ã¢ãããŒãããããŸãïŒ
- æåããã¯ãã¬ãã·ã£ãŒïŒ ã¹ããªãŒã ããããŒã¿ãèŠæ±ãããã¬ãŒããæç€ºçã«å¶åŸ¡ããŸããããã«ã¯ãããã¥ãŒãµãšã³ã³ã·ã¥ãŒãéã®èª¿æŽãå¿ èŠã§ãã
- ãªã¢ã¯ãã£ãã¹ããªãŒã ïŒäŸïŒRxJSïŒïŒ RxJSã®ãããªã©ã€ãã©ãªã¯ãããã¯ãã¬ãã·ã£ãŒã®å®è£ ãç°¡çŽ åããçµã¿èŸŒã¿ã®ããã¯ãã¬ãã·ã£ãŒã¡ã«ããºã ãæäŸããŸãããã ããRxJSèªäœã«ãã¡ã¢ãªãªãŒããŒããããããããããã¬ãŒããªããšãªããŸãã
- éå®ãããäžŠè¡æ§ãæã€éåæãžã§ãã¬ãŒã¿ïŒ éåæãžã§ãã¬ãŒã¿å ã®åææäœã®æ°ãå¶åŸ¡ããŸããããã¯ã»ããã©ãªã©ã®æè¡ã䜿çšããŠå®çŸã§ããŸãã
ã»ããã©ã䜿çšããŠäžŠè¡æ§ãå¶éããäŸïŒ
class Semaphore {
constructor(max) {
this.max = max;
this.count = 0;
this.waiting = [];
}
async acquire() {
if (this.count < this.max) {
this.count++;
return;
}
return new Promise(resolve => {
this.waiting.push(resolve);
});
}
release() {
this.count--;
if (this.waiting.length > 0) {
const resolve = this.waiting.shift();
resolve();
this.count++; // Important: Increment count after resolving
}
}
}
async function* processData(data, semaphore) {
for (const item of data) {
await semaphore.acquire();
try {
// Simulate asynchronous processing
await new Promise(resolve => setTimeout(resolve, 50));
yield `Processed: ${item}`;
} finally {
semaphore.release();
}
}
}
async function main() {
const data = Array.from({ length: 20 }, (_, i) => `Item ${i + 1}`);
const semaphore = new Semaphore(5); // Limit concurrency to 5
for await (const result of processData(data, semaphore)) {
console.log(result);
}
}
main();
ãã®äŸã§ã¯ãã»ããã©ãåæéåææäœã®æ°ã5ã«å¶éããéåæãžã§ãã¬ãŒã¿ãã·ã¹ãã ãå§åããã®ãé²ããŸãã
2. äžèŠãªãããã¡ãªã³ã°ã®åé¿
éåæã¹ããªãŒã ã§å®è¡ãããæäœãæ³šææ·±ãåæãããããã¡ãªã³ã°ã®æœåšçãªåå ãç¹å®ããŸããtoArray()ã®ããã«ãã¹ããªãŒã å
šäœãã¡ã¢ãªã«ãããã¡ãªã³ã°ããå¿
èŠãããæäœã¯é¿ããŠãã ããã代ããã«ãããŒã¿ã鿬¡çã«åŠçããŸãã
次ã®ä»£ããã«ïŒ
const allData = await asyncIterable.toArray();
// Process allData
ãã¡ããæšå¥šããŸãïŒ
for await (const item of asyncIterable) {
// Process item
}
3. ããŒã¿æ§é ã®æé©å
å¹ççãªããŒã¿æ§é ã䜿çšããŠãã¡ã¢ãªæ¶è²»ãæå°éã«æããŸããäžèŠãªå Žåã¯ã倧ããªé åããªããžã§ã¯ããã¡ã¢ãªã«ä¿æããªãã§ãã ãããã¹ããªãŒã ããžã§ãã¬ãŒã¿ã䜿çšããŠãããŒã¿ãããå°ããªãã£ã³ã¯ã§åŠçããããšãæ€èšããŠãã ããã
4. ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®æŽ»çš
ãªããžã§ã¯ããäžèŠã«ãªã£ããšãã«ãé©åã«åç
§ãè§£é€ãããããã«ããŠãã ãããããã«ãããã¬ããŒãžã³ã¬ã¯ã¿ãã¡ã¢ãªãè§£æŸã§ããŸããã³ãŒã«ããã¯å
ã§äœæãããã¯ããŒãžã£ã¯ãæå³ãã倧ããªãªããžã§ã¯ããžã®åç
§ãä¿æããå¯èœæ§ããããããæ³šæãå¿
èŠã§ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã劚ããªãããã«ãWeakMapãWeakSetã®ãããªæè¡ã䜿çšããŠãã ããã
WeakMapã䜿çšããŠã¡ã¢ãªãªãŒã¯ãåé¿ããäŸïŒ
const cache = new WeakMap();
async function processItem(item) {
if (cache.has(item)) {
return cache.get(item);
}
// Simulate expensive computation
await new Promise(resolve => setTimeout(resolve, 100));
const result = `Processed: ${item}`; // Compute the result
cache.set(item, result); // Cache the result
return result;
}
async function* processData(data) {
for (const item of data) {
yield await processItem(item);
}
}
async function main() {
const data = Array.from({ length: 10 }, (_, i) => `Item ${i + 1}`);
for await (const result of processData(data)) {
console.log(result);
}
}
main();
ãã®äŸã§ã¯ãWeakMapã䜿çšããããšã§ãçµæããŸã ãã£ãã·ã¥ãããŠããŠããitemã䜿çšãããªããªã£ããšãã«ãããã«é¢é£ä»ããããã¡ã¢ãªãã¬ããŒãžã³ã¬ã¯ã¿ãè§£æŸã§ããããã«ãªããŸãã
5. ã¹ããªãŒã åŠçã©ã€ãã©ãª
Highland.jsãRxJSïŒèªèº«ã®ã¡ã¢ãªãªãŒããŒãããã«æ³šæïŒã®ãããªå°çšã®ã¹ããªãŒã åŠçã©ã€ãã©ãªã®äœ¿çšãæ€èšããŠãã ããããããã¯ãã¹ããªãŒã æäœãšããã¯ãã¬ãã·ã£ãŒã¡ã«ããºã ã®æé©åãããå®è£ ãæäŸããŸãããããã®ã©ã€ãã©ãªã¯ãæåã§ã®å®è£ ãããå¹ççã«ã¡ã¢ãªç®¡çãåŠçã§ããããšãå€ãã§ãã
6. ã«ã¹ã¿ã éåæã€ãã¬ãŒã¿ãã«ããŒã®å®è£ ïŒå¿ èŠãªå ŽåïŒ
çµã¿èŸŒã¿ã®éåæã€ãã¬ãŒã¿ãã«ããŒãç¹å®ã®ã¡ã¢ãªèŠä»¶ãæºãããªãå Žåã¯ããŠãŒã¹ã±ãŒã¹ã«åãããŠèª¿æŽãããã«ã¹ã¿ã ãã«ããŒãå®è£ ããããšãæ€èšããŠãã ãããããã«ããããããã¡ãªã³ã°ãšããã¯ãã¬ãã·ã£ãŒããã现ããå¶åŸ¡ã§ããŸãã
7. ã¡ã¢ãªäœ¿çšéã®ç£èŠ
ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªäœ¿çšéã宿çã«ç£èŠããæœåšçãªã¡ã¢ãªãªãŒã¯ãéå°ãªã¡ã¢ãªæ¶è²»ãç¹å®ããŸããNode.jsã®process.memoryUsage()ããã©ãŠã¶ã®éçºè
ããŒã«ã®ãããªããŒã«ã䜿çšããŠãæéçµéã«äŒŽãã¡ã¢ãªäœ¿çšéã远跡ããŸãããããã¡ã€ãªã³ã°ããŒã«ã¯ãã¡ã¢ãªåé¡ã®åå ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
Node.jsã§process.memoryUsage()ã䜿çšããäŸïŒ
console.log('Initial memory usage:', process.memoryUsage());
// ... Your async stream processing code ...
setTimeout(() => {
console.log('Memory usage after processing:', process.memoryUsage());
}, 5000); // Check after a delay
å®è·µçãªäŸãšã±ãŒã¹ã¹ã¿ãã£
ã¡ã¢ãªæé©åæè¡ã®åœ±é¿ã説æããããã«ãããã€ãã®å®è·µçãªäŸãèŠãŠã¿ãŸãããïŒ
äŸ1ïŒå€§èŠæš¡ãªãã°ãã¡ã€ã«ã®åŠç
ç¹å®ã®æ å ±ãæœåºããããã«ãå€§èŠæš¡ãªãã°ãã¡ã€ã«ïŒäŸïŒæ°ã®ã¬ãã€ãïŒãåŠçããããšãæ³åããŠã¿ãŠãã ããããã¡ã€ã«å šäœãã¡ã¢ãªã«èªã¿èŸŒãããšã¯éçŸå®çã§ãã代ããã«ãéåæãžã§ãã¬ãŒã¿ã䜿çšããŠãã¡ã€ã«ã1è¡ãã€èªã¿èŸŒã¿ãåè¡ã鿬¡çã«åŠçããŸãã
const fs = require('fs');
const readline = require('readline');
async function* readLines(filePath) {
const fileStream = fs.createReadStream(filePath);
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity
});
for await (const line of rl) {
yield line;
}
}
async function main() {
const filePath = 'path/to/large-log-file.txt';
const searchString = 'ERROR';
for await (const line of readLines(filePath)) {
if (line.includes(searchString)) {
console.log(line);
}
}
}
main();
ãã®ã¢ãããŒãã¯ããã¡ã€ã«å šäœãã¡ã¢ãªã«ããŒãããã®ãé¿ããã¡ã¢ãªæ¶è²»ãå€§å¹ ã«åæžããŸãã
äŸ2ïŒãªã¢ã«ã¿ã€ã ããŒã¿ã¹ããªãŒãã³ã°
ããŒã¿ããœãŒã¹ïŒäŸïŒã»ã³ãµãŒïŒããç¶ç¶çã«åä¿¡ããããªã¢ã«ã¿ã€ã ããŒã¿ã¹ããªãŒãã³ã°ã¢ããªã±ãŒã·ã§ã³ãèããŠã¿ãŠãã ãããåä¿¡ããŒã¿ã«ãã£ãŠã¢ããªã±ãŒã·ã§ã³ãå§åãããã®ãé²ãããã«ã¯ãããã¯ãã¬ãã·ã£ãŒãé©çšããããšãäžå¯æ¬ ã§ããRxJSã®ãããªã©ã€ãã©ãªã䜿çšãããšãããã¯ãã¬ãã·ã£ãŒã管çããããŒã¿ã¹ããªãŒã ãå¹ççã«åŠçããã®ã«åœ¹ç«ã¡ãŸãã
äŸ3ïŒå€ãã®ãªã¯ãšã¹ããåŠçããWebãµãŒããŒ
倿°ã®åæãªã¯ãšã¹ããåŠçããNode.js WebãµãŒããŒã¯ãæ³šææ·±ã管çããªããšç°¡åã«ã¡ã¢ãªã䜿ãæãããŠããŸããŸãããªã¯ãšã¹ãããã£ãšã¬ã¹ãã³ã¹ã®åŠçã«ã¹ããªãŒã ãšå ±ã«async/awaitã䜿çšããã³ãã¯ã·ã§ã³ããŒãªã³ã°ãšå¹ççãªãã£ãã·ã³ã°æŠç¥ãçµã¿åãããããšã§ãã¡ã¢ãªäœ¿çšéãæé©åãããµãŒããŒã®ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã
ã°ããŒãã«ãªèæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã«éåæã¹ããªãŒã ãšéåæã€ãã¬ãŒã¿ãã«ããŒã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãéçºããå Žåãæ¬¡ã®ç¹ãèæ ®ããŠãã ããïŒ
- ãããã¯ãŒã¯é å»¶ïŒ ãããã¯ãŒã¯é å»¶ã¯ãéåææäœã®ããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸãããããã¯ãŒã¯éä¿¡ãæé©åããŠé å»¶ãæå°éã«æããã¡ã¢ãªäœ¿çšéãžã®åœ±é¿ã軜æžããŸããã³ã³ãã³ãããªããªãŒãããã¯ãŒã¯ïŒCDNïŒã䜿çšããŠãç°ãªãå°ççå°åã®ãŠãŒã¶ãŒã«è¿ãå Žæã«éçã¢ã»ããããã£ãã·ã¥ããããšãæ€èšããŠãã ããã
- ããŒã¿ãšã³ã³ãŒãã£ã³ã°ïŒ å¹ççãªããŒã¿ãšã³ã³ãŒãã£ã³ã°åœ¢åŒïŒäŸïŒProtocol BuffersãAvroïŒã䜿çšããŠããããã¯ãŒã¯çµç±ã§éä¿¡ãããã¡ã¢ãªã«ä¿åãããããŒã¿ã®ãµã€ãºãåæžããŸãã
- åœéåïŒi18nïŒãšå°ååïŒl10nïŒïŒ ã¢ããªã±ãŒã·ã§ã³ãç°ãªãæåãšã³ã³ãŒãã£ã³ã°ãæåçæ £ç¿ãåŠçã§ããããšã確èªããŠãã ãããæåååŠçã«é¢é£ããã¡ã¢ãªåé¡ãé¿ããããã«ãi18nãšl10nçšã«èšèšãããã©ã€ãã©ãªã䜿çšããŠãã ããã
- ãªãœãŒã¹å¶éïŒ ããŸããŸãªãã¹ãã£ã³ã°ãããã€ããŒããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«ãã£ãŠèª²ããããªãœãŒã¹å¶éã«æ³šæããŠãã ããããªãœãŒã¹äœ¿çšéãç£èŠããããã«å¿ããŠã¢ããªã±ãŒã·ã§ã³ã®èšå®ã調æŽããŠãã ããã
çµè«
éåæã€ãã¬ãŒã¿ãã«ããŒãšéåæã¹ããªãŒã ã¯ãJavaScriptã«ãããéåæããã°ã©ãã³ã°ã®ããã®åŒ·åãªããŒã«ãæäŸããŸããããããããããã¡ã¢ãªã«äžãã圱é¿ãçè§£ããã¡ã¢ãªäœ¿çšéãæé©åããããã®æŠç¥ãå®è£ ããããšãäžå¯æ¬ ã§ããããã¯ãã¬ãã·ã£ãŒã®å®è£ ãäžèŠãªãããã¡ãªã³ã°ã®åé¿ãããŒã¿æ§é ã®æé©åãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®æŽ»çšããããŠã¡ã¢ãªäœ¿çšéã®ç£èŠã«ãããéåæããŒã¿ã¹ããªãŒã ã广çã«åŠçããå¹ççã§ã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã倿§ãªç°å¢ãšã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«å¯ŸããŠæé©ãªããã©ãŒãã³ã¹ã確ä¿ããããã«ãã³ãŒãã®ãããã¡ã€ãªã³ã°ãšæé©åãç¶ç¶çã«è¡ãããšãå¿ããªãã§ãã ããããã¬ãŒããªããšæœåšçãªèœãšã穎ãçè§£ããããšããããã©ãŒãã³ã¹ãç ç²ã«ããããšãªãéåæã€ãã¬ãŒã¿ã®åãæŽ»çšããéµãšãªããŸãã