Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
·ÖÏíÕâ°ëÄêµÄ Electron Ó¦Óÿª·¢ºÍÓÅ»¯¾­Ñé
 
×÷Õߣº»Äɽ
  8425  次浏览      30
  2020-3-26
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª½éÉÜΪʲôѡÔñ 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 ʵÏÖ£¬Ð§¹û²»ºÃ£¬ÏÖÔÚÊÇÔ­ÉúʵÏÖ

...

 

 
   
8425 ´Îä¯ÀÀ       30
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì