ããã©ãŒãã³ã¹
éçºè 㯠Electron ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæé©åããããã®æŠç¥ã«ã€ããŠé »ç¹ã«å°ããŸãã ãœãããŠã§ã¢ãšã³ãžãã¢ãæ¶è²»è ããã¬ãŒã ã¯ãŒã¯ã®éçºè ã¯ãåžžã« "ããã©ãŒãã³ã¹" ã¯äœãæå³ããããšãã 1 ã€ã®å®çŸ©ã«ã¯åæããŸããã ãã®ããã¥ã¡ã³ãã§ã¯ã䜿çšããŠããã¡ã¢ãªãCPUãããã³ãã£ã¹ã¯ãªãœãŒã¹ã®éãåæžããã¢ããªããŠãŒã¶ãŒå ¥åã«å¿çããæäœãã§ããã ãæ©ãå®äºããããã«ãããElectron ã¡ã³ãããŒåŸ¡çšéã®æ¹æ³ã®ããã€ããæŠèª¬ããŸãã ããã«ããã¹ãŠã®ããã©ãŒãã³ã¹æŠç¥ã«ãããŠã¢ããªã¯é«ãã»ãã¥ãªãã£æ°Žæºãç¶æããå¿ èŠããããŸãã
JavaScript ã§ããã©ãŒãã³ã¹ã®é«ããŠã§ããµã€ããæ§ç¯ããæ¹æ³ã«é¢ããç¥æµãšæ å ±ã¯ãElectron ã¢ããªã«ãäžè¬çã«é©çšãããŸãã ããçšåºŠã§ããã°ãããã©ãŒãã³ã¹ã®é«ã Node.js ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããæ¹æ³ãè¿°ã¹ãããŠããŠãé©çšãããŸãããNode.js ããã¯ãšã³ãã§ã® "ããã©ãŒãã³ã¹" ãšããçšèªã¯ã¯ã©ã€ã¢ã³ãã§å®è¡ãããã¢ããªã±ãŒã·ã§ã³ãšã¯ç°ãªãããšãæå³ããããšã«æ³šæããŠãã ããã
ãã®ãªã¹ãã¯å©äŸ¿æ§ã®ããã«æäŸãããŠãããã»ãã¥ãªãã£ãã§ãã¯ãªã¹ã ãšãã䌌ãŠããŸãããå®å šãªãã®ã§ã¯ãããŸããã 以äžã«æŠèª¬ãããã¹ãŠã®æé ã«åŸã£ãŠããé ã Electron ã¢ããªãæ§ç¯ããŠããŸããããããŸããã Electron ã¯åŒ·åãªéçºãã©ãããã©ãŒã ã§ãããéçºè ã§ããããªããããããããšã¯å€ããå°ãªããè¡ãããšãã§ããŸãã ãã®èªç±ã¯ããã©ãŒãã³ã¹ãã»ãšãã©ããªãã®è²¬ä»»ã§ããããšãæå³ããŸãã
èšã£ãŠã枬ã£ãŠãå³ãâ
以äžã®ãªã¹ãã«ã¯ãããªãç°¡åã§å®è£ ããããæé ãããã€ãå«ãŸããŠããŸãã ããããã¢ããªãæãããã©ãŒãã³ã¹ã®è¯ãããŒãžã§ã³ã«æ§ç¯ããã«ã¯ãå€ãã®æé ãè¶ããå¿ èŠããããŸãã 代ããã«ãæ éã«ãããã¡ã€ãªã³ã°ããŠæž¬å®ããããšã§ã¢ããªã§å®è¡ãããŠãããã¹ãŠã®ã³ãŒãã詳ãã調ã¹ãå¿ èŠããããŸãã ããã«ããã¯ã¯ã©ã? ãã€ãŠãŒã¶ãŒããã¿ã³ãã¯ãªãã¯ããŠãã©ã®åŠçãæéãæµªè²»ãããŠãã? ã¢ããªããã ã¢ã€ãã«ç¶æ ã®éãã©ã®ãªããžã§ã¯ããæãã¡ã¢ãªãé£ã£ãŠãã?
幟床ãšãªããããã©ãŒãã³ã¹ã®é«ã Electron ã¢ããªãæ§ç¯ããããã®æãæåããæŠç¥ã¯ãå®è¡äžã®ã³ãŒãã®ãããã¡ã€ã«ãäœæãããã®äžã§æããªãœãŒã¹ãæ¶è²»ããéšåãèŠã€ããæé©åããããšã§ããããšãããããŸããã ãã®äžèŠé¢åãªããã»ã¹ãäœåºŠãç¹°ãè¿ããšãã¢ããªã®ããã©ãŒãã³ã¹ã¯åçã«åäžããŸãã Visual Studio Code ã Slack ãªã©ã®äž»èŠãªã¢ããªã§äœ¿çšãããçµéšããããã®æ¹æ³ãããã©ãŒãã³ã¹ãåäžãããæãä¿¡é Œã§ããæŠç¥ã§ããããšã瀺ãããŠããŸãã
ã¢ããªã®ã³ãŒãããããã¡ã€ãªã³ã°ããæ¹æ³ã«ã€ããŠç¥ãããã®ã§ããã°ãChrome ããããããŒããŒã«ãšä»²è¯ããªã£ãŠãã ããã è€æ°ã®ããã»ã¹ãåæã«èŠãŠé«åºŠã«åæããã«ã¯ãChrome Trace ããŒã«ããæ€èšãã ããã
æšèŠå³æžâ
- ã©ã³ã¿ã€ã ã®ããã©ãŒãã³ã¹ãè§£æãã
- è«è©±: "Visual Studio Code - æåã®äžç§"
ãã§ãã¯ãªã¹ã: ããã©ãŒãã³ã¹æšå¥šäºé â
ãããã®æé ãå®è¡ãããšãã¢ããªãå°ãã ãç¡é§ãªããé«éã«ãªããäžè¬çã«ãªãœãŒã¹ã®æ¶è²»ãå°ãªããªãå¯èœæ§ããããŸãã
- è¿éãªã¢ãžã¥ãŒã«æ¡çš
- ããŸãã«æ©ãã³ãŒãã®ããŒããšå®è¡
- ã¡ã€ã³ããã»ã¹ããããã¯ããŠãã
- ã¬ã³ãã©ãŒããã»ã¹ããããã¯ããŠãã
- äžèŠãª polyfill
- äžèŠãŸãã¯ãããã¯ããŠãããããã¯ãŒã¯ãªã¯ãšã¹ã
- ã³ãŒãããã³ãã«ãã
- ããã©ã«ãã®ã¡ãã¥ãŒãäžèŠãªã
Menu.setApplicationMenu(null)
ãåŒã³åºã
1. è¿éãªã¢ãžã¥ãŒã«æ¡çšâ
Node.js ã¢ãžã¥ãŒã«ãã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããåã«ããã®ã¢ãžã¥ãŒã«ã調ã¹ãŸãããã ãã®ã¢ãžã¥ãŒã«ã«ã¯ã©ãã ãã®äŸåé¢ä¿ãå«ãŸããŠããã§ããããã ã©ã®çš®é¡ã®ãªãœãŒã¹ããåã« require()
æã§åŒã³åºãå¿
èŠãããã§ããããã NPM ããã±ãŒãžã¬ãžã¹ããªã§ããŠã³ããŒãæ°ãæãå€ãã£ãã GitHub ã§æãã¹ã¿ãŒã®æ°ãå€ãã£ããããã¢ãžã¥ãŒã«ã¯ãå®éã«ã¯å©çšå¯èœãªãã®ã®ãã¡æããã£ãããšããæå°ã®ãã®ã§ã¯ãªãå ŽåããããŸãã
ãªãïŒâ
ãã®æšå¥šäºé
ã®èåŸã«ããçç±ã¯ãå®äŸã§æããã説æãããŠããŸãã Electron ã®åæã®é ã¯ããããã¯ãŒã¯æ¥ç¶ã®ä¿¡é Œã§ããæ€åºãåé¡ã§ããããã®ãããå€ãã®ã¢ããªã¯ç°¡æãª isOnline()
ã¡ãœãããå
¬éããŠããã¢ãžã¥ãŒã«ã䜿çšããŠããŸããã
ãã®ã¢ãžã¥ãŒã«ã¯ãå€ãã®æåãªãšã³ããã€ã³ãã«å°éãããã©ããã§ãããã¯ãŒã¯æ¥ç¶ãæ€åºããŸããã ãããã®ãšã³ããã€ã³ãã®ãªã¹ãã«ã€ããŠã¯ãæ¢ç¥ã®ããŒãã®ãªã¹ããå«ãŸããå¥ã®ã¢ãžã¥ãŒã«ã«äŸåããŠããŸããã ãã®äŸåã¢ãžã¥ãŒã«èªèº«ã¯ãããŒãã«é¢ããæ
å ±ãå«ãã¢ãžã¥ãŒã«ã«äŸåããŠããŸãããããã¯ã100,000 è¡ãè¶
ããå
容㮠JSON ãã¡ã€ã«ã®åœ¢åŒã§æäŸãããŠããŸããã ã¢ãžã¥ãŒã«ãããŒãããããã³ã« (é垞㯠require('module')
æã§)ããã¹ãŠã®äŸåé¢ä¿ãããŒãããæçµçã«ãã® JSON ãã¡ã€ã«ãèªã¿åã£ãŠè§£æããŸãã æ°åè¡ã® JSON ã®è§£æã¯éåžžã«éãæäœã§ãã é
ããã·ã³ã§ã¯ãå
šäœã§æ°ç§ãããå ŽåããããŸãã
å€ãã®ãµãŒããŒã³ã³ããã¹ãã§ã¯ãèµ·åã«ãããæéã¯å®è³ªçã«ç¡é¢ä¿ã§ãã ãã¹ãŠã®ããŒãã«é¢ããæ å ±ãå¿ èŠãšãã Node.js ãµãŒããŒã¯ããµãŒããŒãèµ·åããŠãªã¯ãšã¹ããããé«éã«åŠçã§ããããã«ãªããšãå¿ èŠãªãã¹ãŠã®æ å ±ãã¡ã¢ãªã«ããŒãããããå®éã« "ããã©ãŒãã³ã¹ãåäž" ããŸãã ãã®äŸã§èª¬æããã¢ãžã¥ãŒã«ã¯ã"æªè³ªãª" ã¢ãžã¥ãŒã«ã§ã¯ãããŸããã ãã ããElectron ã¢ããªã§ã¯ãå®éã«å¿ èŠã®ãªãæ å ±ãã¡ã¢ãªã«èªã¿èŸŒãã§è§£æãããä¿åãããããã¹ãã§ã¯ãããŸããã
èŠããã«ã䞻㫠Linux ã§å®è¡ãã Node.js ãµãŒããŒçšã«æžãããäžèŠåªããã¢ãžã¥ãŒã«ã¯ãã¢ããªã®ããã©ãŒãã³ã¹ã«ãšã£ãŠæªããã¥ãŒã¹ãããããŸããã ãã®ç¹å®ã®äŸã§ã®æ£ãããœãªã¥ãŒã·ã§ã³ã¯ãã¢ãžã¥ãŒã«ã¯ãŸã£ãã䜿çšããã代ããã« Chromium ã®åŸã®ããŒãžã§ã³ã«å«ãŸããæ¥ç¶ãã§ãã¯ã䜿çšããããšã§ããã
ã©ãããã°ããã®ïŒâ
ã¢ãžã¥ãŒã«ãæ€èšãããšãã¯ã以äžã確èªããããšãæšå¥šããŸãã
- å«ãŸããäŸåé¢ä¿ã®ãµã€ãº
- ããŒã (
require()
) ã«å¿ èŠãªãªãœãŒã¹ - é¢å¿ã®ããã¢ã¯ã·ã§ã³ãå®è¡ããããã«å¿ èŠãªãªãœãŒã¹
ã¢ãžã¥ãŒã«ãããŒããããšãã® CPU ãããã¡ã€ã«ãšããŒãã¡ã¢ãªãããã¡ã€ã«ã®çæã¯ãã³ãã³ãã©ã€ã³äžã® 1 ã€ã®ã³ãã³ãã§å®è¡ã§ããŸãã 以äžã®äŸã§ã¯ã人æ°ã®ããã¢ãžã¥ãŒã« request
ãèŠãŠãããŸãã
node --cpu-prof --heap-prof -e "require('request')"
ãã®ã³ãã³ããå®è¡ãããšãå®è¡ãããã£ã¬ã¯ããªã« .cpuprofile
ãã¡ã€ã«ãš .heapprofile
ãã¡ã€ã«ãäœæãããŸãã äž¡æ¹ã®ãã¡ã€ã«ã¯ãChrome ããããããŒããŒã«ã䜿çšããŠããããã Performance
ããã³ Memory
ã¿ãã䜿çšããŠåæã§ããŸãã
ãã®äŸã§ã¯ãèè
ã®ãã·ã³ã§ request
ã®ããŒãã«çŽ 0.5 ç§ããã£ãã®ã«å¯Ÿããnode-fetch
ã®ã¡ã¢ãªæ¶è²»ã¯åçã«å°ãªãã50ms æªæºã§ããã
2. ããŸãã«æ©ãã³ãŒãã®ããŒããšå®è¡â
éãã»ããã¢ããæäœãããå Žåã¯ãããããåŸåãããããšãæ€èšããŠãã ããã ã¢ããªã±ãŒã·ã§ã³ã®èµ·åçŽåŸã«å®è¡ãããŠãããã¹ãŠã®äœæ¥ã調ã¹ãŸãã ãã¹ãŠã®æäœãããã«å®è¡ããã®ã§ã¯ãªãããŠãŒã¶ãŒã®è¡çšã«ããè¿ãé åºã§æäœããããããšãæ€èšããŠãã ããã
åŸæ¥ã® Node.js éçºã§ã¯ããã¹ãŠã® require()
ã¹ããŒãã¡ã³ããå
é ã«é
眮ããæ
£ç¿ããããŸããã ããŸåãæŠç¥ãäœ¿çš ãã€ã€ ããå¿
èŠã§ã¯ãªããµã€ãºã®å€§ããã¢ãžã¥ãŒã«ã䜿çšããŠãã Electron ã¢ããªã±ãŒã·ã§ã³ãäœæããŠããå ŽåãåãæŠç¥ã®ããã§ãããé©åãªã¿ã€ãã³ã°ã§èªã¿èŸŒãããã«åŸåãããŸãã
ãªãïŒâ
ã¢ãžã¥ãŒã«ã®ããŒãã¯ãç¹ã« Windows ã§ã¯é©ãã»ã©éãæäœã§ãã ã¢ããªã®èµ·åæã«ããŠãŒã¶ãŒã«çŸåšå¿ èŠã®ãªãæäœã§åŸ ãããŠã¯ãªããŸããã
ããã¯åœããåã®ããã«æãããããããŸããããå€ãã®ã¢ããªã±ãŒã·ã§ã³ã¯ãæŽæ°ã®ç¢ºèªãåŸã®ãããŒã§äœ¿çšãããã³ã³ãã³ãã®ããŠã³ããŒããéããã£ã¹ã¯ I/O æäœã®å®è¡ãªã©ãã¢ããªã®èµ·åçŽåŸã«å€§éã®äœæ¥ãè¡ãåŸåããããŸãã
äŸãšã㊠Visual Studio Code ãèããŠã¿ãŸãããã ãã¡ã€ã«ãéããšãã³ãŒãã匷調衚瀺ããã«ããã«ãã¡ã€ã«ã衚瀺ãããããã¹ããæäœããæ©èœãåªå ãããŸãã ãã®äœæ¥ãå®äºãããšãã³ãŒãã®åŒ·èª¿è¡šç€ºã«é²ã¿ãŸãã
ã©ãããã°ããã®ïŒâ
äŸãšããŠãã¢ããªã±ãŒã·ã§ã³ãæ¶ç©ºã® .foo
圢åŒã®ãã¡ã€ã«ãè§£æããŠãããšä»®å®ããŸãããã ãããããããã«ã¯ãåæ§ã«æ¶ç©ºã® foo-parser
ã¢ãžã¥ãŒã«ã«äŸåããŸãã åŸæ¥ã® Node.js éçºã§ã¯ãäŸåé¢ä¿ãå
ã«ããŒãããã³ãŒããäœæããå ŽåããããŸãã
const fs = require('node:fs')
const fooParser = require('foo-parser')
class Parser {
constructor () {
this.files = fs.readdirSync('.')
}
getParsedFiles () {
return fooParser.parse(this.files)
}
}
const parser = new Parser()
module.exports = { parser }
äžèšã®äŸã§ã¯ããã¡ã€ã«ãããŒãããããšããã«å€ãã®äœæ¥ãå®è¡ãããŸãã è§£æããããã¡ã€ã«ãããååŸããå¿
èŠãããã§ããããã getParsedFiles()
ãå®éã«åŒã³åºããããšãã«ããããå°ãåŸã§å®è¡ã§ããã§ããããã
// "fs "ã¯ãã§ã«ããŒããããŠããå¯èœæ§ãé«ãã®ã§ã`require()` åŒã³åºãã¯è»œãã§ãã
const fs = require('node:fs')
class Parser {
async getFiles () {
// `getFiles` ãåŒã°ãããããã«ãã£ã¹ã¯ã«è§ŠããŸãã
// ãŸããéåæããŒãžã§ã³ã䜿çšããŠ
// ä»ã®æäœããããã¯ããªãããšãä¿èšŒããŸãã
this.files = this.files || await fs.promises.readdir('.')
return this.files
}
async getParsedFiles () {
// ãã®æ¶ç©ºã® foo-parser ã¯å€§ãããŠéãã¢ãžã¥ãŒã«ã§ãã
// å®éã«ãã¡ã€ã«ãè§£æããå¿
èŠããããŸã§åäœãåŸåãã«ããŸãã
// `require()` ã«ã¯ã¢ãžã¥ãŒã«ãã£ãã·ã¥ãä»å±ããŠããããã
// ãã® `require()` åŒã³åºã㯠1 åã ãéãã
// åŸç¶ã® `getParsedFiles()` åŒã³åºãã¯ããé«éã«ãªããŸãã
const fooParser = require('foo-parser')
const files = await this.getFiles()
return fooParser.parse(files)
}
}
// ãã®æäœã¯ãåã®äŸãããã¯ããã«è»œããªããŸãã
const parser = new Parser()
module.exports = { parser }
èŠããã«ãã¢ããªã®èµ·åæã«ãªãœãŒã¹ããã¹ãŠå²ãåœãŠãã®ã§ã¯ãªãã"ãã®æã«åãããŠ" ãªãœãŒã¹ãå²ãåœãŠãŸãã
3. ã¡ã€ã³ããã»ã¹ããããã¯ããŠããâ
Electron ã®ã¡ã€ã³ããã»ã¹ ("ãã©ãŠã¶ããã»ã¹" ãšåŒã°ããããšããããŸã) ã¯ç¹å¥ã§ããããã¯ãã¢ããªã®ä»ã®ãã¹ãŠã®ããã»ã¹ã®èŠªããã»ã¹ã§ããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãçžäºäœçšããäžæ¬¡ããã»ã¹ã§ãã ãŠã£ã³ããŠãã€ã³ã¿ã©ã¯ã·ã§ã³ãã¢ããªå ã®ããŸããŸãªã³ã³ããŒãã³ãéã®éä¿¡ãåŠçããŸãã UI ã¹ã¬ãããä¿æããŸãã
ã©ããªç¶æ³ã§ãããã®ããã»ã¹ãš UI ã¹ã¬ãããé·ãå®è¡æéã®æäœã§ãããã¯ããŠã¯ãªããŸããã UI ã¹ã¬ããããããã¯ãããšãã¡ã€ã³ããã»ã¹ãåŠçãç¶è¡ã§ããç¶æ ã«ãªããŸã§ãã¢ããªå šäœãããªãŒãºããŸãã
ãªãïŒâ
ã¡ã€ã³ããã»ã¹ãšãã® UI ã¹ã¬ããã¯ãåºæ¬çã«ã¢ããªå ã®äž»èŠãªæäœã®å¶åŸ¡å¡ã§ãã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãããŠã¹ã¯ãªãã¯ã«ã€ããŠã¢ããªã«éç¥ãããšããã®ã¯ãªãã¯ã¯ãŠã£ã³ããŠã«å°éããåã«ã¡ã€ã³ããã»ã¹ãééããŸãã ãŠã£ã³ããŠãã¬ãã¬ãããæ»ãããªã¢ãã¡ãŒã·ã§ã³ãã¬ã³ããªã³ã°ããŠããå Žåãããã«ã€ã㊠GPU ããã»ã¹ãšããåãããå¿ èŠããã£ãŠâããäžåºŠã¡ã€ã³ããã»ã¹ãééããŸãã
Electron ãš Chromium ã¯ãUI ã¹ã¬ããã®ãããã¯ãåé¿ããããã«ãæ°ããã¹ã¬ããã«éããã£ã¹ã¯ I/O ããã³ CPU ããŠã³ãæäœãé 眮ããããé æ ®ããŸãã ããªããããªãããã«ããŸãããã
ã©ãããã°ããã®ïŒâ
Electron ã®åŒ·åãªãã«ãããã»ã¹ã¢ãŒããã¯ãã£ã¯ãé·æéå®è¡ããã¿ã¹ã¯ãæ¯æŽããæºåãã§ããŠããŸãããå°æ°ã®ããã©ãŒãã³ã¹ãã©ãããå«ãŸããŠããŸãã
-
é·æéå®è¡ããã CPU è² è·ã®é«ãã¿ã¹ã¯ã«ã€ããŠã¯ãWorker Thread ã䜿çšãããããããã BrowserWindow ã«ç§»åããããšãæ€èšãããã(æåŸã®ææ®µãšããŠ) å°çšããã»ã¹ãçæããŸãã
-
åæ IPC ãš
@electron/remote
ã¢ãžã¥ãŒã«ã®äœ¿çšã¯ã§ããã ãé¿ããŠãã ããã æ£ããäœ¿çšæ¹æ³ããããŸãããç¥ããªããã¡ã« UI ã¹ã¬ããããããã¯ããã®ã¯éåžžã«å®¹æã§ãã -
ã¡ã€ã³ããã»ã¹ã§ãããã¯ãã I/O æäœã®äœ¿çšãé¿ããŠãã ããã èŠããã«ãã³ã¢ Node.js ã¢ãžã¥ãŒã« (
fs
ãchild_process
ãªã©) ãåæããŒãžã§ã³ãšéåæããŒãžã§ã³ãæäŸããŠããå Žåã¯ãåžžã«éåæããã³éããããã³ã°ã®ãã®ãéžæããã¹ãã§ãã
4. ã¬ã³ãã©ãŒããã»ã¹ããããã¯ããŠããâ
Electron ã«ã¯ Chrome ã®ææ°ããŒãžã§ã³ã忢±ãããŠãããããWeb Platform ãæäŸããææ°ã§æè¯ã®æ©èœãå©çšããŠãã¢ããªãã¹ã ãŒãºãã€å¿çæ§ã®è¯ãããã«ç¶æããææ³ã§éãæäœãåŸåããŸãã¯ãªãããŒãã§ããŸãã
ãªãïŒâ
ã¬ã³ãã©ãŒããã»ã¹ã§å®è¡ãã JavaScript ããã¢ããªã«å€ãå«ãŸããŠããã®ãããããŸããã ãã®ä»æãã¯ã60fps ã§ãŠãŒã¶ãŒå ¥åãã¢ãã¡ãŒã·ã§ã³ãžã®å¯Ÿå¿ãã¹ã ãŒãºãªã¹ã¯ããŒã«ãç¶æããããã«ãå¿ èŠãªãªãœãŒã¹ã奪ããã«å¯èœãªéãè¿ éã«æäœãå®è¡ããããšã§ãã
ã¬ã³ãã©ãŒã®ã³ãŒãã§æäœã®æµãã調æŽããããšã¯ããŠãŒã¶ãŒãã¢ããªã® "ã«ã¯ã€ã" ãæã 蚎ããå Žåã«ç¹ã«åœ¹ç«ã¡ãŸãã
ã©ãããã°ããã®ïŒâ
å¹³ããèšãã°ãææ°ã®ãã©ãŠã¶ãŒçšã®é«æ§èœãŠã§ãã¢ããªãæ§ç¯ããããã®ãã¹ãŠã®ã¢ããã€ã¹ã¯ãElectron ã®ã¬ã³ããªã³ã°ã«ãé©çšãããŸãã çŸåšãèªç±ã«äœ¿ãã 2 ã€ã®äž»èŠãªããŒã«ããããŸããå°èŠæš¡ãªæäœçšã® requestIdleCallback()
ãšãé·æéå®è¡ããæäœçšã® Web Workers
ã§ãã
requestIdleCallback()
ã«ãããéçºè
ã¯ãããã»ã¹ãã¢ã€ãã«æéã«å
¥ããšããã«å®è¡ããã颿°ããã¥ãŒã«å
¥ããããšãã§ããŸãã ããã«ããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«åœ±é¿ãäžããããšãªããåªå
床ã®äœãäœæ¥ãããã¯ã°ã©ãŠã³ãäœæ¥ãå®è¡ã§ããŸãã äœ¿çšæ¹æ³ã®è©³çްã«ã€ããŠã¯ãMDNã®ããã¥ã¡ã³ããåç
§ããŠãã ããã
Web Worker ã¯å¥ã®ã¹ã¬ããã§ã³ãŒããå®è¡ãã匷åãªããŒã«ã§ãã There are some caveats to consider â consult Electron's multithreading documentation and the MDN documentation for Web Workers. é·æéã«ããã£ãŠå€§éã® CPU ãã¯ãŒãå¿ èŠãšããããããæäœã«çæ³çãªè§£æ±ºæ³ã§ãã
5. äžèŠãª polyfillâ
Electron ã®å€§ããªå©ç¹ã®1ã€ã¯ãJavaScriptãHTMLãCSS ãã©ã®ãšã³ãžã³ãè§£æããããæ£ç¢ºã«ç¥ã£ãŠããããšã§ãã ãŠã§ãåãã«æžãããã³ãŒããåå©çšããå Žåã¯ãElectron ã«å«ãŸããŠããæ©èœã polyfill ããªãããã«ããŠãã ããã
ãªãïŒâ
仿¥ã®ã€ã³ã¿ãŒãããçšã®ãŠã§ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããå Žåãæãå€ãç°å¢ã§ã¯ã䜿çšã§ããæ©èœãšäœ¿çšã§ããªãæ©èœã決ãŸããŸãã Electron ã¯ããã©ãŒãã³ã¹ã®è¯ã CSS ãã£ã«ã¿ãŒãšã¢ãã¡ãŒã·ã§ã³ããµããŒãããŠããŸãããå€ããã©ãŠã¶ã¯ããã§ã¯ãªããããããŸããã WebGL ã䜿çšã§ããå Žåãå€ãã¹ããŒããã©ã³ããµããŒãããããã«ãéçºè ã¯ãã®ãããªããå€ãã®ãªãœãŒã¹ãå¿ èŠãšããè§£æ±ºæ¹æ³ãéžæããŠããå¯èœæ§ããããŸãã
JavaScript ã«é¢ããŠã¯ãDOM ã»ã¬ã¯ã¿ãŒã®ããã ãã® jQuery ã regenerator-runtime
ã®ãã㪠async/await
ããµããŒãããããã ãã® polyfill ããŒã«ãããã©ã€ãã©ãªãå«ããããšãã§ããŸãã
JavaScript ããŒã¹ã® polyfill ã Electron ã®åçã®ãã€ãã£ãæ©èœãããé«éã«ãªãããšã¯ãŸãã§ãã æšæºãŠã§ããã©ãããã©ãŒã ã®æ©èœãèªäœããŠãElectron ã¢ããªã®é床ãèœãšããªãã§ãã ããã
ã©ãããã°ããã®ïŒâ
Electron ã®çŸåšã®ããŒãžã§ã³ãžã® ployfill ã¯äžèŠã§ãããšããä»®å®ã®äžã§æäœããŸãã If you have doubts, check caniuse.com and check if the version of Chromium used in your Electron version supports the feature you desire.
ããã«ã䜿çšããã©ã€ãã©ãªãæ³šææ·±ã調ã¹ãŠãã ããã æ¬åœã«å¿
èŠãªãã®ã§ããããã ããšãã°ãjQuery
ã¯éåžžã«æåããããããã®æ©èœã®å€ãã å©çšå¯èœãªæšæº JavaScript æ©èœã»ãã ã®äžéšã«ãªããŸããã
TypeScript ãªã©ã®ãã©ã³ã¹ãã€ã©ãŒ/ã³ã³ãã€ã©ã䜿çšããŠããå Žåã¯ããã®æ§æã調ã¹ãŠãElectron ã§ãµããŒããããŠããææ°ã® ECMAScript ããŒãžã§ã³ãã¿ãŒã²ããã«ããŠããããšã確èªããŠãã ããã
6. äžèŠãŸãã¯ãããã¯ããŠãããããã¯ãŒã¯ãªã¯ãšã¹ãâ
ãã£ãã«å€æŽãããªããªãœãŒã¹ãã¢ããªã±ãŒã·ã§ã³ãžç°¡åã«ãã³ãã«ã§ããå Žåã¯ãã€ã³ã¿ãŒãããããååŸããªãã§ãã ããã
ãªãïŒâ
Electron ã®å€ãã®ãŠãŒã¶ãŒã¯ããã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ã«ãªãã€ã€ããå®å šã«ãŠã§ãããŒã¹ã®ã¢ããªããå§ããŸãã ãŠã§ãéçºè ãšããŠãããŸããŸãªã³ã³ãã³ãé ä¿¡ãããã¯ãŒã¯ãããªãœãŒã¹ãããŒãããããšã«ã¯æ £ããŠããŸãã ä»ãããªãã¯é©åãªãã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ãé åžããŠããã®ã§ããããå¯èœãªéããããããåãæšãŠããããã«ããŠã決ããŠå€æŽãããã¢ããªãžç°¡åã«å梱ã§ããããªãªãœãŒã¹ã®ããã«ãŠãŒã¶ãŒãåŸ ãããªãããã«ããŸãããã
Google Fonts ã¯å žåäŸã§ãã å€ãã®éçºè ã¯ãã³ã³ãã³ãé ä¿¡ãããã¯ãŒã¯ã«ä»å±ãã Google ã®å°è±¡çãªç¡æãã©ã³ãã®ã³ã¬ã¯ã·ã§ã³ãå©çšããŠããŸãã è¡çšã¯ç°¡åã§ããCSS ã«æ°è¡ãå«ãããšãGoogle ãæ®ããåŠçããŸãã
Electron ã¢ããªãäœæãããšãããã©ã³ããããŠã³ããŒãããŠã¢ããªã®ãã³ãã«ã«å«ãããšããŠãŒã¶ãŒã®äœæãåäžããŸãã
ã©ãããã°ããã®ïŒâ
çæ³çãªäžçã§ã¯ãã¢ããªã±ãŒã·ã§ã³ãåäœããããã«ã¯ãããã¯ãŒã¯ããŸã£ããå¿ èŠãšããŸããã ããã«å°éããã«ã¯ãã¢ããªãäœãããŠã³ããŒãããŠããŠã©ã®ããã倧ãããªãœãŒã¹ãªã®ããçè§£ããå¿ èŠããããŸãã
ãã®ããã«ã¯ãããããããŒããŒã«ãéããŸãã Network
ã¿ãã«ç§»åããDisable cache
ãªãã·ã§ã³ã«ãã§ãã¯ãå
¥ããŸãã ãããŠãã¬ã³ãã©ãŒããªããŒãããŸãã ã¢ããªã§ãã®ãããªãªããŒããçŠæ¢ãããŠããªãéããéåžžãéçºè
ããŒã«ã«ãã©ãŒã«ã¹ã眮ã㊠Cmd + R
ãŸã㯠Ctrl + R
ãæŒããšããªããŒããçºçãããããŸãã
ããã§ãã®ããŒã«ã¯ãã¹ãŠã®ãããã¯ãŒã¯èŠæ±ãç¶¿å¯ã«èšé²ããŸãã æåã®ãã¹ã§ã¯ãããŠã³ããŒãããããã¹ãŠã®ãªãœãŒã¹ã®åšåº«ã確èªããæåã«å€§ããªãã¡ã€ã«ã«æ³šç®ããŸãã 倿Žãããããã³ãã«ã«å«ããããšãã§ãããããªç»åããã©ã³ããã¡ãã£ã¢ãã¡ã€ã«ã¯ããã§ããããã ããããã°ã忢±ããŸãããã
次ã®ã¹ããããšããŠãNetwork Throttling
ãæå¹ã«ããŸãã çŸåš Online
ãšè¡šç€ºãããŠããããããããŠã³ãèŠã€ããŠãFast 3G
ãªã©ã®äœéãªãã®ãéžæããŸãã ã¬ã³ãã©ãŒããªããŒãããã¢ããªãäžå¿
èŠã«åŸ
æ©ããŠãããªãœãŒã¹ããããã©ããã確èªããŸãã ã¢ããªã¯å€ãã®å Žåãå®éã«é¢é£ãããªãœãŒã¹ãå¿
èŠãšããªãã«ããããããããããã¯ãŒã¯ãªã¯ãšã¹ããå®äºããã®ãåŸ
ã£ãŠããŸãã
è±ç¥èãšããŠãã¢ããªã±ãŒã·ã§ã³ã®æŽæ°ãå ¬éããã®ã§ã¯ãªãã€ã³ã¿ãŒããããã倿ŽããããªãœãŒã¹ãããŒãããããšã匷åãªæŠç¥ã§ãã ãªãœãŒã¹ã®ããŒãæ¹æ³ãé«åºŠã«å¶åŸ¡ããã«ã¯ãService Worker ãžã®æ³šåãæ€èšããŠãã ããã
7. ã³ãŒãããã³ãã«ããâ
"ããŸãã«æ©ãã³ãŒãã®ããŒããšå®è¡" ã§æ¢ã«ææããããã«ãrequire()
ã®åŒã³åºãã¯ã³ã¹ãã®ãããæäœã§ãã å¯èœã§ããã°ãã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒããåäžã®ãã¡ã€ã«ã«ãã³ãã«ããŸãããã
ãªãïŒâ
ææ°ã® JavaScript éçºã«ã¯éåžžãå€ãã®ãã¡ã€ã«ãšã¢ãžã¥ãŒã«ãå«ãŸããŸãã Electron ã§ã®éçºã«ã¯ããã§ååã§ãããã¢ããªã±ãŒã·ã§ã³ãããŒããããšãã« require()
ã®åŒã³åºãã«å«ãŸãããªãŒããŒããããäžåºŠã ãæ¯æãããããã«ããã¹ãŠã®ã³ãŒãã1ã€ã®ãã¡ã€ã«ã«ãã³ãã«ããããšãåŒ·ãæšå¥šããŸãã
ã©ãããã°ããã®ïŒâ
倿°ã® JavaScript ãã³ãã«ãååšããŸãããããããŒã«ãå¥ã®ããŒã«ãããæšå¥šããŠã³ãã¥ããã£ãæãããããããè¯ãæ¹æ³ãç¥ãããŠããŸãã ãã ããNode.js ç°å¢ãšãã©ãŠã¶ç°å¢ã®äž¡æ¹ãåŠçããå¿ èŠããã Electron ç¬èªã®ç°å¢ãåŠçã§ãããã³ãã©ãŒã䜿çšããããšãæšå¥šããŸãã
ãã®èšäºãæžããŠããæç¹ã§ã®äžè¬çãªéžæè¢ã«ã¯ãWebpackãParcelãããã³ rollup.js ããããŸãã
8. ããã©ã«ãã®ã¡ãã¥ãŒãäžèŠãªã Menu.setApplicationMenu(null)
ãåŒã³åºãâ
Electron ã¯èµ·åæã«ãããã€ãã®æšæºé ç®ãå ¥ããããã©ã«ãã®ã¡ãã¥ãŒãèšå®ããŸãã ãããã¢ããªã±ãŒã·ã§ã³ããã®èšå®ã倿Žãããã®ã§ããã°ããããããšèµ·åæã®ããã©ãŒãã³ã¹ã§æå©ã«åããŸãã
ãªãïŒâ
ç¬èªã®ã¡ãã¥ãŒãäœæãããããã€ãã£ãã¡ãã¥ãŒã®ãªããã¬ãŒã ã¬ã¹ãŠã£ã³ããŠã䜿çšããå Žåã¯ãããã©ã«ãã¡ãã¥ãŒãèšå®ããªãããæ©ãã« Electron ã«äŒããŠããã¹ãã§ãã
ã©ãããã°ããã®ïŒâ
app.on("ready")
ã®åã« Menu.setApplicationMenu(null)
ãåŒã³åºããŸãããã ããã«ãã Electron ã¯ããã©ã«ãã®ã¡ãã¥ãŒãèšå®ããªããªããŸãã é¢é£ããè°è«ã«ã€ããŠã¯ https://github.com/electron/electron/issues/35512 ãã芧ãã ããã