±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜΪʲôѡÔñ
Electron?½ø³ÌÄ£Ðͺͼ¼ÊõÑ¡ÐÍÓë´úÂë×éÖ¯£¬×îºó½éÉÜ Electron µÄһЩÐÔÄÜÓÅ»¯£¬Ï£Íû¶ÔÄúÄÜÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚ¾ò½ð,ÓÉ»ðÁú¹ûÈí¼þAlice±à¼ÍƼö¡£ |
|
ΪʲôѡÔñ Electron?
ÔÒòÒ²ºÜ¼òµ¥: ÎÒÃǵÄÓ¦ÓÃÒª¼æÈݶà¸öƽ̨£¬ÔÉú¿ª·¢Ð§Âʵͣ¬ÎÒÃÇûÓÐ×ÊÔ´¡£
˵Á˸ú°×˵һÑù£¬´ó²¿·ÖÑ¡Ôñ Electron ¿ò¼ÜµÄ¶¯»ú¶¼ÊDz¶àµÄ£¬Î޷ǾÍÊÇÇÓÈÆäÊÇÔڼзìÖÐÉú´æµÄÆóÒµ¡£
ΪÁËÓÅ»¯¿Í»§¶Ë¿ª·¢×ÊÔ´£¬'»ìºÏ»¯'³ÉΪÁËÎÒÃǽñÄê¿Í»§¶ËÖØ¹¹µÄÖ÷Ìâ¡£
ÏÈÀ´¿´Ò»ÏÂÎÒÃÇÏÖÔڵĿͻ§¶Ë»ù±¾¼Ü¹¹:

»ìºÏ»¯¶ÔÎÒÃÇÀ´ËµÓÐÁ½²ãÒâ˼:
1.ÎÒÃǵÄÓ¦Óüܹ¹'»ìºÏ'Á˶àÖÖ¼¼Êõ¡£Í¨Óõײã C/C++, ƽ̨ÔÉú(iOS,
Android, PC, MacOS)£¬Web ¼¼Êõ
2.¿çƽ̨
»ùÓÚÎÒÃÇÔÓеĿͻ§¶Ë»ù´¡ºÍÇé¿ö£¬»ìºÏ»¯Öع¹×ÔÈ»¶øÈ»·Ö»¯ÎªÁËÁ½¸ö·½Ïò:
1.ÒµÎñϳÁ¡£½«Í¨Óõġ¢ºËÐĵÄÒµÎñϳÁ¡£ÀýÈçÏûÏ¢´¦Àí¡¢ÓïÒô/ÊÓÆµ¡¢»áÒé¡¢Êý¾Ý´æ´¢µÈºËÐÄÄ£¿é,
ºËÐÄÐÒéÊÇ XMPP¡¢SIP¡£ÕâЩģ¿é±ä¶¯ÆµÂʽϵ͡¢¶ÔÐÔÄÜÒªÇóÒ²±È½Ï¸ß£¬¶øÇÒÓÐ¿çÆ½Ì¨ÐèÇó£¬Òò´ËÊʺÏÓÃ
C/C++ À´ÊµÏÖ¡£
2.UI »ìºÏ¡£ÊÓͼ²ã»ìºÏ»¯Ä¿Ç°Ò²Óн϶àµÄ½â¾ö·½°¸£¬ÀýÈç Electron¡¢React
Native¡¢Flutter¡¢»òÕßÊÇ HTML Hybrid¡£ÎÒÃÇÑ¡ÔñÏÈ´Ó Electron ¿ªÊ¼£¬ÒòΪËüÔÚ×ÀÃæ¶Ë¿ª·¢ÖÐÒѾÓзdz£³ÉÊìµÄ±íÏÖ£¬Êг¡ÉÏÒ²Óкܶà´óÐ͵Ä
Electron Ó¦Óã¬ÀýÈç VSCode¡¢Atom¡¢Slack¡£ÔÚÒÆ¶¯¶Ë£¬ÎÒÃÇ¶Ô React Native
ºÍ Flutter »¹±È½Ï±£ÊØ£¬ºóÐø¿ÉÄÜ»á½øÐг¢ÊÔ¡£Àí½âÁËÎÒÃǵ͝»ú£¬ÏÖÔÚÔÙ¿´ÉÏÃæµÄͼ, Ó¦¸Ã¾ÍºÃÀí½â¶àÁË,
ÕâÊǵäÐ͵ÄÈý²ã½á¹¹, ºÍ MVC ·Ç³£ÏàËÆ£º
1.M -- ͨÓûìºÏ²ã¡£ C/C++ ·â×°ºËÐÄ¡¢Í¨ÓõÄÒµÎñÄ£¿éÒÔ¼°ÒµÎñÊý¾Ý´æ´¢¡£
2.V -- UI ²ã¡£ÊÓͼ²ã£¬Ê¹ÓÃ¿çÆ½Ì¨ÊÓͼ½â¾ö·½°¸£¬¶ÔÓÚÐÔÄÜÒªÇó½Ï¸ßµÄ²¿·ÖʹÓÃÔÉúʵÏÖ¡£±ÈÈç
Electron
3.C -- ƽ̨ÇŽӲ㡣½éÓÚ M ºÍ V Ö®¼ä£¬ÇŽÓͨÓûìºÏ²ã½Ó¿Ú£¬Í¬Ê±Ò²Îª
UI ²ã±©Â¶Ò»Ð©Æ½Ì¨Ïà¹ØµÄÌØÐÔ¡£±ÈÈçÔÚ×ÀÃæ¶Ë£¬ÕâÀï»áͨ¹ý Node ÔÉúÄ£¿éÇŽÓͨÓûìºÏ²ã, ͬʱҲ²¹³äһЩ
Electron ȱʧ»ò²»ÍêÃÀµÄ¹¦ÄÜ¡£
½ø³ÌÄ£ÐÍ
Electron µÄÖ÷´Ó½ø³ÌÄ£ÐÍÊÇ»ù±¾µÄ³£Ê¶¡£Ã¿¸ö Electron Ó¦ÓÃÓÐÇÒÖ»ÒªÒ»¸öÖ÷½ø³Ì(Main
Process)¡¢ÒÔ¼°Ò»¸ö»ò¶à¸öäÖȾ½ø³Ì(Renderer Process), ¶ÔÓ¦¶à¸ö Web Ò³Ãæ¡£³ý´ËÖ®Í⻹ÓÐ
GPU ½ø³Ì¡¢À©Õ¹½ø³ÌµÈµÈ¡£¿ÉÒÔͨ¹ý Electron Application Architecture
Á˽â Electron µÄ»ù±¾¼Ü¹¹¡£
Ö÷½ø³Ì¸ºÔð´´½¨Ò³Ãæ´°¿Ú¡¢Ðµ÷½ø³Ì¼äͨÐÅ¡¢Ê¼þ·Ö·¢¡£ÎªÁ˰²È«¿¼ÂÇ£¬ÔÉú GUI Ïà¹ØµÄ API ÊÇÎÞ·¨ÔÚäÖȾ½ø³ÌÖ±½Ó·ÃÎʵģ¬ËüÃDZØÐëͨ¹ý
IPC µ÷ÓÃÖ÷½ø³Ì¡£ÕâÖÖÖ÷´Ó½ø³ÌÄ£ÐÍȱµãÒ²·Ç³£Ã÷ÏÔ£¬¼´Ö÷½ø³Ìµ¥µã¹ÊÕÏ¡£Ö÷½ø³Ì±ÀÀ£»òÕß×èÈû£¬»áÓ°ÏìÕû¸öÓ¦ÓõÄÏìÓ¦¡£±ÈÈçÖ÷½ø³ÌÅܳ¤Ê±¼äµÄ
CPU ÈÎÎñ£¬½«×èÈûäÖȾ½ø³ÌµÄÓû§½»»¥Ê¼þ¡£
¶ÔÎÒÃǵÄÓ¦ÓÃÀ´Ëµ£¬Ä¿Ç°ÓÐÒÔϽø³Ì, ÒÔ¼°ËüÃǵÄÖ°Ôð:
¢Ù Ö÷½ø³Ì
½ø³Ì¼äͨÐÅ¡¢´°¿Ú¹ÜÀí
È«¾ÖͨÓ÷þÎñ¡£
һЩֻÄÜ»òÊʺÏÔÚÖ÷½ø³Ì×öµÄÊÂÇé¡£ÀýÈçä¯ÀÀÆ÷ÏÂÔØ¡¢È«¾Ö¿ì½Ý¼ü´¦Àí¡¢ÍÐÅÌ¡¢session¡£
ά»¤Ò»Ð©±ØÒªµÄÈ«¾Ö״̬
ÉÏÃæËµµÄͨÓûìºÏ²ãÒ²ÅÜÔÚÕâ¸ö½ø³Ì¡£Í¨¹ý Node C++ ²å¼þ±©Â¶½Ó¿Ú¡£¢Ú äÖȾ½ø³Ì
¸ºÔð Web Ò³ÃæµÄäÖȾ, ¾ßÌåÒ³ÃæµÄÒµÎñ´¦Àí¡£
¢Û Service Worker
¸ºÔð¾²Ì¬×ÊÔ´»º´æ¡£»º´æÒ»Ð©ÍøÂçͼƬ¡¢ÒôƵ¡£±£Ö¤¾²Ì¬×ÊÔ´µÄÎȶ¨¼ÓÔØ¡£
¼¼ÊõÑ¡ÐÍÓë´úÂë×éÖ¯
˵˵ÎÒÃǵļ¼ÊõÑ¡ÐÍ¡£
UI ¿ò¼Ü - React
״̬¹ÜÀí - Mobx
¹ú¼Ê»¯ - i18next
´ò°ü - ×ÔÑÐ CLI
Ô´Âë×éÖ¯
bridge/ # ÇŽӲã´úÂë
resources/ # ¹¹½¨×ÊÔ´£¬ÒÔ¼°µÚÈý·½DLL
src/
main/ # Ö÷½ø³Ì´úÂë
services/ # **ͨ¹ý RPC ±©Â¶¸øäÖȾ½ø³ÌµÄÈ«¾Ö·þÎñ**
tray.ts # ÍÐÅÌ״̬¹ÜÀí
shortcut.ts # È«¾Ö¿ì½Ý¼ü·Ö·¢
preferences.ts # Óû§ÅäÖùÜÀí
windows.ts # ´°¿Ú¹ÜÀí
screen-capture.ts # ½ØÆÁ
bridge.ts # ÇŽӲã½Ó¿Ú·â×°
context-menu.ts # ÓÒ¼ü²Ëµ¥
state.ts # È«¾Ö״̬¹ÜÀí, ±£´æÒ»Ð©±ØÒªµÄÈ«¾Ö״̬£¬ÀýÈçÖ÷Ìâ¡¢µ±Ç°ÓïÑÔ¡¢µ±Ç°Óû§
...
lib/ # ·â×°¿â
bridge.ts # ÇŽӲãAPI ·Ö×°
logger.ts # ÈÕÖ¾
...
bootstrap.ts # Æô¶¯³ÌÐò
index.ts # Èë¿ÚÎļþ
renderer/ # äÖȾ½ø³Ì
services/ # Ö÷½ø³ÌµÄÈ«¾Ö·þÎñµÄ¿Í»§¶Ë
windows.ts # ´°¿Ú¹ÜÀí¿Í»§¶Ë
tray.ts
...
assets/ # ¾²Ì¬×ÊÔ´
hooks/ # React Hooks
components/ # ͨÓÃ×é¼þ
Webview
Editor
toast
...
pages/ # Ò³Ãæ
Home
ui/ # ÊÓͼ´úÂ룬ÓÉǰ¶ËÍŶÓά»¤
store/ # ״̬´úÂ룬Óɿͻ§¶ËÍŶÓά»¤£¬Ç°¶ËStoreµÄ¹«¿ª×´Ì¬
translation/ # ¹ú¼Ê»¯·ÒëÎļþ
index.tsx # Ò³ÃæÈë¿Ú
Settings
Login
page.json #ÉùÃ÷ËùÓÐÒ³Ãæ¼°Ò³ÃæÅäÖá£ÀàËÆÐ¡³ÌÐò
|
ÑÛ¼âµÄ¶ÁÕ߻ᷢÏÖÿ¸öÒ³ÃæÏÂÓÐ ui ºÍ store Ŀ¼£¬·Ö±ð¶ÔÓ¦ÊÓͼºÍ״̬¡£ÎªÊ²Ã´Õâô»®·Ö£¿
Ê×ÏÈÕâÊÇÒòΪÕâ¸öÏîÄ¿ÓÉÁ½¸öÍŶӹ²Í¬À´¿ª·¢µÄ£¬¼´ÔÓеÄÔÉú¿Í»§¶ËÍŶӺÍÎÒÃǵÄǰ¶ËÍŶӡ£·ÖÀëÊÓͼºÍ״̬ÓÐÁ½¸öºÃ´¦:
ǰ¶ËǰÆÚ²»ÐèÒª¹ØÐĿͻ§¶Ëµ×²ãÒµÎñ£¬¶ø¿Í»§¶ËÒ²²»ÐèÒª¹ØÐÄǰ¶ËµÄÒ³ÃæÊµÏÖ¡£Ö°ÔðÃ÷È·£¬¸÷×ԸɺÃ×Ô¼ºÊÂÇé¡£
½µµÍѧϰ³É±¾¡£ÎÒÃÇ״̬¹ÜÀíÑ¡ÓÃÁË Mobx£¬¶ÔÓÚ¿Í»§¶Ëͬѧ£¬Ö»ÐèÒªÕÆÎÕÉÙÁ¿µÄ Typescript
ÓïÑÔ֪ʶ¾Í¿ÉÒÔÂíÉÏÉÏÊÖ¡£Èç¹ûÊìϤ Java¡¢C# ÄǾ͸üûʲôÎÊÌâÁË¡£Ã¿¸ö Store Ö»ÊÇÒ»¸ö¼òµ¥µÄÀࣺ
class CounterStore
extends MobxStore {
@observable
public count: number = 0
@action
public incr = () => {
this.count++
} private pageReady() {
// Ò³Ãæ¾ÍÐ÷£¬¿ÉÒÔÔÚÕâÀï×öһЩ׼±¸¹¤×÷ // ʼþ¼àÌý
// addDisposer ½«Êͷź¯ÊýÌí¼Óµ½¶ÓÁÐÖУ¬ÔÚÒ³ÃæÍ˳öʱÊÍ·Å
this.addDisposer(
addListener('someevent', evt => {
this.dosomething(evt)
})
) // ...
this.initial()
} private pageWillClose() {
// Ò³ÃæÊÍ·Å£¬¿ÉÒÔÔÚÕâÀï×öһЩ×ÊÔ´ÊÍ·Å
releaseSomeResource()
} // ....
}
|
ʹÓà Mobx ×÷Ϊ״̬¹ÜÀí£¬Ïà±È Redux£¬ÃæÏò¶ÔÏó˼Ïë¶ÔËûÃǸüºÃÀí½â¡£ÔÚÕâÖÖ³¡¾°£¬¼òµ¥²ÅÊÇÕæÀí£»
·ÖÀëÁË״̬ºÍÒµÎñÂß¼£¬Ç°¶ËÒ³ÃæÊµÏÖÒ²¼ò»¯ÁË£¬ÊÓͼֻÊÇ״̬µÄÓ³É䣬ÕâÈÃÎÒÃǵÄÒ³ÃæºÍ×é¼þ¸üºÃ±»Î¬»¤ºÍ¸´Óá£
ÐÔÄÜÓÅ»¯(Ó²»õ)
ǰϷÍêÁË£¬¹ØÓÚ Electron µÄһЩÐÔÄÜÓÅ»¯²ÅÊDZ¾ÆªÎÄÕµÄÖØÍ·Ï·¡£
Electron ²»ÊÇÒøµ¯£¬ÓãºÍÐÜÕÆ²»¿É¼æµÃ¡£Electron ´øÀ´¿ª·¢Ð§ÂʵÄÌáÉý£¬Æä±¾ÉíÒ²ÓкܶàÓ²ÉË£¬Æ©Èç³£±»ÈËͲ۵ÄÄÚ´æÕ¼Óøߣ¬ºÍÔÉú¿Í»§¶ËÐÔÄܲîÒìµÈµÈ¡£ÎªÁËÓÅ»¯
Electron Ó¦Óã¬ÎÒÃÇÒ²×öÁ˺ܶ๤×÷¡£
ÐÔÄÜÓÅ»¯Ò»°ã¶¼·ÖÁ½²½×ߣº
¢Ù ·ÖÎö¡¢ÕÒ³öÎÊÌâ¡£²Î¿¼¡¶React ÐÔÄܲâÁ¿ºÍ·ÖÎö¡·
¢Ú Õë¶ÔÎÊÌâ½â¾öÎÊÌâ¡£ÎÞÍâºõÈý¸ö·½Ïò, ²Î¿¼ ¡¶Ç³Ì¸ React
ÐÔÄÜÓÅ»¯µÄ·½Ïò¡·
1. ÐÔÄÜ·ÖÎö
×îºÃµÄ·ÖÎö¹¤¾ßÊÇ Chrome ¿ª·¢Õß¹¤¾ßµÄ Performance¡£Í¨¹ý»ðÑæÍ¼,
JavaScript Ö´Ðйý³ÌµÄÈκÎÖëË¿Âí¼£¶¼¿ÉÒÔÖ±¹ÛµÄ¿´µ½¡£

¶ÔÓÚÖ÷½ø³Ì£¬¿ªÆôµ÷ÊÔºóÒ²¿ÉÒÔͨ¹ý Profile ¹¤¾ßÊÕ¼¯ JavaScript
Ö´ÐÐÐÅÏ¢¡£
Èç¹ûÄãÒª·ÖÎöij¶Î´úÂëµÄÖ´Ðйý³Ì£¬Ò²¿ÉÒÔͨ¹ýÏÂÃæÃüÁîÉú³É·ÖÎöÎļþ£¬È»ºóµ¼Èëµ½ Chrome Performance
ÖзÖÎö:
# Êä³ö cpu ºÍ ¶Ñ·ÖÎöÎļþ
node --cpu-prof --heap-prof -e "require('request¡¯)¡±¡° |
2. ÓÅ»¯²ßÂÔ
2.1 ¼ÌÐøºÍ°×ÆÁ×÷¶·Õù
¼´Ê¹ Electron ͨ³£´Ó±¾µØÎļþϵͳ¼ÓÔØ JavaScript ´úÂ룬ûÓÐÍøÂç¼ÓÔØÑÓ³Ù£¬ÎÒÃÇ»¹ÊÇÐèÒª¼ÌÐøºÍÒ³Ãæ°×ÆÁ×ö¶·Õù£¬ÒòΪ
JavaScript µÈ×ÊÔ´µÄ¼ÓÔØ¡¢½âÎöºÍÖ´Ðл¹ÊÇÓÐÏ൱´óµÄ´ú¼Û(²Î¿¼The cost of JavaScript
in 2019)¡£×÷Ϊһ¸ö×ÀÃæ¶ËÓ¦Óã¬Ï¸Î¢µÄ°×ÆÁÑÓ³ÙÓû§¶¼¿ÉÒԸоõµÄµ½¡£ÎÒÃÇÒª¾¡Á¿ÈÃÓû§¸Ð¾õ²»µ½ÕâÊÇÒ»¸ö
Web Ò³Ãæ¡£
Ó°Ïì Electron °×ÆÁµÄÖ÷ÒªÒòËØÓУºÒ³Ãæ´°¿ÚµÄ´´½¨¡¢¾²Ì¬×ÊÔ´µÄ¼ÓÔØ¡¢JavaScript ½âÎöºÍÖ´ÐС£
¼ûÕвðÕУ¬Õë¶ÔÒ³Ãæ°×ÆÁÎÒÃÇ×öÁËÕâЩÓÅ»¯:
¢Ù ¹Ç¼ÜÆÁ
×î¼òµ¥µÄ·½Ê½¡£ÔÚ×ÊԴδ¼ÓÔØÍê±Ï֮ǰ£¬ÏÈÕ¹Ê¾Ò³ÃæµÄ¹Ç¼Ü¡£±ÜÃâÓû§¿´µ½°×ããµÄÆÁÄ»¡£
ÁíÍâÐèÒªÉèÖñ³¾°É«»òÕßÑÓ³ÙÏÔʾ´°¿Ú£¬À´±ÜÃâÉÁ˸¡£

VSCode¹Ç¼ÜÆÁ
¢Ú ¶èÐÔ¼ÓÔØ
ÓÅÏȼÓÔØºËÐĵŦÄÜ£¬±£Ö¤³õ´Î¼ÓÔØÐ§ÂÊ£¬ÈÃÓû§¿ÉÒÔ¾¡¿ì½øÐн»»¥¡£

´úÂë·Ö¸î + Ô¤¼ÓÔØ£º ´úÂë·Ö¸îÊÇ×î³£¼ûÓÅ»¯·½Ê½¡£ÎÒÃǰÑÒþ²ØµÄÄÚÈÝ¡¢»òÕß´ÎÓÅÏȼ¶µÄÄ£¿é²ð·Ö³öÈ¥£¬Æô¶¯Ä£¿éÖÐÖ»±£Áô¹Ø¼ü·¾¶¡£ÎÒÃÇÒ²¿ÉÒÔÔÚä¯ÀÀÆ÷¿ÕÏÐʱԤ¼ÓÔØÕâЩģ¿é¡£ÑÓºó¼ÓÔØ
Node Ä£¿é£º Nodejs Ä£¿éµÄ¼ÓÔØºÍÖ´ÐÐÐèÒª»¨·Ñ½Ï´óµÄ´ú¼Û, ÀýÈçÄ£¿é²éÕÒ¡¢Ä£¿éÎļþ¶ÁÈ¡¡¢½Ó×ŲÅÊÇÄ£¿é½âÎöºÍÖ´ÐС£ÕâЩ²Ù×÷¶¼ÊÇͬ²½ÁË£¬±ðÍüÁË£¬node_modules
ºÚ¶´£¬Ä³¿éÄ£¿é¿ÉÄÜ»áÒýÓôóÁ¿µÄÒÀÀµ....
Node Ó¦ÓÃºÍ Electron Ó¦Óò»Ì«Ò»Ñù£¬Í¨³£ Node ·þÎñÆ÷Ó¦Óö¼»á½«Ä£¿é·ÅÖÃÔÚÎļþ¶¥²¿,
È»ºóͬ²½¼ÓÔØ½øÀ´¡£Õâ¸ö·Åµ½ Electron Óû§½çÃæÉϾÍÎÞ·¨ÈÌÊÜÁË¡£ Óû§½çÃæµÄÆô¶¯ËٶȺͽ»»¥×èÈû,
Óû§ÊÇ¿ÉÒÔ¸ÐÖªµ½µÄ£¬¶øÇÒÈÌÄͳ̶Ȼá½ÏµÍ¡£
ËùÒÔÒª³ä·ÖÆÀ¹ÀÄ£¿éµÄ´óСºÍÒÀÀµ¡£»òÕß¿ÉÒÔÑ¡ÔñʹÓôò°ü¹¤¾ßÓÅ»¯ºÍºÏ²¢ Node Ä£¿é¡£»®·Ö¼ÓÔØÓÅÏȼ¶£º¼ÈÈ»ÎÒÃÇû°ì·¨Ò»¿ªÊ¼½«ËùÓж«Î÷¶¼¼ÓÔØ³öÀ´£¬ÄǾͰ´ÕÕÓÅÏȼ¶½¥½øÊ½µØ½«ÔÚËüÃÇ¡£¾Ù¸öÀý×Ó£¬µ±ÎÒÃÇʹÓÃ
VSCode ´ò¿ªÒ»¸öÎļþʱ£¬VScode »áÏÈչʾ´úÂëÃæ°å¡¢½Ó×ÅÊÇĿ¼Ê÷¡¢²à±ßÀ¸¡¢´úÂë¸ßÁÁ¡¢ÎÊÌâÃæ°å¡¢³õʼ»¯¸÷ÖÖ²å¼þ...
¢Û ʹÓÃÏÖ´úµÄ JavaScript/CSS ´úÂë
Electron ÿ¸ö°æ±¾¶¼»áԤװµ±Ê±×îÐ嵀 Chrome£¬¶ÔÓÚǰ¶ËÀ´Ëµ£¬ÕâÊÇ×îˬµÄÒ»¼þÊÂÇé:
ûÓиºµ£µØÊ¹ÓÃ×îÐ嵀 JavaScript ÌØÐÔ
ûÓÐ Polyfill¡¢Ã»ÓÐ runtime-helper¡£Ïà±ÈÀϾÉä¯ÀÀÆ÷£¬´úÂëÁ¿¸üÉÙ£¬ÐÔÄÜÒ²¸üºÃ
ÎÒÃÇÐèÒªÖ÷¶¯ÅׯúһЩÀϾɵÄÒÀÀµ¡£±£³ÖʹÓÃ×îеĿâ¢Ü ´ò°üÓÅ»¯
¼´Ê¹Ê¹ÓÃ×îÐÂ×îÅ£±ÆµÄä¯ÀÀÆ÷£¬´ò°ü¹¤¾ß»¹ÊǺÜÓÐÓá£
¼õÉÙ´úÂëÌå»ý: ÏÖ´ú´ò°ü¹¤¾ßÓзdz£¶àÓÅ»¯ÊֶΣ¬ÀýÈç Webpack Ö§³Ö×÷ÓÃÓòÌáÉý¡¢Ò¡Ê÷£¬»¹ÓдúÂëѹËõ¡¢Ô¤Ö´ÐÐ...
Õâ¿ÉÒԺϲ¢´úÂ롢ѹËõ´úÂëÌå»ý£¬²Ã¼ô¶àÓàµÄ´úÂë, ¼õÉÙÔËÐÐʱ¸ºµ£¡£
ÓÅ»¯I/O: ÎÒÃǽ«Ä£¿éºÏ²¢Ö®ºó£¬¿ÉÒÔ¼õÉÙÄ£¿é²éÕҺͼÓÔØµÄI/OÍù·µ¡£¢Ý v8 Snapshot or
v8 Code Cache
Atom ÓкܶàÓÅÖʵÄÎÄÕ£¬·ÖÏíÁËËûÃÇÓÅ»¯AtomµÄ¾Àú¡£ÀýÈçËüÃÇʹÓÃÁË V8 µÄsnapshot
À´ÓÅ»¯Æô¶¯Ê±¼ä¡£
ÕâÊÇÒ»ÖÖ AOT ÓÅ»¯²ßÂÔ£¬¼òµ¥Ëµ Snapshot ÊǶѿìÕÕ£¬Äã¿ÉÒÔÈÏΪËüÊÇ JavaScript
´úÂëÔÚV8ÖеÄÄÚ´æ±íʾÐÎ̬¡£
ËüÓÐÁ½¸öºÃ´¦: Ò»ÊÇÏà±ÈÆÕͨ JavaScript ¼ÓÔØ¸ü¿ì£¬¶þÊÇËüÊǶþ½øÖƵģ¬Èç¹ûÄãΪÁË¡®°²È«¡¯¿¼ÂÇ£¬¿ÉÒÔ½«Ä£¿éת»»³Ésnapshot£¬ÕâÑù¸üÄѱ»¡®ÆÆ½â¡¯¡£
²»¹ýËüÒ²Óн϶àÏÞÖÆ¡£¶Ô¼Ü¹¹µÄÓ°Ïì±È½Ï´ó¡£±ÈÈçÒªÇóÔÚ³õʼ»¯µÄ¹ý³ÌÖв»ÒªÓС®¸±×÷Óᯣ¬ÀýÈçDOM·ÃÎÊ¡£ÒòΪÔÚ¡®±àÒëʱ¡®ÕâЩ¶«Î÷²»´æÔÚ¡£
ÕâÆªÎÄÕÂÏêϸ½éÉÜÁËÈçºÎÔÚ Electron ÖÐÓ¦Óà v8 snapshot: How Atom Uses
Chromium Snapshots
»¹ÓÐÒ»¸ö¸ü¼Ó¹ã·ºÊ¹Óõķ½°¸ÊÇ v8 Code Cache¡£NodeJS 12 ¿ªÊ¼ÔÚ¹¹½¨Ê±ÌáǰΪÄÚÖÿâÉú³É´úÂ뻺´æ£¬´Ó¶øÌáÉý
30% µÄÆô¶¯ºÄʱ¡£
ͨ¹ýÕâЩÎÄÕ£¬ÉîÈëÁ˽â Code Cache À©Õ¹ÔĶÁ:
1.Code caching for JavaScript developers
2.JavaScript Start-up Performance
3.Improved code caching
4.ÈçºÎ¼Ó¿ì Node.js Ó¦ÓÃµÄÆô¶¯ËÙ¶È
¢Þ ´°¿ÚÔ¤ÈÈ Óë ´°¿Ú³Ø¡¢´°¿Ú³£×¤
ΪÁË×·¸ÏÔÉú´°¿ÚµÄ´ò¿ªºÍչʾËÙ¶È£¬ÎÒÃÇÔËÓÃÁ˺ܶ༼ÇÉ£¬ÓÿռäÀ´»»È¡Ê±¼ä¡£
ÀýÈçÎÒÃǵÄÓ¦ÓÃÊ×Ò³£¬Óû§ÔÚ´ò¿ªµÇÂ¼Ò³ÃæÊ±£¬ÎÒÃǾͻáÔÚºǫ́ԤÈÈ£¬½«¸Ã¼ÓÔØµÄ×ÊÔ´¶¼×¼±¸ºÃ£¬ÔڵǼ³É¹¦ºó£¬¾Í¿ÉÒÔÁ¢¼´äÖȾÏÔʾ¡£´°¿Ú´ò¿ªµÄÑÓʱºÜ¶Ì£¬»ù±¾½Ó½üÔÉúµÄ´°¿ÚÌåÑé¡£
ÕâÀïÓõ½ÁËһЩ Hack ÊֶΣ¬ÎÒÃǽ«ÕâЩ´°¿Ú·Åµ½ÁËÆÁĻ֮Í⣬²¢ÉèÖà skipTaskBar À´ÊµÏÖÒþ²Ø»òÕ߹رյÄЧ¹û¡£
¶ÔÓÚÆµ·±¿ªÆô/¹Ø±ÕµÄ´°¿Ú£¬Ò²¿ÉÒÔʹÓô°¿Ú³ØÀ´ÓÅ»¯¡£±ÈÈç Webview Ò³Ãæ£¬´ò¿ªµÄÒ»¸ö Webview
Ò³ÃæÊ±£¬»áÓÅÏÈ´Ó´°¿Ú³ØÖÐѡȡ£¬µ±´°¿Ú³ØÎª¿Õʱ²Å´´½¨ÐµĴ°¿Ú, ºóÃæÒ³Ãæ¹Ø±Õºó»áÔٷŻش°¿Ú³ØÖУ¬·½±ãºóÐø¸´Óá£
ÁíÍ⣬¶ÔÓÚÒµÎñÎ޹صġ¢Í¨ÓõĴ°¿Ú£¬Ò²¿ÉÒÔ²ÉÓó£×¤Ä£Ê½£¬ÀýÈç֪ͨ£¬Í¼Æ¬²é¿´Æ÷¡£ÕâЩ´°¿ÚÒ»µ©´´½¨¾Í²»»áÊÍ·Å£¬´ò¿ªÐ§¹û»á¸üºÃ¡£
¢ß ¸ú½ø Electron ×îа汾
±£³Ö°æ±¾µÄ¸üС£
2.2 ×·¸ÏÔÉúµÄ½»»¥ÌåÑé
°×ÆÁʱ¼äµÄÓÅ»¯Ö»ÊÇÒ»¸ö¿ªÊ¼£¬Ó¦ÓÃʹÓùý³ÌÖеĽ»»¥ÌåÑéÒ²ÊÇÒ»¸ö·Ç³£ÖØÒªµÄ²¿·Ö¡£ÏÂÃæ½²½²ÎÒÃǵÄһЩÓÅ»¯ÊֶΣº
¢Ù ¾²Ì¬×ÊÔ´»º´æ
¶ÔÓÚÒ»Ð©ÍøÂç×ÊÔ´£¬ÎÒÃDzÉÈ¡ÁËһЩ»º´æÊֶΣ¬±£Ö¤ËüÃÇչʾµÄËÙ¶È¡£ÎÒÃÇĿǰ²ÉÓõÄÊÇ Service-Worker
+ Workbox µÄ·½Ê½£¬ÀûÓà Service-Worker ¿ÉÒÔÀ¹½Ø¶à¸öÒ³ÃæµÄÍøÂçÇëÇ󣬴ӶøÊµÏÖ¿çÒ³ÃæµÄ¾²Ì¬×ÊÔ´»º´æ£¬ÕâÖÖ·½Ê½ÊµÏֱȽϼòµ¥¡£
³ýÁË Service Worker£¬Ò²¿ÉÒÔͨ¹ýÐÒéÀ¹½Ø·½Ê½À´ÊµÏÖ¡£Ïê¼û: protocol¡£ºóÃæÓÐʱ¼äÔÙ³¢ÊÔһϣ¬¿´Ð§¹ûÔõôÑù¡£
¢Ú Ô¤¼ÓÔØ»úÖÆ
Èç¹ûÄã¿´¹ýÎÒµÄ ¡¶Õâ¿ÉÄÜÊÇ×îͨË×µÄ React Fiber(ʱ¼ä·ÖƬ) ´ò¿ª·½Ê½¡·, Ó¦¸Ã¼ûʶµ½ requestIdleCallback
µÄÇ¿´ó£¬React ÀûÓÃËüÀ´µ÷¶ÈһЩäÖȾÈÎÎñ£¬±£Ö¤ä¯ÀÀÆ÷ÏìÓ¦Óû§µÄ½»»¥¡£
Õâ¸ö API ¶ÔÓÚÎÒÃǵÄÓ¦ÓÃÓÅ»¯Ò²ÓÐÖØÒªµÄÒâÒ塣ͨ¹ýËüÎÒÃÇ¿ÉÒÔÖªµÀä¯ÀÀÆ÷µÄ×ÊÔ´ÀûÓÃÇé¿ö£¬ÀûÓÃä¯ÀÀÆ÷¿ÕÏÐʱ¼äÀ´Ô¤Ö´ÐÐһЩµÍÓÅÏȼ¶µÄÈÎÎñ¡£±ÈÈ磺
1.äÖȾÒþ²ØµÄ Tab
2.ÑÓºó¼ÓÔØµÄÄ£¿é´úÂë
3.¶èÐÔ¼ÓÔØµÄͼƬ
4.δ¼¤»îµÄ»á»°
5.Ö´ÐеÍÓÅÏȼ¶µÄÈÎÎñ
...
ÀýÈç React ´úÂë·Ö¸î£º
export default
function lazy(factory, Fallback) {
const Comp = l(factory)
// Ô¤¼ÓÔØµ÷¶È
scheduleIdle({
name: 'LazyComponent',
size: TaskSize.Heavy,
task: factory,
timeout: 2000,
})
return function LazyComponent(props) {
return (
<Suspense fallback={Fallback ? <Fallback
/> : null}>
<Comp {...props} />
</Suspense>
)
} as typeof Comp
}
|
ʹÓÃ:
const List =
lazy(() => import('./List')) |
¢Û ±ÜÃâͬ²½²Ù×÷
Electron ¿ÉÒÔͨ¹ý NodeJS ½øÐÐ I/O ²Ù×÷£¬µ«ÊÇÎÒÃÇÒ»¶¨Òª¾¡Á¿±ÜÃâͬ²½ I/O¡£ÀýÈçͬ²½µÄÎļþ²Ù×÷¡¢Í¬²½µÄ½ø³Ì¼äͨÐÅ¡£ËüÃÇ»á×èÈûÒ³ÃæµÄäÖȾºÍʼþ½»»¥¡£
¢Ü ¼õÉÙÖ÷½ø³Ì¸ººÉ
Electron µÄÖ÷½ø³Ì·Ç³£ÖØÒª¡£ËüÊÇËùÓд°¿ÚµÄ¸¸½ø³Ì£¬Ëü¸ºÔðµ÷¶È¸÷ÖÖ×ÊÔ´¡£Èç¹ûÖ÷½ø³Ì±»×èÈû£¬½«Ó°ÏìÕû¸öÓ¦ÓÃÏìÓ¦ÐÔÄÜ¡£
Äã¿ÉÒÔ×öÒ»¸ö¼òµ¥µÄʵÑ飬ÔÚÖ÷½ø³ÌÉÏ´òÒ»¸ö¶Ïµã£¬Äã»á·¢ÏÖËùÓеÄÒ³Ãæ´°¿Ú¶¼»áʧȥÏìÓ¦£¬¾¡¹ÜËüÃÇÔÚ¸÷×Ô²»Í¬µÄ½ø³Ì¡£ÕâÊÇÒòΪËùÓÐÓû§½»»¥¶¼ÊÇÓÉÖ÷½ø³Ì·Ö·¢¸øäÖȾ½ø³ÌµÄ£¬Ö÷½ø³Ì×èÈûÁË£¬äÖȾ½ø³Ìµ±È»ÎÞ·¨½ÓÊÕÓû§Ê¼þÀ²¡£
ËùÒÔ²»ÒªÈÃÖ÷½ø³Ì¸ÉÔà»îÀۻÄÜÔÚäÖȾ½ø³Ì×öµÄ£¬¾ÍÔÚäÖȾ½ø³Ì×ö¡£Ç§Íò±ÜÃâÔÚÖ÷½ø³ÌÖÐÅܼÆËãÃܼ¯ÈÎÎñºÍͬ²½I/O¡£
¢Ý ·ÖÀëCPUÃܼ¯ÐͲÙ×÷µ½µ¥¶À½ø³Ì»òWorker, ±ÜÃâ×èÈûUI
¢Þ React ÓÅ»¯
¼û ¡¶React ÐÔÄÜÓÅ»¯µÄ·½Ïò¡·
¢ß ·ÅÆúCSS-in-js
ÎÒÃÇΪÁËѹËõÔËÐÐʱÐÔÄÜ£¬ÄÜÔÚ±àÒëʱ×öµÄ¾ÍÔÚ±àÒëʱ×ö£¬·ÅÆúÁË CSS-in-js ·½°¸£¬Ê¹Óô¿ CSS
+ BEM À´±àдÑùʽ¡£Ö÷ÒªÓÐÁ½¸öÔÒò:
Electron ʹÓýÏÐ嵀 Chrome£¬ÏÖ´ú CSS ÒѾºÜÇ¿´ó
ÎÒÃÇʹÓÃÁË´°¿ÚÔ¤ÈÈ»úÖÆ£¬¿ÉÒÔÂÊÏȽâÎöÕⲿ·Ö CSS ´úÂë¡£¶ø CSS-in-js ·½°¸ÔòÊÇ×é¼þäÖȾʱ£¬¶¯Ì¬Éú³ÉµÄ¡£¢à
ûÓÐÍË·ÁË£¬ÄǾÍÖ»ÄÜÉÏ Node ÔÉúÄ£¿éÁË
ÕæºÃ£¬»¹ÓÐÍË·
2.3 ÓÅ»¯½ø³ÌͨÐÅ
Éæ¼°µ½¶àÒ³Ãæ/´°¿ÚµÄ Electron Ó¦Óã¬IPC »á·Ç³£Æµ·±£¬¸ã²»ºÃ»á³ÉΪÐÔÄÜÆ¿¾±¡£
¢Ù ²»ÒªÀÄÓà remote
remote ÌṩÁËÒ»ÖÖ¼ò±ãµÄ¡¢ÎÞÇÖÈëµÄÐÎʽÀ´·ÃÎÊÖ÷½ø³ÌµÄAPIºÍÊý¾Ý¡£Æäµ×²ã»ùÓÚͬ²½µÄ IPC¡£Äã¿ÉÒÔͨ¹ýÎÒÕâÆªÎÄÕÂÀ´Á˽âËüµÄÔÀí¡£
¿ÓÔÚÄÄÀïÄØ£¿
¢Ù ËüÊÇͬ²½µÄ
¢Ú ÊôÐÔ¶¯Ì¬»ñÈ¡¡£ÎªÁËÈ·±£ÄãÄܹ»»ñÈ¡µ½×îеÄÖµ£¬remoteµ×²ã²¢²»»á½øÐлº´æ£¬¶øÊÇÿ´Î»ñȡһ¸öÊôÐԾͶ¯Ì¬µ½Ö÷½ø³ÌÖÐÈ¡¡£
±ÈÈç»ñȡһ¸öÖ÷½ø³ÌÖеĶÔÏó:
// Ö÷½ø³Ì
global.foo = {
foo: 1,
bar: {
baz: 2
}
} |
äÖȾ½ø³Ì·ÃÎÊ:
import {remote}
from 'electron'
JSON.stringify(remote.getGlobal('foo'))
|
ÕâÀï»á´¥·¢ 4 ´Î ͬ²½ IPC: getGlobal¡¢foo¡¢bar¡¢bar.baz¡£¶ÔÓÚ¸´ÔÓµÄÊý¾Ý£¬Õâ¸öÏûºÄ¾ÍºÜÄÑÈÌÊÜÁË¡£
±ÜÃâʹÓà remote£¬³ý·ÇÄãÖªµÀÄã×Ô¼ºÔÚ¸Éʲô¡£
¢Ú ·â×°IPC ¿â
ΪÁËÓÅ»¯ IPC ͨÐÅ£¬ÎÒÃÇ×Ô¼º»ùÓÚElectron µÄIPC½Ó¿Ú, ·â×°ÁË×Ô¼ºµÄÒ»Ì× RPC ¿â¡£Ö÷ÒªÌØÕ÷ÓÐ:
Òì²½µÄ¡£Ã»ÓÐͬ²½µÄÑ¡Ïî¡£±ÜÃâ¸É´ÀÊÂ
ÏûÏ¢ºÏ²¢¡£ºÏ²¢Ê¼þÍÆËÍ£¬ÅúÁ¿´«µÝ
ÐòÁл¯¡£Ö±½Ó´«µÝ JSON ×Ö·û´®£¬²»Èà Electron ¸ÉÉæÐòÁл¯¡£Electron ÄÚ²¿ÐòÁл¯ÉÔ΢Óе㸴ÔÓ£¬±ÈÈç»á´¦Àí
Buffer µÈÌØÊâÀàÐÍ¡£
Ò»Ö»¯µÄ¡¢¼òµ¥Ò×ÓÃµÄ API¡£Ê¹ÓÃÒ»ÑùÔÚ½Ó¿ÚÖ§³ÖÖ÷½ø³ÌÓëäÖȾ½ø³Ì£¬ÒÔ¼°äÖȾ½ø³ÌÓëäÖȾ½ø³ÌÖ®¼äË«ÏòͨÐÅ¡£
¾Ù¸öÀý×Ó:
import rpc from
'myrpc'
// ×¢²á·½·¨
rpc.registerHandler('echo', async data =>
{
return data
}) // ʼþ¼àÌý
rpc.on('some-event', (data, source) => {
// dosomething
})
|
¿Í»§¶Ë:
import rpc from
'myrpc'
rpc.emit(target, 'some-event') // target Ϊ½ÓÊյĴ°¿Ú»òÕßÖ÷½ø³Ì¡£ // ·½·¨µ÷ÓÃ
const res = await rpc.callHandler(target, 'echo',
'hello-world')
|
»¹²»¹»£¬ÎÒÃÇ»¹ÔÚÓÅ»¯£¬ºóÐøÔÙ·ÖÏí¸ø´ó¼Ò¡£¿Ó»¹ÊÇ»áÓеÄ
һ·×ßÀ´Ò²Óöµ½ºÜ¶à¿Ó¡£Í´²¢¿ìÀÖ×Å¡£
´°¿ÚÒõÓ°¡¢Ô²½Ç
¼ôÇа岻¹»Ç¿´ó
һЩ¼æÈÝÎÊÌâ
Ö÷½ø³Ì±ÀÀ££¬äÖȾ½ø³Ì²»»áÍ˳ö£¬µ¼Ö½ø³Ì¡®Òç³ö¡¯
½ØÆÁ¡£¸Õ¿ªÊ¼Óà Electron ʵÏÖ£¬Ð§¹û²»ºÃ£¬ÏÖÔÚÊÇÔÉúʵÏÖ
...
|