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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ʹÓà Electron ¹¹½¨×ÀÃæÓ¦ÓÃ
 
×÷Õߣºkmokidd
  2509  次浏览      31
  2020-3-26
 
±à¼­ÍƼö:
±¾ÎÄÖ÷ÒªÖ¸µ¼¹¹½¨Ò»¸ö¼òµ¥µÄ×ÀÃæÓ¦Óã¬ÒÔ¼°Ê¹Óà 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£º

git checkout <tag-name>

ÎÒÃǽ«¸úËæÕâЩ 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 µÄ×÷ÓÃÊÇ£º

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 Îļþ£¬²¢Ð´ÈëÒÔÏÂÄÚÈÝ£º

<h1>Hello, world!</h1>

ÔÚÏîÄ¿µÄ¸ùĿ¼´´½¨ 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 Îļþ¡£

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

npm start

ÏÖÔÚãåÔ¡ÔÚÕâ¸ö 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 ½Ó¿Ú¸øÃ¿¸ö°´Å¥¶¼Ìí¼ÓÒ»¸öµã»÷ʼþ£¬Ê¹Ö®¿ÉÒÔ²¥·ÅÒôƵ£¬

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

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 ÖУº

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 ÎļþµÄ¶Áд¡£µ«Ê×ÏÈ£¬ÎÒÃÇÐèÒª½«Õâ¸öÄ£¿é°üº¬µ½ÏîÄ¿ÖÐÀ´£º

npm install --save nconf

ÕâÐÐÃüÁîÒâζ×Å 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"
}

½Ó×ÅÖ´ÐУº

npm run-script package

´ò°üÃüÁîÆô¶¯ÁË 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 ¿Í»§¶Ë¿â£¿£©

 
   
2509 ´Îä¯ÀÀ       31
Ïà¹ØÎÄÕÂ

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

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

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