±à¼ÍƼö: |
±¾ÎÄÖ÷Òª°ïÖú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 ¿Í»§¶Ë
|