±à¼ÍƼö: |
±¾ÎÄÖ÷ÒªÖ¸µ¼¹¹½¨Ò»¸ö¼òµ¥µÄ×ÀÃæÓ¦Óã¬ÒÔ¼°Ê¹ÓÃ
JavaScript ¹¹½¨×ÀÃæÓ¦ÓõÄʱºòÒªÄÄÐ©ÖØÒªµÄ¸ÅÄϣÍû¶ÔÄúÄÜÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚÖªºõ£¬,ÓÉ»ðÁú¹ûÈí¼þAlice±à¼ÍƼö¡£ |
|
ʹÓà JavaScript¡¢Node.js ºÍ Electron
´´ÔìרÊôÓÚÄãµÄÉùЧÆ÷
JavaScript ×ÀÃæÓ¦ÓÃÊÇʲô
¼´Ê¹ÔÚÒÆ¶¯¶ËºÍÔÆ¶Ë´óÐÐÆäµÀ¶ø£¬×ÀÃæ¶ËÈÕ½¥ÂäÄ©µÄÏÖÔÚ£¬ÎÒµÄÐÄÖÐÈÔȻΪ×ÀÃæÓ¦ÓÃÁôÓÐÒ»¸öÌØÊâµÄλÖ᣺Í
Web Ó¦ÓÃ±ÈÆðÀ´×ÀÃæÓ¦ÓõÄÓŵ㻹ÊǺܶàµÄ£ºÖ»Òª°ÑËüÃÇ·ÅÔÚ¿ªÊ¼²Ëµ¥À¸»òÕß dock ÉÏ£¬Äã¾ÍÄÜËæÊ±´ò¿ªËüÃÇ£»»¹¿ÉÒÔͨ¹ý
alt-tab »òÕß cmd-tab Çл»Ó¦Ó㻺ͲÙ×÷ϵͳ֮¼äµÄ½»»¥¸üÁ¼ºÃ£¨¿ì½Ý¼ü£¬Í¨ÖªÀ¸µÈ£©¡£
ʹÓà JavaScript ¿ª·¢×ÀÃæÓ¦ÓÃÒâζ×ÅÔÚ´ò°ü£¨package application£©µÄʱºòÄã»áÐèÒª¸ù¾Ý²Ù×÷ϵͳµÄ²»Í¬·¢³ö²»Í¬µÄÃüÁî¡£ÕâÒ»ÐÐΪÊǽ«ÔÉú×ÀÃæÓ¦ÓüæÈݲ»Í¬Æ½Ì¨µÄ¸ÅÄî³éÏó³öÀ´£¬·½±ãά»¤Ó¦Óá£ÏÖÔÚ£¬ÎÒÃÇ¿ÉÒÔ½èÖú
Electron »òÕß NW.js ¿ª·¢Ò»¸ö×ÀÃæÓ¦Óá£ÆäʵÕâÁ½ÕßÌṩµÄ»ò¶à»òÉٲ¶àµÄÌØÐÔ£¬µ«¶ÔÓÚÎÒÀ´Ëµ£¬»¹ÊǸüÆ«ÏòÓÚ
Electron¡£ÔÚ×ö³öÑ¡Ôñ֮ǰ£¬ÏÈÏêϸÁ˽âËüÃDz¢¿¼ÂǸ÷ÖÖÇé¿ö£¬¾Í²»»áÑ¡´íµÄ¡£

»ù±¾¼ÙÉè
¿ªÊ¼½Ì³Ì֮ǰ£¬ÇëÔÊÐíÎÒ¼ÙÉèÄãÒѾÓÐÁËÒ»¸ö³£ÓÃµÄµÄ±à¼Æ÷£¨»òÕß 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£º
ÎÒÃǽ«¸úËæÕâЩ tag ½«ÉùЧÆ÷Ò»²½²½¹¹½¨³öÀ´£º
git checkout
00-blank-repository |
ÀÈ¡£¨checkout£©Ä¿±ê tag Ö®ºó£¬Ö´ÐУº
Õâô×öÄܱ£Ö¤ÏîÄ¿ËùÒÀÀµµÄ 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 µÄ×÷ÓÃÊÇ£º
1.È·¶¨Ó¦ÓõÄÃû×ֺͰ汾ºÅ£¬
2.¸æËß Electron main.js ÊÇ main process
µÄÈë¿Ú£¬
3.¶¨ÒåÆô¶¯¿ÚÁî - ÔÚ 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 Îļþ£¬²¢Ð´ÈëÒÔÏÂÄÚÈÝ£º
ÔÚÏîÄ¿µÄ¸ùĿ¼´´½¨ main.js Îļþ¡£Electron Ö÷Ï̵߳ÄÈë¿ÚÊÇÕâ¸ö JS Îļþ£¬È»ºó ¡°Hello
world!¡± Ò³ÃæÒ²Í¨¹ýËüÏÔʾ³öÀ´£º
'use strict';
var app = require('app');
var BrowserWindow = require('browser-window');
var mainWindow = null; app.on('ready', function() {
mainWindow = new BrowserWindow({
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 Îļþ¡£
Ö´ÐÐÏÂÃæÕâÐдúÂ룬¿´¿´ÎÒÃǵÄÓ¦ÓÃÊÇʲôÑùµÄ£º
ÏÖÔÚãåÔ¡ÔÚÕâ¸ö app µÄÊ¥¹âÖаɡ£

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

¾ßÌåÀ´Ëµ£¬ÎÒÃǽ«»áʵÏÖÒÔϹ¦ÄÜ£¬²¢Éæ¼°µ½ÒÔÏÂ֪ʶ£º
1.ÉùЧÆ÷µÄ»ù´¡£¨ÊµÀý»¯ä¯ÀÀÆ÷´°¿Ú£©£¬
2.¹Ø±ÕÉùЧÆ÷£¨Ö÷½ø³ÌºÍäÖȾÆ÷½ø³ÌÖ®¼äµÄͨÐÅ£©£¬
3.ËæÊ±²¥·ÅÉùÒô£¨È«¾Ö¿ì½Ý¼ü£©£¬
4.´´½¨Ò»¸ö¿ì½ÝÐÞÊμü£¨ÐÞÊμü£¬modifier keys£¬ Ö¸µÄÊÇ
Shift¡¢Ctrl ºÍ Alt ¼ü£©ÉèÖÃÒ³Ãæ£¨²¢½«Óû§ÉèÖñ£´æÔÚÖ÷Ŀ¼Ï£©£¬
5.Ìí¼ÓÒ»¸öÍÐÅÌͼ±ê£¨´´½¨ÔÉú GUI ÔªËØ¡¢Á˽â²Ëµ¥ºÍÍÐÅÌͼ±êµÄʹÓã©,
6.½«Ó¦Óôò°üµ½ 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';
var app = require('app');
var BrowserWindow = require('browser-window');
var mainWindow = null;
app.on('ready', function() {
mainWindow = new BrowserWindow({
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'; var soundButtons = document.querySelectorAll('.button-sound');
for (var i = 0; i < soundButtons.length;
i++) {
var soundButton = soundButtons[i];
var soundName = soundButton.attributes['data-sound'].value;
prepareButton(soundButton, soundName);
} function prepareButton(buttonEl, soundName)
{
buttonEl.querySelector('span').style.backgroundImage
= 'url("img/icons/' + soundName + '.png")'; var audio = new Audio(__dirname + '/wav/'
+ soundName + '.wav');
buttonEl.addEventListener('click', function
() {
audio.currentTime = 0;
audio.play();
});
} |
ͨ¹ýÉÏÃæÕâ¶Î´úÂ룬ÎÒÃÇ£º
»ñÈ¡ÉùÒô°´Å¥£¬
µü´ú·ÃÎʰ´Å¥µÄdata-soundÊôÐÔÖµ£¬
¸øÃ¿¸ö°´Å¥¼ÓÉϱ³¾°Í¼£¬
ͨ¹ý HTMLAudioElement ½Ó¿Ú¸øÃ¿¸ö°´Å¥¶¼Ìí¼ÓÒ»¸öµã»÷ʼþ£¬Ê¹Ö®¿ÉÒÔ²¥·ÅÒôƵ£¬
ͨ¹ýÏÂÃæÕâÐÐÃüÁîÔËÐÐÄãµÄÓ¦Óðɣº

ͨ¹ýÔ¶³Ìʼþ´Óä¯ÀÀ´°¿ÚÖйرÕÓ¦ÓÃ
½Ó×ÅÀÈ¡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 ÖУº
var ipc =
require('ipc');
ipc.on('close-main-window', function () {
app.quit();
}); |
°Ñ ipc Ä£¿é°üº¬½øÀ´Ö®ºó£¬´ÓƵµÀÖж©ÔÄÐÅÏ¢¾Í·Ç³£¼òµ¥ÁË£º¹ý on() ·½·¨ºÍƵµÀÃû³Æ£¬ÔÙ¼ÓÉÏÒ»¸ö»Øµ÷º¯Êý¾ÍÐÐÁË¡£
ÒªÏò¸ÃƵµÀ·¢ËÍÐÅÏ¢£¬¾ÍÒª°ÑÏÂÃæµÄ´úÂë¼ÓÈë index.js ÖÐ:
var ipc =
require('ipc'); var closeEl = 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£©¡£
ÒªÍê³ÉÕâÒ»¸ö¹¦ÄÜ£¬ÎÒÃÇÐèÒª×öÏÂÃæÕâЩÊÂÇ飺
1.ÔÚÖ÷½çÃæÉÏÌí¼ÓÉèÖð´Å¥£¬
2.ʵÏÖÒ»¸öÉèÖô°¿Ú£¨ÉèÖÃÒ³ÃæÉÏÓжÔÓ¦µÄHTML¡¢CSS ºÍ JS£©£¬
3.¿ªÆôºÍ¹Ø±ÕÉèÖô°¿Ú£¬ÒÔ¼°¸üÐÂÈ«¾Ö¿ì½Ý¼üµÄ ipc ÐÅÏ¢£¬
4.´ÓÓû§µÄϵͳÖжÁд´æ´¢ÉèÖÃÐÅÏ¢µÄ JSON Îļþ¡£
5.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 |
ÉèÖô°¿ÚµÄ½»»¥¹ý³ÌÊÇ£¬´æ´¢ÉèÖÃÐÅÏ¢ÒÔ¼°Ë¢ÐÂÓ¦Óãº
1.´´½¨Ò»¸ö JSON ÎļþÓÃÓÚ¶ÁдÓû§ÉèÖã¬
2.ÓÃÕâ¸öÉèÖóõʼ»¯ÉèÖô°¿Ú£¬
3.ͨ¹ýÓû§µÄ²Ù×÷¸üÐÂÕâ¸öÉèÖÃÎĵµ£¬
4.֪ͨÖ÷½ø³ÌÒª¸üÐÂÉèÖÃÒ³Ãæ¡£
ÎÒÃÇ¿ÉÒÔ°ÑʵÏÖ¶ÁдÉèÖõIJ¿·ÖÖ±½Óд½ø main.js ÖУ¬µ«ÊÇÈç¹û°ÑÕⲿ·Ö¶ÀÁ¢³ÉÄ£¿é£¬¿ÉÒÔËæ´¦ÒýÓÃÕâÑù²»ÊǸüºÃÂð£¿
ʹÓà JSON ×öÅäÖÃÎļþ
ÏÖÔÚÎÒÃÇÒª´´½¨Ò»¸ö configuration.js Îļþ£¬ÔÙ½«Õâ¸öÎļþÒýÈëµ½ÏîÄ¿ÖС£Node.js
ʹÓÃÁË CommonJS ×÷Ϊ±àдģ¿éµÄ¹æ·¶£¬Ò²¾ÍÊÇ˵ÄãÐèÒª½«ÄãµÄ API ºÍÕâ¸ö API ÖпÉÓõĺ¯Êý¶¼Òª±©Â¶³öÀ´¡£

ΪÁ˸ü¼òµ¥µØ¶ÁдÎļþ£¬ÎÒÃǽ«»áʹÓà nconf Ä£¿é£¬Õâ¸öÄ£¿é·â×°ÁË JSON ÎļþµÄ¶Áд¡£µ«Ê×ÏÈ£¬ÎÒÃÇÐèÒª½«Õâ¸öÄ£¿é°üº¬µ½ÏîÄ¿ÖÐÀ´£º
ÕâÐÐÃüÁîÒâζ×Å nconf Ä£¿é½«»á×÷ΪӦÓÃÒÀÀµ±»°²×°µ½ÏîÄ¿ÖУ¬µ±ÎÒÃÇÒª·¢²¼Ó¦ÓõÄʱºò£¬Õâ¸öÄ£¿é»á±»Ò»Æð´ò°ü¸øÓû§£¨save-dev
²ÎÊý»áʹ°²×°µÄÄ£¿éÖ»³öÏÖÔÚ¿ª·¢½×¶Î£¬·¢²¼Ó¦ÓõÄʱºò²»»á±»°üº¬½øÈ¥£©¡£
ÔÚ¸ùĿ¼Ï´´½¨ configuration.js Îļþ£¬ËüµÄÄÚÈݷdz£¼òµ¥£º
use strict'; var nconf = require('nconf').file({file: getUserHome()
+ '/sound-machine-config.json'});
function saveSettings(settingKey, settingValue)
{
nconf.set(settingKey, settingValue);
nconf.save();
} function readSettings(settingKey) {
nconf.load();
return nconf.get(settingKey);
} function getUserHome() {
return process.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'; var configuration = 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 Ä£¿éÖжÁÖµ£©£º
var configuration
= require('../configuration.js'); var modifierCheckboxes = document.querySelectorAll('.global-shortcut');
for (var i = 0; i < modifierCheckboxes.length;
i++) {
var shortcutKeys = configuration.readSettings('shortcutKeys');
var modifierKey = modifierCheckboxes[i].attributes['data-modifier-key'].value;
modifierCheckboxes[i].checked = shortcutKeys.indexOf(modifierKey)
!== -1; ... // Binding of clicks comes here
} |
ÏÖÔÚÎÒÃÇÐèÒª°ó¶¨¸´Ñ¡¿òµÄÐÐΪ¡£¿¼Âǵ½ÉèÖô°¿Ú£¨ºÍËüµÄäÖȾÆ÷½ø³Ì£©Ê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 ÖУº
var remote
= require('remote');
var Tray = remote.require('tray');
var Menu = remote.require('menu');
var path = require('path'); var trayIcon = null; if (process.platform === 'darwin') {
trayIcon = new Tray(path.join(__dirname, 'img/tray-iconTemplate.png'));
}
else {
trayIcon = new Tray(path.join(__dirname, 'img/tray-icon-alt.png'));
} var trayMenuTemplate = [
{
label: 'Sound machine',
enabled: false
},
{
label: 'Settings',
click: function () {
ipc.send('open-settings-window');
}
},
{
label: 'Quit',
click: function () {
ipc.send('close-main-window');
}
}
];
var trayMenu = 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
<location of project> <name of project>
<platform> <architecture> <electron
version> <optional options> |
ÒÔÉÏÃüÁ
½«Ä¿Â¼Çл»µ½ÏîÄ¿ËùÔÚ·¾¶£¬
²ÎÊý ¡®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"
} |
½Ó×ÅÖ´ÐУº
´ò°üÃüÁîÆô¶¯ÁË electron-packager£¬ÔÚµ±Ç°Ä¿Â¼Öв鿴ÏîÄ¿£¬ÔÚ Desktop Ŀ¼Öй¹½¨¡£Èç¹ûÄãʹÓõÄÊÇ
Windows£¬½Å±¾ÄÚÈÝÐèҪһЩϸ΢µÄ¸üС£
ÉùЧÆ÷ĿǰÊÇ 100MB ´óС£¬²»Òªµ£ÐÄ£¬µ±ÄãѹËõËüÖ®ºó£¬ËùÕ¼¿Õ¼ä»á¼õ°ë¡£
Èç¹ûÄã¶Ô´Ë»¹Óиü´óµÄ¼Æ»®£¬¿ÉÒÔ¿´¿´ electron-builder£¬ËüÊǸù¾Ý electron-packager
¹¹½¨³öµÄÓ¦Óôò°üÔÙ×ö×Ô¶¯°²×°µÄ´¦Àí¡£
Ìí¼ÓÆäËûµÄÌØÐÔ
ÏÖÔÚÄã¿ÉÒÔ³¢ÊÔ¿ª·¢±ðµÄ¹¦ÄÜÁË¡£
ÕâÀïÓÐһЩ·½°¸£¬¿ÉÒÔÆô·¢ÄãµÄÁé¸Ð£º
1.Ó¦ÓõÄʹÓÃÊֲᣬ˵Ã÷ÁËÓÐÄÇЩ¿ì½Ý¼üºÍÓ¦ÓÃ×÷Õߣ¬
2.ÔÚÓ¦ÓÃÖиøÊ¹ÓÃÊÖ²áÌí¼ÓÒ»¸öͼ±êºÍ²Ëµ¥Èë¿Ú£¬
3.¹¹½¨Ò»¸ö´ò°ü½Å±¾£¬ÓÃÓÚ¿ìËÙ¹¹½¨ºÍ·Ö·¢£¬
4.ʹÓÃ* node-notifier *Ìí¼ÓÒ»¸öÌáʾϵͳ£¬¸æËßÓû§ÕýÔÚ²¥·ÅÄÄÒ»¸öÉùÒô£¬
5.ʹÓÃ* lodash *ÈÃÄãµÄ´úÂë¸ü¼Ó¸É¾»¡¢¾ßÓиüºÃµÄÀ©Õ¹ÐÔ£¬
6.ÔÚ´ò°ü֮ǰ²»ÒªÍüÁËѹËõÄãµÄ CSS ºÍ JavaScript£¬
7.½áºÏÉÏÎÄÌáµ½µÄ* 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 ¿Í»§¶Ë£¨Ê¹Óà Google µÄ¹Ù·½ Node.JS
¿Í»§¶Ë¿â£¿£©
|