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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
dz̸Nodejs¿ª·¢×ÀÃæÓ¦Óà Õë¶Ô Electron
 
×÷Õߣº³ÌÐòÈËÉú_СÁú
  5712  次浏览      28
  2020-3-31
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª°ïÖújs»ù´¡±È½Ï±¡Èõ£¬ÓÖûÓнӴ¥¹ýelectronµÄͬѧ¸üºÃµÄѧϰelectron£¬Ï£Íû¶ÔÄúÄÜÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚ²©¿ÍÔ°£¬,ÓÉ»ðÁú¹ûÈí¼þDelores±à¼­ÍƼö¡£

»ù±¾¼ÙÉè

¿ªÊ¼½Ì³Ì֮ǰ£¬ÇëÔÊÐíÎÒ¼ÙÉèÄãÒѾ­ÓÐÁËÒ»¸ö³£Óõĵı༭Æ÷£¨»òÕß IDE£©£¬ÏµÍ³ÖÐÒ²°²×°ÁËNode.js ºÍ npm£¬²¢Óлù´¡µÄ HTML/CSS/JavaScript £¨¶Ô Node.js µÄ CommonJS Ä£¿é¸ÅÄîÓÐËùÁ˽âÊÇ×îºÃ£¬µ«²»Ç¿Çó£© ÖªÊ¶¡£Èç¹ûÒÔÉÏ֪ʶÄã²¢²»Á˽⣬ΪÁË·ÀÖ¹ÕâÆªÎÄÕ¿´µ½ÄãÍ·»èÄÔÕÍ£¬ÍƼöÄãÏÈ¿´¿´Ö®Ç°ÎÒд¹ýµÄ²©ÎÄ£¬²¹³äһϻù´¡ÖªÊ¶¡£

Íòʾ㱸£¬ÏÖÔھͰѾ«Á¦¼¯ÖÐÔÚѧϰ Electron ÉÏ£¬²»ÒªÔÙµ£ÐĽçÃæµÄÊÂÇ飨½«»á¹¹½¨µÄ½çÃæ±¾ÖÊÉϾÍÊÇÆÕͨµÄ Web Ò³Ãæ¶øÒÑ£©¡£

Electron ¸ÅÀÀ

¼ò¶øÑÔÖ®£¬Electron ÌṩÁËÒ»¸öʵʱ¹¹½¨×ÀÃæÓ¦ÓõĴ¿ JavaScript »·¾³¡£Electron ¿ÉÒÔ»ñÈ¡µ½Ä㶨ÒåÔÚ package.json ÖÐ main ÎļþÄÚÈÝ£¬È»ºóÖ´ÐÐËü¡£Í¨¹ýÕâ¸öÎļþ£¨Í¨³£ÎÒÃdzÆÖ®Îª main.js£©£¬¿ÉÒÔ´´½¨Ò»¸öÓ¦Óô°¿Ú£¬Õâ¸öÓ¦Óô°¿Ú°üº¬Ò»¸öäÖȾºÃµÄ web ½çÃæ£¬»¹¿ÉÒÔºÍϵͳԭÉúµÄ GUI ½»»¥¡£

¾ßÌåÀ´Ëµ£¬¾ÍÊǵ±ÄãÆô¶¯ÁËÒ»¸ö Electron Ó¦Ó㬾ÍÓÐÒ»¸öÖ÷½ø³Ì£¨main process £©±»´´½¨ÁË¡£ÕâÌõ½ø³Ì½«¸ºÔð´´½¨³öÓ¦ÓÃµÄ GUI£¨Ò²¾ÍÊÇÓ¦ÓõĴ°¿Ú£©£¬²¢´¦ÀíÓû§ÓëÕâ¸ö GUI Ö®¼äµÄ½»»¥¡£

µ«Ö±½ÓÆô¶¯ main.js ÊÇÎÞ·¨ÏÔʾӦÓô°¿ÚµÄ£¬ÔÚ main.js ÖÐͨ¹ýµ÷ÓÃBrowserWindowÄ£¿é²ÅÄܽ«Ê¹ÓÃÓ¦Óô°¿Ú¡£È»ºóÿ¸öä¯ÀÀÆ÷´°¿Ú½«Ö´ÐÐËüÃǸ÷×ÔµÄäÖȾÆ÷½ø³Ì£¨ renderer process £©¡£äÖȾÆ÷½ø³Ì½«»á´¦ÀíÒ»¸öÕæÕýµÄ web Ò³Ãæ£¨HTML + CSS + JavaScript£©£¬½«Ò³ÃæäÖȾµ½´°¿ÚÖС£¼øÓÚ Electron ʹÓõÄÊÇ»ùÓÚChrominumµÄä¯ÀÀÆ÷Äںˣ¬Äã¾Í²»Ì«ÐèÒª¿¼ÂǼæÈݵÄÎÊÌâ¡£

¾Ù¸öÀý×Ó£¬Èç¹ûÄãÖ»Ïë×öÒ»¸ö¼ÆËãÆ÷£¬ÄÇÄãµÄ main process Ö»»á×öÒ»¼þÊÂÇ飺ʵÀý»¯Ò»¸ö´°¿Ú£¬²¢ÄÚÖÃÁËÒ»¸ö¼ÆËãÆ÷µÄ½çÃæ£¨Õâ¸ö½çÃæÊÇÄãÓà HTML¡¢CSS ºÍ JavaScript дµÄ£©¡£

ËäÈ»ÀíÂÛÉÏÖ»ÓÐ main process ²ÅÄܺÍÔ­Éú GUI ²úÉú½»»¥£¬µ«ÆäʵÎÒÃÇ¿ÉÒÔͨ¹ýһЩÊÖ¶ÎÈà renderer process ÓëÔ­Éú GUI ½»»¥£¨ÔÚºóÎÄÖÐÄ㽫ѧϰµ½ÈçºÎʵÏÖ£©¡£

main process ¿ÉÒÔͨ¹ý Electron ÖеÄһЩģ¿éÖ±½ÓºÍÔ­Éú GUI ½»»¥¡£ÄãµÄ×ÀÃæÓ¦ÓÿÉÒÔʹÓÃÈÎÒâµÄ Node Ä£¿é£¬±ÈÈçÓÃnode-notifierÏÔʾϵͳ֪ͨ£¬ÓÃrequest·¢³ö HTTP ÇëÇó¡­¡­

Hello, world!

×öºÃǰÆÚ×¼±¸£¬ÏÖÔÚÈÃÎÒÃÇ´Ó Hello World ¿ªÊ¼°É£¡

ʹÓÃµÄ repo

ÕâÆª½Ì³ÌÊÇ»ùÓÚÒ»¸öÉùЧÆ÷½Ì³ÌµÄgithub ²Ö¿â£¬ÇëʹÓÃÏÂÃæµÄÃüÁËü¿Ë¡µ½±¾µØ£º

git clone https://github.com/bojzi/sound-machine-electron-guide.git

È»ºó²é¿´Ò»Ï£¬Äã¿ÉÒÔ¿´¿´Õâ¸ö²Ö¿âÖÐÓÐÄÄЩ tag£º

git checkout

ÎÒÃǽ«¸úËæÕâЩ tag ½«ÉùЧÆ÷Ò»²½²½¹¹½¨³öÀ´£º

git checkout 00-blank-repository

À­È¡£¨checkout£©Ä¿±ê tag Ö®ºó£¬Ö´ÐУº

npm install

Õâô×öÄܱ£Ö¤ÏîÄ¿ËùÒÀÀµµÄ Node Ä£¿é¶¼»á±»À­È¡¡£

Èç¹ûÄãÎÞ·¨Çл»µ½Ä³Ò»¸ö tag£¬×î¼òµ¥µÄ½â¾ö·½Ê½¾ÍÊÇÖØÖòֿ⣬ȻºóÔÙ checkout£º

git add -A

git reset --hard

¿ª¹¤

Ï顄 tag Ϊ ¡®00-blank-repository¡¯ À­È¡ÏÂÀ­£º

git checkout 00-blank-repository

ÔÚÏîÄ¿Îļþ¼ÐÖд´½¨Ò»¸ö package.json Îļþ£¬²¢ÔÚÎļþÖмÓÈëÒÔÏÂÄÚÈÝ£º

{
"name": "sound_machine",
"version": "0.1.0",
"main": "./main.js",
"scripts": {
"start": "electron ."
}
}

Õâ¸ö package.json µÄ×÷ÓÃÊÇ£º

È·¶¨Ó¦ÓõÄÃû×ֺͰ汾ºÅ

¸æËß Electron main.js ÊÇ main process µÄÈë¿Ú

¶¨ÒåÆô¶¯¿ÚÁî - ÔÚ CLI £¨ÖÕ¶Ë»òÕßÃüÁîÐУ©ÖÐÖ´ÐÐ npm start ¼´¿ÉÍê³ÉÒÀÀµ°²×°¡£

ÏÖÔÚ¿ì°Ñ Electron °²×°Éϰɡ£×î¼òµ¥µÄ°²×°·½Ê½Ó¦¸ÃÊÇͨ¹ý npm °²×°Ô¤¹¹½¨ºÃµÄ¶þ½øÖÆÎļþ£¬È»ºó°ÑËü×÷Ϊ¿ª·¢ÒÀÀµ£¨development dependency£©Ð´Èë package.json ÖУ¨°²×°Ê±´øÉÏ --save-dev ²ÎÊý¼´¿É×Ô¶¯Ð´ÈëÒÀÀµ£©¡£ÔÚ CLI ÖнøÈëÏîĿĿ¼£¬Ö´ÐÐÏÂÃæµÄÃüÁ

npm install --save-dev electron-prebuilt

Ô¤¹¹½¨µÄ¶þ½øÖÆÎļþ»á¸ù¾Ý²Ù×÷ϵͳ²»Í¬¶ø²»Í¬µÄ£¬Í¨¹ýÖ´ÐÐ npm start °²×°¡£ÎÒÃÇÒÔ¿ª·¢ÒÀÀµµÄ·½Ê½Ê¹ÓÃËü£¬ÊÇÒòΪÔÚÏîÄ¿¹¹½¨ÖÐÖ»ÓÐÔÚ¿ª·¢½×¶Î²Å»áʹÓõ½ Electron¡£

ÒÔÉÏ£¬¾ÍÊDZ¾´Î Electron ½Ì³ÌËùÐèÒªµÄÈ«²¿¶«Î÷ÁË¡£

¶ÔÊÀ½ç˵ Hi

´´½¨Ò»¸ö app Îļþ¼Ð£¬ÔÚÎļþ¼ÐÖÐн¨ index.html Îļþ£¬²¢Ð´ÈëÒÔÏÂÄÚÈÝ£º

Hello, world!

ÔÚÏîÄ¿µÄ¸ùĿ¼´´½¨ main.js Îļþ¡£Electron Ö÷Ï̵߳ÄÈë¿ÚÊÇÕâ¸ö JS Îļþ£¬È»ºó ¡°Hello world!¡± Ò³ÃæÒ²Í¨¹ýËüÏÔʾ³öÀ´£º

'use strict';varapp=require('app');
varBrowserWindow=require('browser-window');
varmainWindow=null;app.on('ready',function()
{mainWindow=newBrowserWindow
({height:600,width:800});
mainWindow.loadUrl('file://'+
__dirname+'/app/index.html');});

¿´ÆðÀ´²¢²»ÄѰɣ¿

app Ä£¿é¿ØÖÆ×ÅÓ¦ÓõÄÉúÃüÖÜÆÚ£¨±ÈÈ磬µ±Ó¦ÓýøÈë×¼±¸×´Ì¬£¨ready status£©µÄʱºòÒª²ÉȡʲôÐж¯£©¡£

BrowserWindow Ä£¿é¿ØÖÆ´°¿ÚµÄ´´½¨¡£

mainWindow ¶ÔÏó¾ÍÊÇÄãµÄÓ¦Óô°¿ÚµÄÖ÷½çÃæ£¬µ± JavaScript À¬»ø»ØÊÕ»úÖÆ±»´¥·¢Ê±´°¿Ú¾Í»á±»¹Ø±Õ£¬´Ëʱ¸Ã¶ÔÏóµÄÖµÊÇnull¡£

µ± app »ñÈ¡µ½ ready ʼþºó£¬ÎÒÃÇͨ¹ý BrowserWindow ´´½¨Ò»¸ö 800x600 ´°¿Ú¡£

Õâ¸ö window µÄäÖȾÆ÷Ï߳̽«»áäÖȾ index.html Îļþ¡£

Ö´ÐÐÏÂÃæÕâÐдúÂ룬¿´¿´ÎÒÃǵÄÓ¦ÓÃÊÇʲôÑùµÄ£º

npm start

ÏÖÔÚãåÔ¡ÔÚÕâ¸ö app µÄÊ¥¹âÖаɡ£

¿ª·¢Ò»¸öÕæÕýµÄÓ¦ÓÃ

»ªÀöÀöµÄÉùЧÆ÷

¿ªÊ¼Ö®Ç°£¬ÎÒÒªÎʸöÎÊÌ⣺ʲôÊÇÉùЧÆ÷£¿

ÉùЧÆ÷ÊÇÒ»¸öСÉ豸£¬µ±Ä㰴ϲ»Í¬°´¼üµÄʱºò£¬Ëü»á·¢³ö²»Í¬ÉùÒô£¬±ÈÈ翨ͨÒô»òÕßЧ¹ûÒô¡£Ôڰ칫ÊÒÀïÌýµ½ÕâÑùÓÐȤµÄÉùÒô£¬ºÃÏñÕû¸öÈ˶¼Ã÷ÁÁÆðÀ´ÁËÄØ¡£ÓÃÕâ¸öÀý×Ó×÷Ϊ̽Ë÷ÈçºÎʹÓà Electron ÊǸöºÜ°ôµÄÖ÷Òâ¡£

¾ßÌåÀ´Ëµ£¬ÎÒÃǽ«»áʵÏÖÒÔϹ¦ÄÜ£¬²¢Éæ¼°µ½ÒÔÏÂ֪ʶ£º

ÉùЧÆ÷µÄ»ù´¡£¨ÊµÀý»¯ä¯ÀÀÆ÷´°¿Ú£©

¹Ø±ÕÉùЧÆ÷£¨Ö÷½ø³ÌºÍäÖȾÆ÷½ø³ÌÖ®¼äµÄͨÐÅ£©

ËæÊ±²¥·ÅÉùÒô£¨È«¾Ö¿ì½Ý¼ü£©

´´½¨Ò»¸ö¿ì½ÝÐÞÊμü£¨ÐÞÊμü£¬modifier keys£¬ Ö¸µÄÊÇ Shift¡¢Ctrl ºÍ Alt ¼ü£©ÉèÖÃÒ³Ãæ£¨²¢½«Óû§ÉèÖñ£´æÔÚÖ÷Ŀ¼Ï£©

Ìí¼ÓÒ»¸öÍÐÅÌͼ±ê£¨´´½¨Ô­Éú GUI ÔªËØ¡¢Á˽â²Ëµ¥ºÍÍÐÅÌͼ±êµÄʹÓã©

½«Ó¦Óôò°üµ½ Mac¡¢Windows ºÍ Linux ƽ̨¡£

ʵÏÖÉùЧÆ÷µÄ»ù±¾¹¦ÄÜ

¿ªÊ¼¹¹½¨ÒÔ¼°Ó¦ÓõĽṹ

ÔÚ¿ª·¢¹ý ¡°Hello World¡± Ó¦ÓÃÖ®ºó£¬ÏÖÔÚ¿ÉÒÔ×ÅÊÖÖÆ×öÎÒÃǵÄÉùЧÆ÷ÁË¡£

Ò»¸öµäÐ͵ÄÉùЧÆ÷»áÓкܶàµÄ°´Å¥£¬ÄãÐèÒª°´ÏÂÄÇЩ°´Å¥²ÅÄÜÈûúÆ÷·¢Éù£¬Í¨³£»áÊÇÄâÉù´Ê£¨±ÈÈçЦÉù¡¢ÕÆÉù¡¢´òËé²£Á§µÄÉùÒôµÈµÈ£©¡£

ÏìÓ¦µã»÷ ¨C ÕâÊÇÎÒÃÇÒª×öµÄµÚÒ»¼þÊÂÇé¡£

ÎÒÃǵÄÓ¦Óýṹ·Ç³£¼òµ¥Ö±°×¡£

ÔÚÓ¦ÓõĸùĿ¼ÖУ¬ÒªÓÐÒ»¸ö package.json¡¢main.js ºÍÆäËûÈ«¾ÖËùÐèµÄÓ¦ÓÃÎļþ¡£

app/ Ŀ¼ÖÐÒª°üº¬ HTML Îļþ¡¢CSS Ŀ¼¡¢JS Ŀ¼¡¢wav Ŀ¼»¹ÓÐͼƬĿ¼¡£

³öÓÚ¼ò»¯Õâ¸ö½Ì³ÌµÄÄ¿µÄ£¬ËùÓкÍÍøÒ³Éè¼ÆÏà¹ØµÄÎļþ¶¼ÒѾ­ÔÚÒ»¿ªÊ¼¾Í·ÅÔÚ²Ö¿âÖÐÁË¡£ÇëÔÚÃüÁîÐÐÖÐÊäÈëgit checkout 01-start-project »ñÈ¡¡£ÏÖÔÚ£¬ÇëÄã¿ÉÒÔÊäÈëÒÔÏÂÃüÁî£¬ÖØÖÃÄãµÄ²Ö¿â²¢À­È¡Ð嵀 tag£º

If you followed along with the
"Hello, world!" example:
git add -A
git reset --hard
Follow along with the tag
01-start-project:
git checkout 01-start-project

ÔÚ±¾½Ì³ÌÖУ¬ÎÒÃÇֻʹÓÃÁ½ÖÖÉùЧ£¬ºóÃæÔÙÕÒһЩ±ðµÄÒôЧºÍͼ±ê£¬ÐÞ¸Ä* index.js *¾Í½«ËüÃÇÀ©Õ¹³ÉÓÐ16ÖÖÒôЧµÄÉùЧÆ÷¡£

main process µÄÆäËûÄÚÈÝ

Ê×ÏÈÕÒµ½ main.js Öж¨ÒåÉùЧÆ÷ÍâÐεIJ¿·Ö£¬ÓÃÏÂÃæÕâ¶ÎÌæ»»µô£º

'use strict';varapp=require('app');
varBrowserWindow=require('browser-window');
varmainWindow=null;app.on
('ready',function()
{mainWindow=newBrowserWindow
({frame:false,height:700,resizable:false,width:368});
mainWindow.loadUrl
('file://'+__dirname+'/app/index.html');});

µ±´°¿Ú±»¶¨ÒåÁË´óС£¬ÎÒÃÇÒ²¾ÍÊÇÔÚ×Ô¶¨ÒåÕâ¸ö´°¿Ú£¬Ê¹µÃËü²»¿ÉÀ­ÉìûÓпò¼Ü£¬ÈÃËü¿´ÆðÀ´¾ÍÏñÒ»¸öÕæÕýµÄÉùЧÆ÷¸¡ÔÚ×ÀÃæÉÏ¡£

ÏÖÔÚÎÊÌâÀ´ÁË ¨C ÒªÈçºÎÒÆ¶¯»òÕ߹رÕÒ»¸öûÓбêÌâÀ¸µÄ´°¿Ú¡£

ºÜ¿ìÎҾͻá˵µ½×Ô¶¨Òå´°¿Ú£¨ºÍÓ¦Ó㩵Ĺرն¯×÷£¬»¹»á̸µ½ÈçºÎÔÚÖ÷½ø³ÌºÍäÖȾÆ÷½ø³ÌÖÐͨÐÅ¡£²»¹ýÏÖÔÚÈÃÎÒÃÇÏȰÑÄ¿¹â¾Û½¹µ½¡°ÍÏקЧ¹û¡±ÉÏ¡£Äã¿ÉÒÔÔÚ app/css Ŀ¼ÏÂÕÒµ½ index.css Îļþ£º

html,body{...-webkit-app-region:drag;...}

-webkit-app-region: drag;°ÑÕû¸ö html ¶¼±ä³ÉÁËÒ»¸ö¿ÉÍÏ×§µÄ¶ÔÏó¡£ÏÖÔÚÎÊÌâÀ´ÁË£¬ÔÚ¿ÉÍÏ×§µÄ¶ÔÏóÉÏÄãÔõôµã»÷°¡£¿£¡ºÃµÄ£¬¿ÉÄÜÄã»áÏëµ½°Ñ html ÖÐij¸ö²¿·ÖµÄÕâ¸öÊôÐÔÖµÉèÖÃΪno-drag;£¬ÄǾÍÔÊÐí¸ÃÔªËØ²»¿ÉÍÏ×§£¨µ«¿ÉÒÔµã»÷ÁË£©¡£ÈÃÎÒÃÇÏëÏëÏÂÃæÕâ¶Î index.css Ƭ¶Î£º

.button-sound {
...
-webkit-app-region: no-drag;
}

չʾÉùЧÆ÷

ÏÖÔÚͨ¹ý main.js Îļþ¿ÉÒÔ´´½¨Ò»¸öд°¿Ú£¬²¢ÔÚ´°¿ÚÖÐÏÔʾ³öÉùЧÆ÷µÄ½çÃæ¡£Èç¹ûͨ¹ýnpm startÆô¶¯Ó¦Óã¬Ä㽫»á¿´µ½Ò»¸öÓж¯Ì¬Ð§¹ûµÄÉùЧÆ÷¡£ÒòΪÎÒÃǾÍÊÇ´ÓÒ»¸ö¾²Ì¬Ò³Ã濪ʼ£¬ËùÒÔÏÖÔÚÄã¿´µ½µÄÒ²ÊDz»»á¶¯µÄÒ³Ãæ£º

½«ÏÂÃæÕâ¶Î´úÂë±£´æµ½ index.js ÎļþÖУ¨Î»ÖÃÔÚ app/js Ŀ¼Ï£©£¬ÔËÐкóÓ¦Óúó£¬Äã»á·¢ÏÖ¿ÉÒÔÓëÉùЧÆ÷½»»¥ÁË£º

'use strict';varsoundButtons=
document.querySelectorAll
('.button-sound');for(vari=0;i

ͨ¹ýÉÏÃæÕâ¶Î´úÂ룬ÎÒÃÇ£º

»ñÈ¡ÉùÒô°´Å¥

µü´ú·ÃÎʰ´Å¥µÄdata-soundÊôÐÔÖµ

¸øÃ¿¸ö°´Å¥¼ÓÉϱ³¾°Í¼

ͨ¹ýHTMLAudioElement ½Ó¿Ú¸øÃ¿¸ö°´Å¥¶¼Ìí¼ÓÒ»¸öµã»÷ʼþ£¬Ê¹Ö®¿ÉÒÔ²¥·ÅÒôƵ

ͨ¹ýÏÂÃæÕâÐÐÃüÁîÔËÐÐÄãµÄÓ¦ÓðÉ

npm start

ͨ¹ýÔ¶³Ìʼþ´Óä¯ÀÀ´°¿ÚÖйرÕÓ¦ÓÃ

½Ó×ÅÀ­È¡02-basic-sound-machineµÄÄÚÈÝ£º

git checkout 02-basic-sound-machine

¼òµ¥À´Ëµ - Ó¦Óô°¿Ú£¨äÖȾÆ÷½ø³Ì£©²»Ó¦¸ÃºÍ GUI ·¢Éú½»»¥£¨Ò²¾ÍÊDz»Ó¦¸ÃºÍ¡°¹Ø±Õ´°¿Ú¡±ÓйØÁª£©£¬Electron µÄ¹Ù·½½Ì³ÌÉÏ˵ÁË£º

¿¼Âǵ½ÔÚÍøÒ³ÖÐÖ±½Óµ÷ÓÃÔ­ÉúµÄ GUI ÈÝÒ×Ôì³É×ÊÔ´Òç³ö£¬ÕâºÜΣÏÕ£¬¿ª·¢Õß²»ÄÜÕâôʹÓá£Èç¹û¿ª·¢ÕßÏëÒªÔÚÍøÒ³ÉÏÖ´ÐÐ GUI ²Ù×÷£¬±ØÐëҪͨ¹ýäÖȾÆ÷½ø³ÌºÍÖ÷½ø³ÌµÄͨÐÅʵÏÖ¡£

Electron ΪÖ÷½ø³ÌºÍäÖȾÆ÷½ø³ÌÌṩÁË ipc £¨¿ç½ø³ÌͨÐÅ£©Ä£¿é£¬ipc Ä£¿éÔÊÐí½ÓÊպͷ¢ËÍͨÐÅÆµµÀµÄÐÅÏ¢¡£ÆµµÀÓÉ×Ö·û´®±íʾ£¨±ÈÈç¡°channel-1¡±£¬¡°channel-2¡±ÕâÑù£©£¬¿ÉÒÔÓÃÓÚÇø·Ö²»Í¬µÄÐÅÏ¢½ÓÊÕÕß¡£´«µÝµÄÐÅÏ¢ÖÐÒ²¿ÉÒÔ°üº¬Êý¾Ý¡£¸ù¾Ý½ÓÊÕµ½µÄÐÅÏ¢£¬¶©ÔÄÕß¿ÉÒÔ×ö³öÏìÓ¦¡£ÐÅÏ¢´«µÝµÄ×î´óºÃ´¦¾ÍÊÇ×öµ½·ÖÀëÈÎÎñ ¨C Ö÷½ø³Ì²»ÐèÒªÖªµÀÊÇÄÄЩäÖȾÆ÷½ø³Ì·¢ËÍÁËÐÅÏ¢¡£

ÕâÕýÊÇÎÒÃÇÏëÒª×öµÄ ¨C ½«Ö÷½ø³Ì£¨main.js£©¶©Ôĵ½¡°¹Ø±ÕÖ÷´°¿Ú¡±ÆµµÀÖУ¬µ±Óû§µã»÷¹Ø±Õ°´Å¥Ê±£¬´ÓäÖȾÆ÷½ø³Ì£¨index.js£©Ïò¸ÃƵµÀ·¢ËÍÐÅÏ¢¡£

Add the following to main.js to subscribe to a channel:

½«ÏÂÃæµÄ´úÂëʵÏÖÁËÆµµÀ¶©ÔÄ£¬½«ËüÌí¼Óµ½ main.js ÖУº

varipc=require('ipc');
ipc.on('close-main-window',
function(){app.quit();});

°Ñ ipc Ä£¿é°üº¬½øÀ´Ö®ºó£¬´ÓƵµÀÖж©ÔÄÐÅÏ¢¾Í·Ç³£¼òµ¥ÁË£º¹ý on() ·½·¨ºÍƵµÀÃû³Æ£¬ÔÙ¼ÓÉÏÒ»¸ö»Øµ÷º¯Êý¾ÍÐÐÁË¡£

ÒªÏò¸ÃƵµÀ·¢ËÍÐÅÏ¢£¬¾ÍÒª°ÑÏÂÃæµÄ´úÂë¼ÓÈë index.js ÖÐ:

varipc=require('ipc');
varcloseEl=document.querySelector('.close');
closeEl.addEventListener
('click',function(){ipc.send
('close-main-window');});

ÎÒÃÇÒÀÈ»ÐèÒª°Ñ ipc Ä£¿éÒýÈëµ½ÎļþÖУ¬¸ø¹Ø±Õ°´Å¥°ó¶¨µã»÷ʼþ¡£µ±µã»÷Á˹رհ´Å¥Ê±£¬Í¨¹ý send() ·½·¨·¢ËÍÒ»ÌõÐÅÏ¢µ½¡°¹Ø±ÕÖ÷´°¿Ú¡±ÆµµÀ¡£

²»ÒªÍü¼ÇÔÚÔÚ index.css Öн«¹Ø±Õ°´Å¥ÉèÖÃΪ²»¿ÉÍÏ×§£º

.settings{...-webkit-app-region:no-drag;}

¾ÍÕâÑù£¬ÎÒÃǵÄÓ¦ÓÃÏÖÔÚ¿ÉÒÔͨ¹ý°´Å¥¹ØµôÁË¡£ipc µÄͨÐÅ¿ÉÒÔͨ¹ýʼþºÍ²ÎÊýµÄ´«µÝ±äµÃºÜ¸´ÔÓ£¬ÔÚºóÎÄÖлáÓд«µÝ²ÎÊýµÄÀý×Ó¡£

ͨ¹ýÈ«¾Ö¿ì½Ý¼ü²¥·ÅÉùÒô

À­È¡03-closable-sound-machine£º

git checkout 03-closable-sound-machine

ÉùЧÆ÷µÄµØ»ùÒѾ­´òµÄ²»´í¡£µ«ÊÇÎÒÃÇ»¹ÃæÁÙ×ÅʹÓÃÐÔµÄÎÊÌâ ¨C Õâ¸öÓ¦ÓÃҪʼÖÕ±£³ÖÔÚ×ÀÃæ×îǰ·½£¬ÇÒ¿ÉÒÔ±»Öظ´µã»÷¡£

Õâ¾ÍÊÇÈ«¾Ö¿ì½Ý¼üÒª½éÈëµÄµØ·½¡£Electron ÌṩÁËÈ«¾Ö¿ì½ÝÄ£¿é£¨global shortcut module£©ÔÊÐí¿ª·¢Õß²¶»ñ×éºÏ¼ü²¢×ö³öÏàÓ¦µÄ·´Ó¦¡£ÔÚ Eelctron ÖÐ×éºÏ¼ü±»³ÆÎª¼ÓËÙÆ÷£¬ËüÒÔ×Ö·û´®µÄÐÎʽ±»¼Ç¼Ï£¨±ÈÈç ¡°Ctrl+Shift+1¡±£©¡£

ÒòΪÎÒÃÇÏëÒª²¶»ñµ½Ô­ÉúµÄ GUI ʼþ£¨È«¾Ö¿ì½Ý¼ü£©£¬²¢Ö´ÐÐÓ¦Óô°¿Úʼþ£¨²¥·ÅÉùÒô£©£¬ÎÒÃǽ«Ê¹Óà ipc Ä£¿é´ÓÖ÷½ø³Ì·¢ËÍÐÅÏ¢µ½äÖȾÆ÷½ø³Ì¡£

ÔÚ¿´´úÂë֮ǰ£¬»¹ÓÐÁ½¼þÊÂÇéÒªÎÒÃÇ¿¼ÂÇ£º

È«¾Ö¿ì½Ý¼ü»áÔÚ app µÄ ready ʼþ±»´¥·¢ºó×¢²á£¨Ïà¹Ø´úÂëÆ¬¶ÎÒª±»°üº¬ÔÚ ¡®ready¡¯ ÖУ©

ͨ¹ý ipc Ä£¿é´ÓÖ÷½ø³ÌÏòäÖȾÆ÷½ø³Ì·¢ËÍÐÅÏ¢£¬Äã±ØÐëʹÓô°¿Ú¶ÔÏóµÄÒýÓã¨ÀàËÆÓÚcreatedWindow.webContents.send(¡®channel¡¯)£©¡£

¼ÇסÉÏÃæµÄÁ½µãÁËÂð£¿ÏÖÔÚÈÃÎÒÃÇÀ´¸Äд* main.js *°É£º

var globalShortcut = require
('global-shortcut');
app.on('ready', function() {
... // ֮ǰд¹ýµÄ´úÂë
globalShortcut.register
('ctrl+shift+1', function () {
mainWindow.webContents.send
('global-shortcut', 0);
});
globalShortcut.register
('ctrl+shift+2', function () {
mainWindow.webContents.send
('global-shortcut', 1);
});
});

Ê×ÏÈ£¬ÒªÏÈÒýÈë global-shortcut Ä£¿é£¬µ±Ó¦ÓýøÈëready״̬֮ʱ£¬ÎÒÃǽ«»á×¢²áÁ½¸ö¿ì½Ý¼ü ¨C ¡®Ctrl+Shift+1¡¯ ºÍ ¡®Ctrl+Shift+2¡¯¡£ÕâÁ½¸ö¿ì½Ý¼ü¿ÉÒÔͨ¹ý²»Í¬µÄ²ÎÊýÏò¡°È«¾Ö¿ì½Ý¼ü¡±ÆµµÀ£¨ ¡°global-shortcut¡±channel£©·¢ËÍÐÅÏ¢¡£Í¨¹ý²ÎÊýÆ¥Åäµ½µ½µ×Òª²¥·ÅÄÄÖÖÉùÒô£¬½«ÏÂÃæµÄ´úÂë¼ÓÈë index.js ÖУº

ipc.on('global-shortcut',
function (arg) {
var event = new MouseEvent('click');
soundButtons[arg].dispatchEvent
(event);
});

ΪÁ˱£Ö¤Õû¸ö¼Ü¹¹×ã¹»¼òµ¥£¬ÎÒÃǽ«»áÓà soundButtons Ñ¡ÔñÆ÷Ä£Äâ°´Å¥µÄµã»÷²¥·ÅÉùÒô¡£µ±·¢Ë͵ÄÐÅÏ¢ÊÇ¡°1¡±Ê±£¬ÎÒÃǽ«»á»ñÈ¡ soundButtons[1] ÔªËØ£¬´¥·¢Êó±êµã»÷ʼþ£¨×¢Ò⣺ÔÚÉú²ú»·¾³ÖеÄÓ¦Óã¬ÄãÐèÒª·â×°ºÃ²¥·ÅÉùÒôµÄ´úÂ룬ȻºóÖ´ÐÐËü£©¡£

ÔÚд°¿ÚÖÐͨ¹ýÓû§ÉèÖÃÅäÖà modifier keys

ÏÂÃæÇëÀ­È¡04-global-shortcuts-bound£º

git checkout 04-global-shortcuts-bound

ͨ³£ÎÒÃÇ»áͬʱÔËÐкöà¸öÓ¦Óã¬ÉùЧÆ÷ÖÐÉèÖõĿì½Ý¼üºÜ¿ÉÄÜÒѾ­±»Õ¼ÓÃÁË¡£ËùÒÔÏÖÔÚÒªÒýÈëÒ»¸öÉèÖýçÃæ£¬ÔÊÐíÓû§¸ü¸ÄÐÞÊμü£¨modifier keys£©µÄÔ­Òò£¨Ctrl¡¢Alt ºÍ Shift£©¡£

ÒªÍê³ÉÕâÒ»¸ö¹¦ÄÜ£¬ÎÒÃÇÐèÒª×öÏÂÃæÕâЩÊÂÇ飺

ÔÚÖ÷½çÃæÉÏÌí¼ÓÉèÖð´Å¥

ʵÏÖÒ»¸öÉèÖô°¿Ú£¨ÉèÖÃÒ³ÃæÉÏÓжÔÓ¦µÄHTML¡¢CSS ºÍ JS£©

¿ªÆôºÍ¹Ø±ÕÉèÖô°¿Ú£¬ÒÔ¼°¸üÐÂÈ«¾Ö¿ì½Ý¼üµÄ ipc ÐÅÏ¢

´ÓÓû§µÄϵͳÖжÁд´æ´¢ÉèÖÃÐÅÏ¢µÄ JSON Îļþ¡£

piu~ ÒÔÉϾÍÊÇÎÒÃÇÒª×öµÄ¡£

ÉèÖð´Å¥ºÍÉèÖô°¿Ú

ºÍ¹Ø±ÕÖ÷´°¿ÚÀàËÆ£¬ÎÒÃǽ«»á°Ñʼþ°ó¶¨µ½ÉèÖð´Å¥ÉÏ£¬£¨settings button£©£¬ÔÚ* index.js *ÖмÓÈë·¢Ë͸øÆµµÀµÄÐÅÏ¢£º

var settingsEl = document.
querySelector('.settings');
settingsEl.addEventListener
('click', function () {
ipc.send('open-settings-window');
});

µ±µã»÷ÁËÉèÖð´Å¥£¬½«»áÓÐÒ»ÌõÐÅÏ¢Ïò¡°´ò¿ªÉèÖô°¿Ú¡±Õâ¸öƵµÀ·¢ËÍ¡£* main.js ¿ÉÒÔÏìÓ¦Õâ¸öʼþ£¬²¢´ò¿ªÒ»¸öд°¿Ú£¬½«ÒÔÏ´úÂë¼ÓÈë main.js *ÖУº

var settingsWindow = null;
ipc.on('open-settings-window',
function () {
if (settingsWindow) {
return;
}
settingsWindow = new BrowserWindow({
frame: false,
height: 200,
resizable: false,
width: 200
});
settingsWindow.loadUrl
('file://' + __dirname
+ '/app/settings.html');
settingsWindow.on
('closed', function () {
settingsWindow = null;
});
});

ÕâÒ»²½ºÍ֮ǰµÄÀàËÆ£¬ÎÒÃǽ«»á´ò¿ªÒ»¸öеĴ°¿Ú¡£Î¨Ò»µÄ²»Í¬µã¾ÍÊÇ£¬ÎªÁË·ÀֹʵÀý»¯Á½¸öÒ»ÑùµÄ¶ÔÏó£¬ÎÒÃǽ«»á¼ì²éÉèÖô°¿ÚÊÇ·ñÒѾ­±»´ò¿ªÁË¡£

µ±ÉÏÊö´úÂë³É¹¦Ö´ÐÐÖ®ºó£¬ÎÒÃÇÐèÒªÔÙÌí¼ÓÒ»¸ö¹Ø±ÕÉèÖô°¿ÚµÄ¶¯×÷¡£ÀàËÆµÄ£¬ÎÒÃÇÐèÒªÏòƵµÀÖз¢ËÍÒ»ÌõÐÅÏ¢£¬µ«Õâ´ÎÊÇ´Ó* settings.js Öз¢ËÍ£¨¹Ø±Õ°´Å¥µÄʼþÊÇÔÚ settings.js ÖУ©¡£Ð½¨ settings.js *Îļþ£¬²¢Ìí¼ÓÒÔÏ´úÂ루Èç¹ûÒѾ­ÓиÃÎļþ£¬¾ÍÖ±½ÓÔÚÔ­ÎļþÖÐÌí¼Ó£©£º

'use strict';
var ipc = require('ipc');
var closeEl = document.
querySelector('.close');
closeEl.addEventListener
('click', function (e) {
ipc.send('close-settings-window');
});

ÔÚ main.js ÖмàÌý¸ÃƵµÀ£º

ipc.on('close-settings-window',
function () {
if (settingsWindow) {
settingsWindow.close();
}
});

ÏÖÔÚ£¬ÉèÖô°¿ÚÒѾ­¿ÉÒÔʵÏÖÎÒÃǵÄÂß¼­ÁË¡£

Óû§ÉèÖõĶÁд

Ö´ÐÐ05-settings-window-working£º

git checkout 05-settings-window-working

ÉèÖô°¿ÚµÄ½»»¥¹ý³ÌÊÇ£¬´æ´¢ÉèÖÃÐÅÏ¢ÒÔ¼°Ë¢ÐÂÓ¦Óãº

´´½¨Ò»¸ö JSON ÎļþÓÃÓÚ¶ÁдÓû§ÉèÖÃ

ÓÃÕâ¸öÉèÖóõʼ»¯ÉèÖô°¿Ú

ͨ¹ýÓû§µÄ²Ù×÷¸üÐÂÕâ¸öÉèÖÃÎĵµ

֪ͨÖ÷½ø³ÌÒª¸üÐÂÉèÖÃÒ³Ãæ¡£

ÎÒÃÇ¿ÉÒÔ°ÑʵÏÖ¶ÁдÉèÖõIJ¿·ÖÖ±½Óд½ø main.js ÖУ¬µ«ÊÇÈç¹û°ÑÕⲿ·Ö¶ÀÁ¢³ÉÄ£¿é£¬¿ÉÒÔËæ´¦ÒýÓÃÕâÑù²»ÊǸüºÃÂð£¿

ʹÓà JSON ×öÅäÖÃÎļþ

ÏÖÔÚÎÒÃÇÒª´´½¨Ò»¸ö configuration.js Îļþ£¬ÔÙ½«Õâ¸öÎļþÒýÈëµ½ÏîÄ¿ÖС£Node.js ʹÓÃÁËCommonJS×÷Ϊ±àдģ¿éµÄ¹æ·¶£¬Ò²¾ÍÊÇ˵ÄãÐèÒª½«ÄãµÄ API ºÍÕâ¸ö API ÖпÉÓõĺ¯Êý¶¼Òª±©Â¶³öÀ´¡£

ΪÁ˸ü¼òµ¥µØ¶ÁдÎļþ£¬ÎÒÃǽ«»áʹÓà nconf Ä£¿é£¬Õâ¸öÄ£¿é·â×°ÁË JSON ÎļþµÄ¶Áд¡£µ«Ê×ÏÈ£¬ÎÒÃÇÐèÒª½«Õâ¸öÄ£¿é°üº¬µ½ÏîÄ¿ÖÐÀ´£º

npm install --save nconf

ÕâÐÐÃüÁîÒâζ×Å nconf Ä£¿é½«»á×÷ΪӦÓÃÒÀÀµ±»°²×°µ½ÏîÄ¿ÖУ¬µ±ÎÒÃÇÒª·¢²¼Ó¦ÓõÄʱºò£¬Õâ¸öÄ£¿é»á±»Ò»Æð´ò°ü¸øÓû§£¨save-dev ²ÎÊý»áʹ°²×°µÄÄ£¿éÖ»³öÏÖÔÚ¿ª·¢½×¶Î£¬·¢²¼Ó¦ÓõÄʱºò²»»á±»°üº¬½øÈ¥£©¡£

ÔÚ¸ùĿ¼Ï´´½¨ configuration.js Îļþ£¬ËüµÄÄÚÈݷdz£¼òµ¥£º

'use strict';varnconf=require('nconf').
file({file:getUserHome()+
'/sound-machine-config.json'});
functionsaveSettings
(settingKey,settingValue){nconf.set
(settingKey,settingValue);nconf.save();}
functionreadSettings(settingKey)
{nconf.load();returnnconf.get(settingKey);}
functiongetUserHome(){returnprocess.env
[(process.platform=='win32')
?'USERPROFILE':'HOME'];}
module.exports={saveSettings:saveSettings,
readSettings:readSettings};

ÎÒÃÇÒª°ÑÎļþλÖúÍÎļþÃû´« nconf Ä£¿é£¨Óà Node.js µÄ process.env »ñÈ¡µ½ÎļþµÄλÖã©£¬¾ßÌå·¾¶»á¸ù¾Ýƽ̨¶øÒì¡£

ͨ¹ý nconf Ä£¿éµÄ set() ºÍ get() ·½·¨½áºÏÎļþ²Ù×÷µÄ save() ºÍ load()£¬ÎÒÃÇ¿ÉÒÔʵÏÖÉèÖÃÎļþµÄ¶Áд²Ù×÷£¬È»ºóͨ¹ý module.exports ½«½Ó¿Ú±©Â¶µ½Íⲿ¡£

³õʼ»¯Ä¬ÈϵĿì½Ý¼üÉèÖÃ

ÔÚ½²ÉèÖý»»¥Ö®Ç°£¬ÎªÁ˱ÜÃâÓû§ÊǵÚÒ»´Î´ò¿ªÕâ¸öÓ¦Óã¬ÒªÏȳõʼ»¯Ò»¸öÉèÖÃÎļþ¡£ÎÒÃǽ«»áÒÔÊý×éµÄÐÎʽ´¢´æÈȼü£¬¶ÔÓ¦µÄ¼üÊÇ ¡°shortcutKeys¡±£¬´¢´æÔÚ main.js ÖУ¬ÎÒÃÇÐèÒª°Ñ configuration Ä£¿é°üº¬µ½ÏîÄ¿ÖУº

'use strict';varconfiguration=
require('./configuration');
app.on('ready',function()
{if(!configuration.readSettings
('shortcutKeys'))
{configuration.saveSettings
('shortcutKeys',['ctrl','shift']);}...}

ÎÒÃÇÐèÒªÏȼì²â¼ü ¡®shortcutKeys¡¯ ÊÇ·ñÒѾ­ÓжÔÓ¦µÄÖµÁË£¬Èç¹ûûÓÐÎÒÃÇÐèÒª³õʼ»¯Ò»¸öÖµ¡£

ÔÚ main.js ÖУ¬ÎÒÃǽ«ÖØÐ´È«¾Ö¿ì½Ý¼üµÄ×¢²á·½·¨£¬ÔÚÖ®ºóÎÒÃǸüÐÂÉèÖõÄʱºò£¬»áÖ±½Óµ÷ÓÃÕâ¸ö·½·¨¡£½«Ô­À´µÄ×¢²á´úÂë¸Ä³ÉÒÔÏÂÄÚÈÝ£º

app.on('ready', function () {
...
setGlobalShortcuts();
}
function setGlobalShortcuts() {
globalShortcut.unregisterAll();
var shortcutKeysSetting
= configuration.readSettings
('shortcutKeys');
var shortcutPrefix =
shortcutKeysSetting.length === 0 ? ''
: shortcutKeysSetting.join('+') + '+';
globalShortcut.register
(shortcutPrefix + '1', function () {
mainWindow.webContents.send
('global-shortcut', 0);
});
globalShortcut.register
(shortcutPrefix + '2', function () {
mainWindow.webContents.send
('global-shortcut', 1);
});
}

ÉÏÊö·½·¨ÖØÖÃÁËÈ«¾Ö¿ì½Ý¼üµÄÖµ£¬´ÓÉèÖÃÖжÁÈ¡ÈȼüµÄÊý×飬½«Ëü´«Èë¼ÓËÙÆ÷¼æÈÝ×Ö·û´®£¨Accelerator-compatible£©²¢×¢²áмü¡£

ÉèÖô°¿ÚµÄ½»»¥

»Øµ½ settings.js Îļþ£¬ÎÒÃÇÐèÒª°ó¶¨µã»÷ʼþÀ´¸Ä±äÎÒÃǵÄÈ«¾Ö¿ì½Ý¼ü¡£Ê×ÏÈ£¬ÎÒÃǽ«»á±éÀú¸´Ñ¡¿ò£¬¼Ç¼Ï±»¹´Ñ¡µÄÑ¡Ï´Ó configuration Ä£¿éÖжÁÖµ£©£º

varconfiguration=require('../configuration.js');
varmodifierCheckboxes=document.querySelectorAll
('.global-shortcut');for(vari=0;i

ÏÖÔÚÎÒÃÇÐèÒª°ó¶¨¸´Ñ¡¿òµÄÐÐΪ¡£¿¼Âǵ½ÉèÖô°¿Ú£¨ºÍËüµÄäÖȾÆ÷½ø³Ì£©ÊDz»ÔÊÐí¸Ä±ä GUI °ó¶¨µÄ¡£Õâ˵Ã÷ÎÒÃÇÐèÒª´Ó setting.js Öз¢ËÍÐÅÏ¢£¨Ö®ºó»á´¦ÀíÕâ¸öÐÅÏ¢µÄ£©£º

for (var i = 0;
i < modifierCheckboxes.length; i++) {
...
modifierCheckboxes[i].addEventListener
('click', function (e) {
bindModifierCheckboxes(e);
});
}
function bindModifierCheckboxes(e) {
var shortcutKeys =
configuration.readSettings('shortcutKeys');
var modifierKey = e.target.attributes
['data-modifier-key'].value;
if (shortcutKeys.indexOf
(modifierKey) !== -1) {
var shortcutKeyIndex
= shortcutKeys.indexOf(modifierKey);
shortcutKeys.splice(shortcutKeyIndex, 1);
}
else {
shortcutKeys.push(modifierKey);
}
configuration.saveSettings
('shortcutKeys', shortcutKeys);
ipc.send('set-global-shortcuts');
}

Õâ¶Î´úÂë¿´ÆðÀ´±È½Ï³¤£¬µ«ÊÂʵÉÏËüºÜ¼òµ¥¡£ÎÒÃǽ«»á±éÀúËùÓеĸ´Ñ¡¿ò£¬²¢°ó¶¨µã»÷ʼþ£¬ÔÚÿ´Îµã»÷µÄʱºò¼ì²éÉèÖÃÊý×éÖÐÊÇ·ñ°üº¬ÓÐÈȼü¡£¸ù¾Ý¼ì²é½á¹û£¬¸ü¸ÄÊý×飬½«½á¹û±£´æµ½ÉèÖÃÖУ¬²¢ÏòÖ÷½ø³Ì·¢ËÍÐÅÏ¢£¬¸üÐÂÎÒÃǵÄÈ«¾Ö¿ì½Ý¼ü¡£

ÏÖÔڵŤ×÷¾ÍÊÇÔÚ main.js Öн« ipc ÐÅÏ¢¶©Ôĵ½¡°ÉèÖÃÈ«¾Ö¿ì½Ý¼ü¡±ÆµµÀ£¬²¢¸üÐÂÎÒÃǵÄÈ«¾Ö¿ì½Ý¼ü£º

ipc.on('set-global-shortcuts',
function(){setGlobalShortcuts();});

¾ÍÕâô¼òµ¥£¬ÎÒÃǵÄÈ«¾Ö¿ì½Ý¼üÒѾ­¿ÉÅäÖÃÁË£¡

²Ëµ¥ÖÐÒª·Åʲô£¿

½ÓÏÂÀ´À­È¡ 06-shortcuts-configurable£º

git checkout 06-shortcuts-configurable

ÁíÒ»¸öÔÚ×ÀÃæÓ¦ÓÃÖеÄÖØÒª¸ÅÄî¾ÍÊÇ¡°²Ëµ¥¡±£¬±ÈÈçÓÒ¼ü²Ëµ¥£¨µã»÷ÓÒ¼ü³öÏֵIJ˵¥£©¡¢ÍÐÅ̲˵¥£¨Í¨³£»áÓÐÒ»¸öÍÐÅÌ icon£©ºÍÓ¦Óò˵¥£¨ÔÚ OS X ÖУ©µÈµÈ¡£

ÔÚÕâÒ»½ÚÖУ¬ÎÒÃǽ«»áÌí¼ÓÒ»¸öÍÐÅ̲˵¥¡£ÎÒÃÇÒ²½«»á½è´Ë»ú»á³¢ÊÔÔÚremote Ä£¿éÖÐʹÓñðµÄ½ø³Ì¼äµÄͨÐÅ·½Ê½¡£

remote Ä£¿é´ÓäÖȾÆ÷½ø³Ìµ½Ö÷½ø³ÌÍê³É RPC ÀàÐ͵ĵ÷Ó᣽«Ä£¿éÒýÈëµÄʱºò£¬Õâ¸öÄ£¿éÊÇÔÚÖ÷½ø³ÌÖб»ÊµÀý»¯µÄ£¬ËùÒÔËüÃǵķ½·¨Ò²»áÔÚÖ÷½ø³ÌÖб»Ö´ÐС£Êµ¼Ê¿ª·¢ÖУ¬Õâ¸öÐÐΪÊÇÔÚÔ¶³ÌµØÇëÇó index.js ÖеÄÔ­Éú GUI Ä£¿é£¬È»ºóÓÖÔÚ main.js Öе÷Óà GUI µÄ·½·¨¡£Õâô×öµÄ»°£¬ÄãÐèÒªÔÚ index.js Öн« BrowserWindow Ä£¿éÒýÈ룬ȻºóʵÀý»¯Ò»¸öеÄä¯ÀÀÆ÷´°¿Ú¡£ÆäʵÔÚÖ÷½ø³ÌÖÐÓÐÒ»¸öͬ²½µÄµ÷Óã¬Êµ¼ÊÉÏÊÇÕâ¸öµ÷Óô´½¨ÁËеÄä¯ÀÀÆ÷´°¿Ú¡£

ÏÖÔÚÈÃÎÒÃÇÀ´¿´¿´ÒªÔõôÑù´´½¨Ò»¸ö²Ëµ¥£¬²¢ÔÚäÖȾÆ÷½ø³ÌÖн«Ëü°ó¶¨µ½Ò»¸öÍÐÅÌͼ±êÉÏ¡£½«ÏÂÃæÕâ¶Î´úÂë¼ÓÈë index.js ÖУº

varremote=require('remote');
varTray=remote.require('tray');
varMenu=remote.require('menu');
varpath=require('path');vartrayIcon=null;
if(process.platform==='darwin')
{trayIcon=newTray(path.join
(__dirname,'img/tray-iconTemplate.png'));}
else{trayIcon=newTray(path.join
(__dirname,'img/tray-icon-alt.png'));}
vartrayMenuTemplate=[{label:
'Sound machine',enabled:false},
{label:'Settings',click:function()
{ipc.send('open-settings-window');}},
{label:'Quit',click:function()
{ipc.send('close-main-window');}}];
vartrayMenu=Menu.buildFromTemplate
(trayMenuTemplate);
trayIcon.setContextMenu(trayMenu);

Ô­ÉúµÄ GUI Ä£¿é£¨²Ëµ¥ºÍÍÐÅÌ£©Í¨¹ýremoteÄ£¿é°üº¬½øÀ´±È½Ï°²È«¡£

OS X Ö§³ÖͼƬģ°å£¨½«Í¼Æ¬ÎļþÃûÒÔ ¡®Template¡¯ ½á⣬¾Í»á±»¶¨Òå³ÉΪͼƬģ°å£©£¬ÍÐÅÌͼ±ê¿ÉÒÔͨ¹ýÄ£°åÀ´¶¨Ò壬ÕâÑùÎÒÃǵÄͼ±ê¾Í»áÓС°°µºÚ¡±ºÍ¡°¹âÃ÷¡±Á½¸öÖ÷ÌâÁË¡£ÆäËûµÄ²Ù×÷ϵͳÓÃÕý³£µÄͼ±ê¾ÍÐС£

ÔÚ Electron ÖÐÓкܶà°ó¶¨²Ëµ¥µÄ·½·¨¡£ÕâÀï½éÉܵķ½·¨Ö»ÊÇ´´½¨ÁËÒ»¸ö²Ëµ¥Ä£°å£¨½«²Ëµ¥ÏîÓÃÊý×éµÄ·½Ê½´æ´¢£©£¬È»ºóͨ¹ýÕâ¸öÄ£°å´´½¨²Ëµ¥£¬ÍÐÅÌ icon ÔÙ°ó¶¨ÉÏÕâ¸ö²Ëµ¥£¬¾ÍʵÏÖÁËÎÒÃǵIJ˵¥¹¦ÄÜ¡£

Ó¦Óôò°ü

½ÓÏÂÀ´À­È¡ 07-ready-for-packaging£º

git checkout 07-ready-for-packaging

Èç¹ûÄã×öÁËÒ»¸öÓ¦Óýá¹ûÈËÃÇÁ¬ÏÂÔØ¶¼ÏÂÔØ²»ÁË£¬Ôõô»áÓÐÈËÓÃÄØ£¿

ͨ¹ýelectron-packagerÄã¿ÉÒÔ½«Ó¦Óôò°üµ½È«Æ½Ì¨¡£ÕâÒ»²½ÖèÔÚ shell ÖоͿÉÒÔÍê³É£¬½«Ó¦Óôò°üºÃÒÔºó¾ÍÄÜ·¢²¼ÁË¡£

Ëü¿ÉÒÔ×÷Ϊһ¸öÃüÁîÐÐÓ¦ÓûòÕß×÷Ϊ¿ª·¢Ó¦Óùý³ÌÖеÄÒ»²½£¬¹¹½¨Ò»¸ö¸ü¸´ÔӵĿª·¢³¡¾°²»ÊÇÕâÆªÎÄÕÂҪ̸µÄÄÚÈÝ£¬²»¹ýÎÒÃǽ«Í¨¹ý npm ½Å±¾ÈÃÓ¦Óôò°ü¸ü¼òµ¥Ò»µã¡£Óà electron-packager ´ò°üµÄÃüÁîÊÇÕâÑùµÄ£º

electron-packager

ÒÔÉÏÃüÁ

½«Ä¿Â¼Çл»µ½ÏîÄ¿ËùÔÚ·¾¶

²ÎÊý ¡®name of project¡¯ ÊÇÄãµÄÏîÄ¿Ãû£¬²ÎÊý ¡®plateform¡¯ È·¶¨ÁËÄãÒª¹¹½¨Äĸöƽ̨µÄÓ¦Óã¨Windows¡¢Mac »¹ÊÇ Linux£©

²ÎÊý ¡®architecture¡¯ ¾ö¶¨ÁËʹÓà x86 »¹ÊÇ x64 »¹ÊÇÁ½¸ö¼Ü¹¹¶¼ÓÃ

¾ö¶¨ÁËʹÓÃµÄ Electron °æ±¾¡£

µÚÒ»´Î´ò°üÓ¦ÓÃÐèÒª±È½Ï¾ÃµÄʱ¼ä£¬ÒòΪËùÓÐÆ½Ì¨µÄ¶þ½øÖÆÎļþ¶¼ÐèÒªÏÂÔØ£¬Ö®ºó´ò°üÓ¦Óûá±È½Ï¿ìÁË¡£

ÔÚ Mac ÉÏÎÒÊÇÕâô×öµÄ£º

electron-packager ~/Projects
/sound-machine SoundMachine
--all --version=0.30.2
--out=~/Desktop --overwrite
--icon=~/Projects/sound-machine
/app/img/app-icon.icns

Ê×ÏÈÄãÒª½«Í¼±êµÄ¸ñʽת»»³É .icns£¨ÔÚ Mac ÉÏ£©»òÕß .ico£¨ÔÚ Windows ÉÏ£©£¬ÍøÂçÉÏÓй¤¾ß¿ÉÒÔ°Ñ PNG ×öÕâÑùµÄת»»£¨È·±£ÏÂÔØµÄͼƬµÄÀ©Õ¹ÃûÊÇ .icns ¶ø²»ÊÇ .hqx£©¡£Èç¹û´Ó·Ç Windows µÄϵͳÉÏ´ò°üÁË Windows µÄÓ¦Óã¬ÄãÓ¦¸ÃÐèÒª´¦ÀíһϷ¾¶£¨Mac Óû§¿ÉÒÔÓà brew£¬Linux Óû§¿ÉÒÔÓà apt-get£©¡£

ÿ´Î¶¼ÒªÖ´ÐÐÕâô³¤µÄÒ»¾äÃüÁîÒ»µã¶¼²»ºÏÀí¡£ËùÒÔÄã¿ÉÒÔÔÚ package.json ÖÐÌí¼ÓÁíÒ»¸ö½Å±¾¡£Ê×ÏÈ£¬½«electron-packager ×÷Ϊ development dependency °²×°£º

npm install --save-dev electron-packager

È»ºóÔÚ package.json ÖÐÌí¼ÓÒÔÏÂÄÚÈÝ£º

"scripts":{"start":"electron .",
"package":"electron-packager
./ SoundMachine --all --out
~/Desktop/SoundMachine
--version 0.30.2 --overwrite
--icon=./app/img/app-icon.icns"}

½Ó×ÅÖ´ÐУº

npm run-script package

´ò°üÃüÁîÆô¶¯ÁË electron-packager£¬ÔÚµ±Ç°Ä¿Â¼Öв鿴ÏîÄ¿£¬ÔÚ Desktop Ŀ¼Öй¹½¨¡£Èç¹ûÄãʹÓõÄÊÇ Windows£¬½Å±¾ÄÚÈÝÐèҪһЩϸ΢µÄ¸üС£

ÉùЧÆ÷ĿǰÊÇ 100MB ´óС£¬²»Òªµ£ÐÄ£¬µ±ÄãѹËõËüÖ®ºó£¬ËùÕ¼¿Õ¼ä»á¼õ°ë¡£

Èç¹ûÄã¶Ô´Ë»¹Óиü´óµÄ¼Æ»®£¬¿ÉÒÔ¿´¿´electron-builder£¬ËüÊǸù¾Ý electron-packager ¹¹½¨³öµÄÓ¦Óôò°üÔÙ×ö×Ô¶¯°²×°µÄ´¦Àí¡£

Ìí¼ÓÆäËûµÄÌØÐÔ

ÏÖÔÚÄã¿ÉÒÔ³¢ÊÔ¿ª·¢±ðµÄ¹¦ÄÜÁË¡£

ÕâÀïÓÐһЩ·½°¸£¬¿ÉÒÔÆô·¢ÄãµÄÁé¸Ð£º

Ó¦ÓõÄʹÓÃÊֲᣬ˵Ã÷ÁËÓÐÄÇЩ¿ì½Ý¼üºÍÓ¦ÓÃ×÷Õß

ÔÚÓ¦ÓÃÖиøÊ¹ÓÃÊÖ²áÌí¼ÓÒ»¸öͼ±êºÍ²Ëµ¥Èë¿Ú

¹¹½¨Ò»¸ö´ò°ü½Å±¾£¬ÓÃÓÚ¿ìËÙ¹¹½¨ºÍ·Ö·¢

ʹÓÃ* node-notifier *Ìí¼ÓÒ»¸öÌáʾϵͳ£¬¸æËßÓû§ÕýÔÚ²¥·ÅÄÄÒ»¸öÉùÒô

ʹÓÃ* lodash *ÈÃÄãµÄ´úÂë¸ü¼Ó¸É¾»¡¢¾ßÓиüºÃµÄÀ©Õ¹ÐÔ

ÔÚ´ò°ü֮ǰ²»ÒªÍüÁËѹËõÄãµÄ CSS ºÍ JavaScript

½áºÏÉÏÎÄÌáµ½µÄ* node-notifier *ºÍÒ»¸ö·þÎñÆ÷¶ËµÄµ÷Óã¬Í¨ÖªÓû§ÊÇ·ñÐèÒª¸üа汾¡­¡­

»¹ÓÐÒ»¸öÖµµÃÒ»ÊԵĶ«Î÷ ¨C ½«´úÂëÖйØÓÚä¯ÀÀÆ÷´°¿ÚµÄÂß¼­³éÀë³öÀ´£¬Í¨¹ýÀàËÆ browserify µÄ¹¤¾ß´´½¨Ò»¸öºÍÉùЧÆ÷Ò»ÑùµÄÍøÒ³¡£Ò»·Ý´úÂ룬Á½¸ö²úÆ·£¨×ÀÃæ¶ËºÍ Web ÒýÓã©¡£¿á±ÐÁË£¡

¸üÉîÈëÑо¿ Electron

ÎÒÃÇÖ»Êdz¢ÊÔÁË Electron µÄ±ùɽһ½Ç£¬ÏëÒªÖªµÀ¼à¿ØÖ÷»úµÄµçÔ´Çé¿ö¡¢»ñÈ¡µ±Ç°´°¿ÚµÄÐÅÏ¢£¨±ÈÈç¹â±êµÄλÖ㩵ȣ¬Eletron ¶¼ÄܰïÄã×öµ½¡£

¶ÔÓÚËùÓеÄÄÚÖù¤¾ß£¨Í¨³£ÔÚ¿ª·¢ Electron Ó¦ÓÃʱʹÓã©£¬²é¿´Electron API Îĵµ¡£

ÕâЩÎĵµÔÚ Electron µÄ github ²Ö¿âÖж¼ÄÜÕÒµ½¡£

Sindre Sorhus ÕýÔÚά»¤Ò»·ÝElectron ×ÊÔ´Çåµ¥£¬ÔÚÄǸöÉÏÃæÄã¿ÉÒÔ¿´µ½ºÜ¶à·Ç³£¿áµÄÏîÄ¿£¬»¹ÄÜÁ˽⵽һЩϵͳ¼Ü¹¹×öµÄºÜºÃµÄ Electron Ó¦Óã¬ÕâЩ¶¼ÄܸøÄãµÄ¿ª·¢´øÀ´Áé¸Ð¡£

Electron ÊÇ»ùÓÚ io.js µÄ£¬´ó²¿·Ö Node.js Ä£¿é¶¼¿ÉÒÔ¼æÈÝ£¬¿ÉÒÔʹÓÃËüÃÇÀ©Õ¹ÄãµÄÓ¦Óá£È¥npmjs.comÉÏ¿´¿´ÓÐûÓкÏÊʵġ£

ÕâÑù¾Í¹»ÁËÂð£¿

µ±È»²»¡£

ÏÖÔÚ£¬¿ÉÒÔÀ´¹¹½¨Ò»¸ö¸ü´óÐ͵ÄÓ¦ÓÃÁË¡£ÔÚÕâÆªÎÄÕÂÖУ¬ÎÒ¼¸ºõûÓÐ˵µ½ÈçºÎʹÓÃÍⲿµÄ¿â»òÕß¹¹½¨¹¤¾ßÀ´¹¹½¨Ò»¸öÓ¦Ó㬲»¹ýÓà ES6 ºÍ Typescript µÄÓï·¨½áºÏ Angular ºÍ React À´¹¹½¨ Electron Ó¦ÓÃÒ²ºÜ¼òµ¥£¬»¹¿ÉÒÔÓà gulp »ò grunt ¹¹½¨Á÷³Ì¡£

¸ÉÂï²»ÓÃÄã×îϲ»¶µÄÓïÑÔ£¬¿ò¼ÜºÍ¹¤¾ß£¬À´ÊÔÊÔ¹¹½¨Ò»¸ö Filckr ͬ²½¹¤¾ß£¨½èÖú Filckr API ºÍ node-filckrapi£©»òÕßÒ»¸ö Gmail ¿Í»§¶Ë

 
   
5712 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

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

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

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