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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Electron: ´ÓÁ㿪ʼдһ¸ö¼Çʱ¾app
 
×÷ÕߣºMandarava
  2467  次浏览      28
  2020-3-24
 
±à¼­ÍƼö:
±¾ÎÄÊǸöÈëÃż¶±Ê¼Ç£¬ÎÄÕÂÊÇ»ùÓÚWindowsµÄ¿ª·¢¹ý³Ì,¶ÔÏîÄ¿½øÐл·¾³ÅäÖÃÓë´î½¨£¬Ï£Íû¶ÔÄúÄÜÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚ¼òÊ飬,ÓÉ»ðÁú¹ûÈí¼þAlice±à¼­ÍƼö¡£

Electron½éÉÜ

¼òµ¥À´Ëµ£¬Electron¾ÍÊÇ¿ÉÒÔÈÃÄãÓÃJavascript¡¢HTML¡¢CSSÀ´±àдÔËÐÐÓÚWindows¡¢macOS¡¢Linuxϵͳ֮ÉϵÄ×ÀÃæÓ¦ÓõĿ⡣±¾ÎĵÄÄ¿µÄÊÇͨ¹ýʹÓÃElectron¿ª·¢Ò»¸öÍêÕûµ«¼òµ¥µÄСӦÓ㺼Çʱ¾£¬À´ÌåÑéÒ»ÏÂÕâ¸öÉñÆ÷µÄ¿ª·¢¹ý³Ì¡£±¾ÎÄÓÌÈçHello WorldÒ»ÑùµÄ´æÔÚ£¬ÊǸöÈëÃż¶±Ê¼Ç£¬µ«Èç¹ûÄã֮ǰ´Óδ½Ó´¥¹ýElectron£¬¶øÓÖ¶ÔËüÓÐÐËȤ£¬Ä³ÏëÐÅÕâ»áÊÇһƪֵµÃÒ»¿´µÄÈëÃŽ̡̳£

PS£ºÕâÆªÎÄÕÂÊÇ»ùÓÚWindowsµÄ¿ª·¢¹ý³Ì£¬Î´¶ÔmacOS¡¢Linux×÷²âÊÔ¡£

¿ª·¢»·¾³°²×°

°²×°Node.js

µã»÷ ÕâÀï ½øÈë¹ÙÍøÏÂÔØ¡¢°²×°¡£

°²×°cnpm

ÓÉÓÚÖÚËùÖÜÖªµÄÔ­Òò£¬ÄãÐèÒªÒ»¸öcnpm´úÌænpm£¬ÕâÀï ÊǹÙÍø¡£°²×°ÃüÁ´ò¿ªÏµÍ³µÄcmd.exeÀ´Ö´ÐÐÃüÁ£º

npm install -g cnpm --registry=https://registry.npm.taobao.org

°²×°Electron

cnpm install -g electron

°²×°Electron-forge

ÕâÊÇÒ»¸öÀàËÆÓÚɵ¹Ï¿ª·¢°üµÄElectron¹¤¾ßÕûºÏÏîÄ¿¡£¾ßÌå½éÉܵã»÷ ÕâÀï¡£

cnpm install -g electron-forge

н¨ÏîÄ¿

¼ÙÉèÏîĿҪ·Åµ½H:\ElectronĿ¼Ï£¬ÏîÄ¿ÃûΪnotepad£¨×Öĸȫ²¿Ð¡Ð´£¬¶à¸öµ¥´ÊÖ®¼ä¿ÉÒÔÓá°-¡±Á¬½Ó£©¡£

´ò¿ªcmd.exe£¬Ò»Â·cdµ½H:\Electron¡££¨Ò²¿ÉÒÔÔÚElectronÎļþ¼ÐÏ£¬°´×¡Shift¼ü²¢ÓÒ¼üµ¥»÷¿Õ°×´¦£¬Ñ¡ÔñÔÚ´Ë´¦´ò¿ªÃüÁî´°¿ÚÀ´Æô¶¯cmd.exe¡££©

Ö´ÐÐÏÂÃæµÄÃüÁîÀ´Éú³ÉÃûΪnotepadµÄÏîÄ¿Îļþ¼Ð£¬Í¬Ê±°²×°ÏîÄ¿ËùÐèÒªµÄÄ£¿é¡¢ÒÀÀµÏîµÈ¡£

electron-forge init notepad

cdµ½notepadĿ¼Ï£¬Ö´ÐÐÏÂÃæµÄÃüÁîÀ´Æô¶¯app£¨Ò²¿ÉÒÔ¼òµ¥µÄÓÃnpm startÀ´ÔËÐУ©¡£

electron-forge start

ÕâÑù¾Í¿ÉÒÔ¿´µ½»ù±¾µÄapp½çÃæÁË¡£

app½çÃæ

Ä£°åÎļþ

ÕâÀïijʹÓÃVisual Studio CodeÀ´¿ª·¢app¡£

½«notepadÎļþ¼ÐÕû¸öÍϵ½VS CodeÖдò¿ª£¨»òÕßµã²Ëµ¥Îļþ-´ò¿ªÎļþ¼ÐÑ¡ÔñnotepadÎļþ¼Ð´ò¿ªÏîÄ¿£©£¬¿ÉÒÔ¿´Ò»ÏÂÏîÄ¿µÄĿ¼½á¹¹£ºnode_modulesÎļþ¼ÐÏÂÊǸ÷ÖÖÄ£¿é¡¢Àà¿â£¬srcÏÂÊÇappµÄÔ´´úÂëÎļþ£¬package.jsonÊÇÃèÊö°üµÄÎļþ¡£

¿´Ò»ÏÂpackage.json£¬×¢ÒâÕâÀïĬÈÏÒѾ­½«Ö÷½ø³ÌÈë¿ÚÎļþÅäÖÃΪindex.js£¨¶ø²»ÊÇmain.js£©¡£

Ϊ±ÜÃâºóÃæ»ìÂÒ£¬Ä³»¹Êǽ«ÕâÀïµÄsrc/index.js¸Ä³Ésrc/main.js£¬Í¬Ê±Ò²Òª½«Îļþindex.js¸ÄÃûΪmain.js¡£

¿´Ò»ÏÂmain.js£¬ÕâÊÇappÖ÷½ø³ÌµÄÈë¿Ú£¬ÔÚÕâÀï´´½¨ÁËmainWindowä¯ÀÀÆ÷´°¿Ú£¬Ê¹Óà mainWindow .loadURL ("file://${__dirname} /index.html" ) À´¼ÓÔØindex.htmlÖ÷Ò³£»Ê¹ÓÃmainWindow .webContents .openDevTools() À´´ò¿ª¿ª·¢Õß¹¤¾ßÓÃÓÚµ÷ÊÔ£¨Õâ¸ö²Ù×÷ͨ³£ÔÚ·¢²¼appʱɾ³ý£©¡£È»ºóÊÇappµÄʼþ´¦Àí£º

ready: µ±ElectronÍê³É³õʼ»¯ºó´¥·¢£¬ÕâÀï³õʼ»¯ºó¾Í»áÈ¥´´½¨ä¯ÀÀÆ÷´°¿Ú²¢¼ÓÔØÖ÷Ò³Ãæ¡£

window-all-closed: µ±ËùÓÐä¯ÀÀÆ÷´°¿Ú±»¹Ø±Õºó´¥·¢£¬Ò»°ã´Ëʱ¾ÍÍ˳öÓ¦ÓÃÁË¡£

activate: µ±app¼¤»îʱ´¥·¢£¬Ò»°ãÕë¶ÔmacOSÒªÐèÒª´¦Àí¡£

¿´Ò»ÑÛindex.html£¬ÕâÊÇÖ÷Ò³Ãæ£¬³ýÁËÏÔʾWell hey there!!!µÄÐÅÏ¢Í⣬ûʲô¾ßÌåÄÚÈÝ¡£

ÓÚÊÇ£¬ÏÖÔÚÕû¸öappÖ»Óжþ¸öÔ´ÂëÎļþ£ºmain.jsºÍindex.html¡£main.jsÊÇÖ÷½ø³ÌÈë¿Ú£¬index.htmlÊÇÒ»¸öwebÒ³Ãæ£¬ËüÐèҪʹÓÃÒ»¸öä¯ÀÀÆ÷´°¿Ú£¨BrowserWindow£©À´¼ÓÔØºÍÏÔʾ£¬×÷ΪӦÓõÄUI£¬Ëü´¦ÔÚÒ»¸ö¶ÀÁ¢µÄäÖȾ½ø³ÌÖС£appÆô¶¯Ê±Ö´ÐÐmain.jsÖеĴúÂë´´½¨´°¿Ú£¬¼ÓÔØÒ³ÃæµÈ¡£Ö÷½ø³ÌÓëäÖȾ½ø³ÌÖ®¼ä²»ÄÜÖ±½Ó»¥Ïà·ÃÎÊ£¬ÐèҪͨ¹ýipcMainºÍipcRenderer½øÐÐIPCͨÐÅ£¨ Inter-process communication£©£¬»òÕßʹÓÃremoteÄ£¿éÔÚäÖȾ½ø³ÌÖÐʹÓÃÖ÷½ø³ÌÖеÄ×ÊÔ´£¨·´¹ýÀ´£¬ÔÚÖ÷½ø³ÌÖÐʹÓà webContents .executeJavascript ·½·¨¿ÉÒÔ·ÃÎÊäÖȾ½ø³Ì£©¡£

Notepad App¹¦ÄÜÉè¼Æ

ÕâÀォʵÏÖÒ»¸öÀàËÆÓÚWindowsµÄ¼Çʱ¾µÄApp¡£Õâ¸öApp¾ß±¸ÒÔϹ¦ÄÜ£º

Ö÷²Ëµ¥£º°üÀ¨File, Edit, View, HelpËĸöÖ÷²Ëµ¥¡£ÖصãÊÇFile²Ëµ¥ÏµÄÈý¸ö×Ӳ˵¥£ºNew£¨Ð½¨Îļþ£©¡¢Open£¨´ò¿ªÎļþ£©¡¢Save£¨±£´æÎļþ£©£¬ÕâÈý¸ö²Ëµ¥ÐèÒª×Ô¶¨Òåµã»÷ʼþ£¬ÆäËüµÄ²Ëµ¥»ù±¾Ê¹ÓÃÄÚ½¨µÄ·½·¨´¦Àí£¬ËùÒÔûʲôÄѶȡ£

Îı¾¿ò£ºÓÃÓÚÎı¾±à¼­¡£ÕâÒ²ÊÇÕâ¸öAppÉϵÄΨһһ¸ö×é¼þ£¬ËüµÄ¿íºÍ¸ß×Ô¶¯Æ½ÆÌÂúÕû¸ö´°¿Ú´óС¡£µ±ÐÞ¸ÄÁËÎı¾¿òÖеÄÎÄ×ֺ󣬻áÔÚApp±êÌâÀ¸ÉÏ×îÓÒ²àÌí¼ÓÒ»¸ö*ºÅÒÔ±íʾÎĵµÉÐδ±£´æ¡£

¼ÓÔØºÍ±£´æÎı¾£º¿ÉÒÔ´ò¿ª±¾µØÎı¾Îļþ£¬Ö§³Ö.txt, .js, .html, .mdµÈÎı¾Îļþ£»¿ÉÒÔ½«Îı¾ÄÚÈݱ£´æÎª±¾µØÎı¾Îļþ¡£ÔÚ´ò¿ª»òн¨Îļþǰ£¬Èç¹ûµ±Ç°ÎĵµÉÐδ±£´æ£¬»áÌáʾÓû§Ïȱ£´æÎĵµ¡£

Í˳ö³ÌÐò£ºÍ˳ö´°¿Ú»ò³ÌÐòʱ£¬»á¼ì²âµ±Ç°ÎĵµÊÇ·ñÐèÒª±£´æ£¬Èç¹ûÉÐδ±£´æ£¬ÌáʾÓû§±£´æ¡£

ÓÒ¼ü²Ëµ¥£ºÖ§³ÖÓÒ¼ü²Ëµ¥£¬¿ÉÒÔͨ¹ý²Ëµ¥ÓÒ¼üÖ´ÐÐһЩ»ù±¾µÄ²Ù×÷£¬È磺¸´ÖÆ¡¢Õ³ÌùµÈ¡£

ÏÂÃæÊÇÕâ¸ö¼Çʱ¾AppµÄÑÝʾЧ¹û£¬Ô´ÂëÏÂÔØµã»÷ ÕâÀï¡£

Notepad App¹¦ÄÜϸ½Ú

ÓÉÓÚÖ÷½ø³ÌÓëäÖȾ½ø³Ì²»ÄÜÖ±½Ó»¥Ïà·ÃÎÊ£¬ËùÒÔ²¿·Öϸ½ÚÓбØÒªÏÈ¿¼ÂÇÇå³þ¡£

Ö÷²Ëµ¥£ºÒòΪ²Ëµ¥Ö»´æÔÚÓÚÖ÷½ø³ÌÖУ¬ËùÒÔÔÚÖ´ÐÐÄ³Ð©Éæ¼°Ò³Ã棨äÖȾ½ø³Ì£©µÄ²Ëµ¥ÃüÁîʱ£¬±ÈÈçOpen£¨´ò¿ªÎļþ£©ÃüÁ¾ÍÐèÒªÓëäÖȾ½ø³Ì½øÐÐͨÐÅ£¬Õâ¿ÉÒÔʹÓÃipcMainºÍipcRendererÀ´ÊµÏÖ¡£

ÓÒ¼ü²Ëµ¥¡¢¶Ô»°¿ò£ºËùνÓÒ¼ü²Ëµ¥ÆäʵºÍÖ÷²Ëµ¥²¢ÎÞ·Ö±ð£¬Ö»ÊÇÏÔʾ·½Ê½²»Í¬¡£ÓÉÓڲ˵¥¡¢¶Ô»°¿òµÈ¶¼Ö»´æÔÚÓÚÖ÷½ø³ÌÖУ¬ÒªÔÚäÖȾ½ø³ÌÖÐʹÓÃËüÃÇ£¬¾ÍÐèÒªÏòÖ÷½ø³Ì·¢Ëͽø³Ì¼äÏûÏ¢£¬Îª¼ò»¯²Ù×÷£¬ElectronÌṩÁËÒ»¸öremoteÄ£¿é£¬¿ÉÒÔÔÚäÖȾ½ø³ÌÖе÷ÓÃÖ÷½ø³ÌµÄ¶ÔÏóºÍ·½·¨£¬¶øÎÞÐèÏÔʽµØ·¢Ëͽø³Ì¼äÏûÏ¢£¬ËùÒÔÕâÒ»²¿·Ö¿ÉÒÔÓÉËüÀ´ÊµÏÖ¡£PS£º¶ÔÓÚ´ÓÖ÷½ø³Ì·ÃÎÊäÖȾ½ø³Ì£¨·´Ïò²Ù×÷£©£¬¿ÉÒÔʹÓà webContents.executeJavascript ·½·¨¡£

Í˳öʱ±£´æ¼ì²â£ºÓû§µã»÷´°¿ÚµÄ¹Ø±Õ°´Å¥£¬»òÕßµã»÷Exit²Ëµ¥¾Í»á¹Ø±Õ´°¿ÚÍ˳ö³ÌÐò¡£ÔÚÍ˳öʱ£¬ÓбØÒª¼ì²éÎĵµÊÇ·ñÐèÒª±£´æ£¬Èç¹ûÉÐδ±£´æ¾ÍÌáʾÓû§±£´æ¡£ÒªÊµÏÖÕâһЧ¹û£¬Ê×ÏÈ£¬ÔÚÖ÷½ø³Ì¼à²âµ½Óû§¹Ø±Õ´°¿Úʱ£¬ÏòäÖȾ½ø³Ì·¢ËÍÒ»¸öÌØ¶¨µÄÏûÏ¢±íÃ÷´°¿Ú×¼±¸¹Ø±Õ£¬äÖȾ½ø³Ì»ñµÃ¸ÃÏûÏ¢ºó²é¿´ÎĵµÊÇ·ñÐèÒª±£´æ£¬Èç¹ûÐèÒª¾Íµ¯´°ÌáʾÓû§±£´æ£¬Óû§±£´æ»òÈ¡Ïû±£´æºó£¬äÖȾ½ø³ÌÔÙÏòÖ÷½ø³Ì·¢ËÍÒ»¸öÏûÏ¢±íÃ÷¿ÉÒԹرճÌÐòÁË£¬Ö÷½ø³Ì»ñµÃ¸ÃÏûÏ¢ºó¹Ø±Õ´°¿ÚÍ˳ö³ÌÐò¡£Õâ¸ö¹ý³ÌÒ²ÓÉipcMainºÍipcRendererÀ´ÊµÏÖ¡£

Notepad AppµÄʵÏÖ

Õû¸öApp¹¦ÄܱȽϼòµ¥£¬×îÖÕʵÏÖºóÒ²Ö»Óõ½ÁËÈý¸öÖ÷ÒªÎļþ£¬°üÀ¨£ºmain.js£¬index.html£¬index.js¡£

main.js

ÕâÊÇÖ÷½ø³ÌµÄÈë¿Ú£¬ÔÚÕâÀï´´½¨App´°¿Ú£¬Éú³É²Ëµ¥£¬ÔØÈëÒ³ÃæµÈ¡£ÏÂÃæÊǸÃÎļþµÄÍêÕûÔ´Â룬¶þ¸ö//-------Ö®¼äÊÇij¸ù¾Ý¹¦ÄÜÐèÒªÌí¼ÓµÄ´úÂ룬ÆäÓàÊÇÄ£°å×Ô¶¯Éú³ÉµÄ´úÂë¡£

import { app, BrowserWindow } from 'electron';

import { Menu, MenuItem, dialog, ipcMain } from 'electron';
import { appMenuTemplate } from './appmenu.js';
//ÊÇ·ñ¿ÉÒÔ°²È«Í˳ö
let safeExit = false;

// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let mainWindow;
const createWindow = () => {
// Create the browser window.
mainWindow = new BrowserWindow({
width: 800,
height: 600,
});
// and load the index.html of the app.
mainWindow.loadURL(`file://${__dirname}/index.html`);
// Open the DevTools.
//mainWindow.webContents.openDevTools();
//Ôö¼ÓÖ÷²Ëµ¥£¨ÔÚ¿ª·¢²âÊÔʱ»áÓÐÒ»¸öĬÈϲ˵¥£¬µ«´ò°üºóÕâ¸ö²Ëµ¥ÊÇûÓеģ¬ÐèÒª×Ô¼ºÔö¼Ó£©
const menu=Menu.buildFromTemplate(appMenuTemplate);
//´ÓÄ£°å´´½¨Ö÷²Ëµ¥
//ÔÚFile²Ëµ¥ÏÂÌí¼ÓÃûΪNewµÄ×Ӳ˵¥ menu.items[0].submenu.append(new MenuItem({
//menu.items»ñÈ¡ÊǵÄÖ÷²Ëµ¥Ò»¼¶²Ëµ¥µÄ²Ëµ¥Êý×飬menu.items[0]ÔÚÕâÀï¾ÍÊǵÚ1¸öFile²Ëµ¥¶ÔÏó£¬ÔÚÆä×Ӳ˵¥submenuÖÐÌí¼ÓеÄ×Ӳ˵¥
label: "New",click(){
mainWindow.webContents.send('action', 'new');
//µã»÷ºóÏòÖ÷Ò³äÖȾ½ø³Ì·¢ËÍ¡°Ð½¨Îļþ¡±µÄÃüÁî},
accelerator: 'CmdOrCtrl+N' //¿ì½Ý¼ü£ºCtrl+N}));
//ÔÚNew²Ëµ¥ºóÃæÌí¼ÓÃûΪOpenµÄͬ¼¶²Ëµ¥
menu.items[0].submenu.append(new MenuItem({
label: "Open",click(){
mainWindow.webContents.send('action', 'open');
//µã»÷ºóÏòÖ÷Ò³äÖȾ½ø³Ì·¢ËÍ¡°´ò¿ªÎļþ¡±µÄÃüÁî},
accelerator: 'CmdOrCtrl+O' //¿ì½Ý¼ü£ºCtrl+O}));
//ÔÙÌí¼ÓÒ»¸öÃûΪSaveµÄͬ¼¶²Ëµ¥
menu.items[0].submenu.append(new MenuItem({
label: "Save",click(){
mainWindow.webContents.send('action', 'save');
//µã»÷ºóÏòÖ÷Ò³äÖȾ½ø³Ì·¢ËÍ¡°±£´æÎļþ¡±µÄÃüÁî},
accelerator: 'CmdOrCtrl+S' //¿ì½Ý¼ü£ºCtrl+S}));
//Ìí¼ÓÒ»¸ö·Ö¸ô·û
menu.items[0].submenu.append(new MenuItem({
type: 'separator'}));
//ÔÙÌí¼ÓÒ»¸öÃûΪExitµÄͬ¼¶²Ëµ¥
menu.items[0].submenu.append(new MenuItem({
role: 'quit'}));
Menu.setApplicationMenu(menu); //×¢Ò⣺Õâ¸ö´úÂëÒª·Åµ½²Ëµ¥Ìí¼ÓÍê³ÉÖ®ºó£¬·ñÔò»áÔì³ÉÐÂÔö²Ëµ¥µÄ¿ì½Ý¼üÎÞЧ
mainWindow.on('close', (e) => {
if(!safeExit){
e.preventDefault();
mainWindow.webContents.send('action', 'exiting');}});
// Emitted when the window is closed.
mainWindow.on('closed', () => {
// Dereference the window object, usually you
would store windows
// in an array if your app supports multi windows,
this is the time
// when you should delete the corresponding element.
mainWindow = null;
});};
// This method will be called when Electron
has finished
// initialization and is ready to create browser
windows.
// Some APIs can only be used after this event
occurs.app.on('ready', createWindow);
// Quit when all windows are closed.
app.on('window-all-closed', () => {
// On OS X it is common for applications and
their menu bar // to stay active until the user
quits explicitly with Cmd + Q
if (process.platform !== 'darwin') {
app.quit();}
});
app.on('activate', () => {
// On OS X it's common to re-create a window in
the app when the
// dock icon is clicked and there are no other
windows open.
if (mainWindow === null) {
createWindow();}
});
// In this file you can include the rest of your a
pp's specific main process
// code. You can also put them in separate files and import them here.

//¼àÌýÓëäÖȾ½ø³ÌµÄͨÐÅ
ipcMain.on('reqaction', (event, arg) => {
switch(arg){case 'exit':
//×öµãÆäËü²Ù×÷£º±ÈÈç¼Ç¼´°¿Ú´óС¡¢Î»Öõȣ¬ÏÂ´ÎÆô¶¯Ê±×Ô¶¯Ê¹ÓÃÕâЩÉèÖ㻲»¹ýÒòΪÕâÀï £¨Ö÷½ø³Ì£©ÎÞ·¨·ÃÎÊlocalStorage£¬ÕâЩÊý¾ÝÐèҪʹÓÃÆäËüµÄ·½Ê½À´±£´æºÍ¼ÓÔØ£¬ÕâÀï¾Í²»×÷ÑÝʾÁË¡£ÕâÀïÍÆ¼öÒ»¸öÏà¹ØµÄ¹¤¾ßÀà¿â£¬¿ÉÒÔʹÓÃËüÔÚÖ÷½ø³ÌÖб£´æ¼ÓÔØÅäÖÃÊý¾Ý£ºhttps://github.com/sindresorhus/electron-store
//...
safeExit=true;
app.quit();//Í˳ö³ÌÐò
break;
}
});

Ê×ÏÈ£¬app.on('ready', createWindow)Ò²¾ÍÊǵ±ElectronÍê³É³õʼ»¯ºó£¬¾Íµ÷ÓÃcreateWindow·½·¨À´´´½¨ä¯ÀÀÆ÷´°¿ÚmainWindow£¨ÓëÖ÷½ø³ÌÖ»ÄÜÓÐ1¸ö²»Í¬£¬¿ÉÒÔ¸ù¾ÝÐèÒªÊÊʱ´´½¨¸ü¶à¸öä¯ÀÀÆ÷´°¿Ú£¬ÕâЩ´°¿ÚÓÉÖ÷½ø³Ì¸ºÔð´´½¨ºÍ¹ÜÀí£¬Ã¿¸öä¯ÀÀÆ÷´°¿ÚʹÓÃÒ»¸ö¶ÀÁ¢µÄäÖȾ½ø³Ì£»±¾ÎÄÖ»ÐèʹÓÃÒ»¸öä¯ÀÀÆ÷´°¿Ú£¬¼´mainWindow£©¡£Í¬Ê±£¬Ê¹ÓÃMenu.buildFromTemplate(appMenuTemplate) ͨ¹ýÒ»¸ö²Ëµ¥Ä£°åÀ´´´½¨appÓ¦ÓÃÖ÷²Ëµ¥£¬Ä£°å´úÂë´æ·ÅÔÚappmenu.jsÎļþÖУ¨Õâ¸öÎļþ°üº¬ÔÚ±¾ÎĵÄÔ´ÂëÖУ¬Ò²¿ÉÒÔµã»÷ÕâÀï²é¿´£©£¬Õâ¸öÄ£°åµÄд·¨¿ÉÒԲο¼¹Ù·½µÄ Electron API Demos

ÖÐCustomize MenusµÄÀý×Ó¡£Ä£°åµÄµÚÒ»¸ö²Ëµ¥ÊÇFile²Ëµ¥£¬ËüµÄ×Ӳ˵¥±»Éè¼Æ³É¿ÕµÄ£¬ÔÚÕâÀïʹÓà menu.items[0].submenu.append ·½·¨ÏòÕâ¸öFile²Ëµ¥Ìí¼ÓËĸö×Ӳ˵¥£¬·Ö±ðÊÇ£ºNew£¨Ð½¨Îĵµ£©£¬Open£¨´ò¿ªÎĵµ£©£¬Save£¨±£´æÎĵµ£©£¬Exit£¨Í˳ö³ÌÐò£©¡£ÆäÖУ¬Ç°Èý¸ö²Ëµ¥ÔÚµã»÷ºó¶¼»áÏòäÖȾ½ø³Ì·¢ËÍÐÅÏ¢£¬Í¨ÖªäÖȾ½ø³ÌÖ´ÐÐÏà¹Ø´¦Àí¡£Èç¶ÔÓÚNew²Ëµ¥£¬Ê¹ÓÃmainWindow.webContents.send ('action', 'new')µÄ·½Ê½£¬Í¨ÖªäÖȾ½ø³ÌҪн¨Ò»¸öÎĵµ¡£äÖȾ½ø³Ì»áʹÓÃipcRenderer.on·½·¨À´Ö´ÐмàÌý£¬¼àÌýµ½ÏûÏ¢ºó¾Í»áÖ´ÐÐÏàÓ¦´¦Àí£¨Õⲿ·ÖÔÚindex.jsÖÐʵÏÖ£©¡£×îºóʹÓà Menu.setApplicationMenu (menu) ½«Ö÷²Ëµ¥°²×°µ½ä¯ÀÀÆ÷´°ÌåÖУ¨ËùÓд°Ìå»á¹²ÏíÖ÷²Ëµ¥£©¡£

index.html

ÕâÊÇAppµÄÎı¾±à¼­Ò³Ãæ¡£Õâ¸öÒ³ÃæºÜ¼òµ¥£¬Õû¸öÒ³Ãæ¾ÍÖ»ÓÐÒ»¸öTextArea¿Ø¼þ£¨idΪtxtEditor£©£¬Æ½ÆÌÂúÕû¸ö´°¿Ú¡£¸ÃÒ³ÃæÊ¹ÓÃrequire('./index.js')ÔØÈëindex.js¡£

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Notepad</title>
<style type="text/css">
body,html{
margin:0px;
height:100%;
}

#txtEditor{
width:100%;
height:99.535%;
padding:0px;
margin:0px;
border:0px;
font-size: 18px;
}
</style>
</head>
<body>
<textarea id="txtEditor"></textarea>
</body>
<script>
require('./index.js');
</script>
</html>

index.js

ËùÓÐÖ÷Ò³Ãæindex.htmlÉæ¼°µ½µÄÒ³Ãæ´¦Àí¡¢ÓëÖ÷½ø³Ì½»»¥µÈµÄ²Ù×÷¶¼»á·Åµ½¸ÃjsÎļþÖС£¸ÃÎļþÍêÕû´úÂ룺

import { ipcRenderer, remote } from 'electron';
const { Menu, MenuItem, dialog } = remote;
let currentFile = null; //µ±Ç°Îĵµ±£´æµÄ·¾¶
let isSaved = true; //µ±Ç°ÎĵµÊÇ·ñÒѱ£´æ
let txtEditor = document.getElementById('txtEditor');
//»ñµÃTextAreaÎı¾¿òµÄÒýÓÃ
document.title = "Notepad - Untitled";
//ÉèÖÃÎĵµ±êÌ⣬ӰÏì´°¿Ú±êÌâÀ¸Ãû³Æ
//¸øÎı¾¿òÔö¼ÓÓÒ¼ü²Ëµ¥
const contextMenuTemplate=[
{ role: 'undo' }, //Undo²Ëµ¥Ïî
{ role: 'redo' }, //Redo²Ëµ¥Ïî
{ type: 'separator' }, //·Ö¸ôÏß
{ role: 'cut' }, //Cut²Ëµ¥Ïî
{ role: 'copy' }, //Copy²Ëµ¥Ïî
{ role: 'paste' }, //Paste²Ëµ¥Ïî
{ role: 'delete' }, //Delete²Ëµ¥Ïî
{ type: 'separator' }, //·Ö¸ôÏß
{ role: 'selectall' } //Select All²Ëµ¥Ïî
];
const contextMenu=Menu.buildFromTemplate(contextMenuTemplate);
txtEditor.addEventListener('contextmenu', (e)=>{
e.preventDefault();
contextMenu.popup(remote.getCurrentWindow());
});
//¼à¿ØÎı¾¿òÄÚÈÝÊÇ·ñ¸Ä±ä
txtEditor.oninput=(e)=>{
if(isSaved) document.title += " *";
isSaved=false;
};
//¼àÌýÓëÖ÷½ø³ÌµÄͨÐÅ
ipcRenderer.on('action', (event, arg) => {
switch(arg){
case 'new': //н¨Îļþ
askSaveIfNeed();
currentFile=null;
txtEditor.value='';
document.title = "Notepad - Untitled";
//remote.getCurrentWindow().setTitle("Notepad
- Untitled *");
isSaved=true;
break;
case 'open': //´ò¿ªÎļþ
askSaveIfNeed();
const files = remote.dialog.showOpenDialog(remote.getCurrentWindow(),
{
filters: [
{ name: "Text Files", extensions: ['txt', 'js', 'html', 'md'] },
{ name: 'All Files', extensions: ['*'] } ],
properties: ['openFile']
});
if(files){
currentFile=files[0];
const txtRead=readText(currentFile);
txtEditor.value=txtRead;
document.title = "Notepad - " + currentFile;
isSaved=true;
}
break;
case 'save': //±£´æÎļþ
saveCurrentDoc();
break;
case 'exiting':
askSaveIfNeed();
ipcRenderer.sendSync('reqaction', 'exit');
break;
}
});
//¶ÁÈ¡Îı¾Îļþ
function readText(file){
const fs = require('fs');
return fs.readFileSync(file, 'utf8');
}
//±£´æÎı¾ÄÚÈݵ½Îļþ
function saveText(text, file){
const fs = require('fs');
fs.writeFileSync(file, text);
}
//±£´æµ±Ç°Îĵµ
function saveCurrentDoc(){
if(!currentFile){
const file = remote.dialog.showSaveDialog(remote.
getCurrentWindow(), {
filters: [
{ name: "Text Files", extensions: ['txt', 'js', 'html', 'md'] },
{ name: 'All Files', extensions: ['*'] } ]
});
if(file) currentFile=file;
}
if(currentFile){
const txtSave=txtEditor.value;
saveText(txtSave, currentFile);
isSaved=true;
document.title = "Notepad - " + currentFile;
}
}
//Èç¹ûÐèÒª±£´æ£¬µ¯³ö±£´æ¶Ô»°¿òѯÎÊÓû§ÊÇ·ñ±£´æµ±Ç°Îĵµ
function askSaveIfNeed(){
if(isSaved) return;
const response=dialog.showMessageBox(remote.
getCurrentWindow(), {
message: 'Do you want to save the current document?',
type: 'question',
buttons: [ 'Yes', 'No' ]
});
if(response==0) saveCurrentDoc();
//µã»÷Yes°´Å¥ºó±£´æµ±Ç°Îĵµ
}

Ê×ÏÈ£¬Ç°ÃæËµÁË£¬ÔÚäÖȾ½ø³ÌÖв»ÄÜÖ±½Ó·ÃÎʲ˵¥£¬¶Ô»°¿òµÈ£¬ËüÃÇÖ»´æÔÚÓÚÖ÷½ø³ÌÖУ¬µ«¿ÉÒÔͨ¹ýremoteÀ´Ê¹ÓÃÕâЩ×ÊÔ´¡£

import { remote } from 'electron';
const { Menu, MenuItem, dialog } = remote;

È»ºó£¬const contextMenu = Menu .buildFromTemplate (contextMenuTemplate) ¼´Ê¹ÓÃcontextMenuTemplate Ä£°åÀ´´´½¨±à¼­Æ÷µÄÓÒ¼ü²Ëµ¥£¨ËäÈ»´´½¨¹ý³ÌÔÚäÖȾ½ø³ÌÖнøÐУ¬µ«Êµ¼ÊÉÏʹÓÃremoteÀ´´´½¨µÄ²Ëµ¥¡¢¶Ô»°¿òµÈ£¬ÈÔȻֻ´æÔÚÓÚÖ÷½ø³ÌÄÚ£©£¬ÓÉÓÚÕâÀïÉæ¼°µ½µÄ²Ëµ¥¶¼Ö»ÐèҪʹÓÃϵͳµÄÄÚ½¨¹¦ÄÜ£¬²»ÐèÒª×Ô¶¨Ò壬ËùÒÔÕâÀï±È½Ï¼òµ¥¡£Ê¹Óà txtEditor . addEventListener('contextmenu') À´¼àÌýÓÒ¼ü²Ëµ¥ÇëÇó£¬Ê¹Óà contextMenu.popup (remote.getCurrentWindow()) À´µ¯³öÓÒ¼ü²Ëµ¥¡£

txtEditor.oninputÓÃÓÚ¼à¿ØÎı¾¿òÄÚÈݱ仯£¬Èç¹ûÓиı䣬Ôò½«Îĵµ±ê¼ÇΪÉÐδ±£´æ£¬²¢ÔÚ±êÌâÀ¸×îÓÒ²àÏÔʾһ¸ö*ºÅ×÷ΪÌáʾ¡£

PS£ºÔÚWin7ÉÏÈç¹ûûÓÐÆôÓÃAeroЧ¹û£¬Ê¹ÓÃdocument.title = xxx»òremote.getCurrentWindow().setTitle(xxx) ¶¼¿´²»µ½³ÌÐò±êÌâÀ¸µÄ±êÌâ±ä»¯£¬Ö»µ±Äã±ÈÈçËõ·Åһϴ°¿ÚºóÕâ¸öÐ޸IJŻᱻˢС£

ipcRenderer.onÓÃÓÚ¼àÌýÓÉÖ÷½ø³Ì·¢À´µÄÏûÏ¢¡£Ç°ÃæËµ¹ý£¬Ö÷½ø³ÌʹÓÃmainWindow.webContents.send('action', 'new')µÄ·½Ê½ÏòäÖȾ½ø³Ì·¢ËÍÌØ¶¨ÏûÏ¢£¬äÖȾ½ø³Ì¼àÌýµ½ÏûÏ¢ºó£¬¸ù¾ÝÏûÏ¢ÄÚÈÝ×ö³öÏàÓ¦´¦Àí¡£±ÈÈ磬ÕâÀµ±Ö÷½ø³Ì·¢À´newµÄÏûÏ¢ºó£¬äÖȾ½ø³Ì¾Í¿ªÊ¼×ÅÊÖн¨Ò»¸öÎĵµ£¬ÔÚн¨Ç°»áʹÓÃaskSaveIfNeed·½·¨¼ì²âÎĵµÊÇ·ñÐèÒª±£´æ£¬²¢ÌáʾÓû§±£´æ£»¶ÔÓÚopenµÄÏûÏ¢¾Í»áµ÷ÓÃremote.dialog.showOpenDialogÀ´ÏÔʾһ¸öÎļþ´ò¿ª¶Ô»°¿ò£¬ÓÉÓû§Ñ¡ÔñÒª´ò¿ªµÄÎĵµÈ»ºó¼ÓÔØÎı¾Êý¾Ý£»¶ø¶ÔÓÚsaveÏûÏ¢¾Í»á¶Ôµ±Ç°Îĵµ½øÐб£´æ²Ù×÷¡£

Í˳öʱ±£´æ¼ì²âµÄʵÏÖ¹ý³Ì

ÕýÈçÇ°ÃæÔÚApp¹¦ÄÜϸ½ÚÖÐÌÖÂÛµÄÒ»Ñù£¬ÔڹرճÌÐòǰ£¬ÓѺõÄ×ö·¨ÊǼì²âÎĵµÊÇ·ñÐèÒª±£´æ£¬Èç¹ûÉÐδ±£´æ£¬Í¨ÖªÓû§±£´æ¡£ÒªÊµÏÖÕâÒ»¹¦ÄÜ£¬ÐèÒªÔÚÖ÷½ø³ÌºÍäÖȾ½ø³Ì¼ä½øÐÐÏ໥ͨÐÅ£¬ÒÔ»ñµÃ´°Ì幨±ÕºÍÎĵµ±£´æµÄÈ·ÈÏ£¬ÊµÏÖ°²È«Í˳ö¡£

Ö÷½ø³Ì¶Ë

Ê×ÏÈÔÚmain.jsÖУ¬Ê¹ÓÃmainWindow.on('close')À´¼à¿ØmainWindow´°¿ÚµÄ¹Ø±Õ¡£

mainWindow.on('close', (e) => {
if(!safeExit){
e.preventDefault();
mainWindow.webContents.send('action', 'exiting');
}
});

ÕâÀïsafeExit¿ª¹ØÓÃÓÚ±ê¼ÇäÖȾ½ø³ÌÊÇ·ñÒѾ­ÏòÖ÷½ø³Ì·´À¡ËüÒѾ­Íê³ÉËùÓвÙ×÷ÁË¡£Èç¹ûÉÐδ·´À¡£¬ÔòʹÓà e.preventDefault() ×èÖ¹´°¿Ú¹Ø±Õ£¬²¢Ê¹ÓÃmainWindow .webContents.send('action', 'exiting') ÏòäÖȾ½ø³Ì·¢ËÍÒ»¸öexitingÏûÏ¢£¬¸æËßäÖȾ½ø³Ì£ººÙ£¬ÎÒÒª¹Øµô´°¿ÚÁË£¬Äã¸Ï½ô¿´¿´»¹ÒªÊ²Ã´Ã»×öÍêµÄ£¬×öÍêºó֪ͨÎÒ¡£

¼ÈÈ»Ö÷½ø³ÌÒªµÈäÖȾ½ø³ÌµÄ·´À¡£¬¾ÍÐèÒª¼àÌýäÖȾ½ø³Ì·¢»ØµÄÏûÏ¢£¬ËùÒÔÖ÷½ø³ÌʹÓÃipcMain.onÀ´Ö´ÐмàÌý¡£Èç¹ûäÖȾ½ø³Ì·¢ËÍÒ»¸öexitÏûÏ¢¹ýÀ´£¬¾Í±íʾ¿ÉÒÔ°²È«Í˳öÁË¡£

ipcMain.on('reqaction', (event, arg) => {
switch(arg){
case 'exit':
safeExit=true;
app.quit();
break;
}
});

äÖȾ½ø³Ì¶Ë

ÔÚäÖȾ½ø³ÌÕâ±ßµÄindex.jsÖУ¬ÔÚipcRenderer.on¼àÌý·½·¨ÖУ¬ÏàÓ¦µÄÓÐÒ»¸öÏûÏ¢´¦ÀíÊÇÕë¶ÔÖ÷½ø³Ì·¢À´µÄexitingÏûÏ¢µÄ£¬µ±»ñÖªÖ÷½ø³Ì×¼±¸¹Ø±Õ´°¿Ú£¬äÖȾ½ø³Ì¾ÍÏÈÈ¥¼ì²éÎĵµÊÇ·ñ±£´æ¹ýÁË£¬Èç¹ûÉÐδ±£´æ¾Í֪ͨÓû§±£´æ£¬Óû§±£´æ»òÈ¡Ïû±£´æºó£¬Ê¹ÓÃipcRenderer.sendSync ('reqaction', 'exit') À´ÏòÖ÷½ø³Ì·¢ËÍÒ»¸öexitÏûÏ¢£¬±íʾ£ºÎÒÒª×öµÄ¶¼×öÍêÁË£¬ÄãÏëÍ˾ÍÍ˰ɡ£

case 'exiting':
askSaveIfNeed();
ipcRenderer.sendSync('reqaction', 'exit');
break;

Ö÷½ø³Ì¼àÌýµ½Õâ¸öÏûÏ¢ºó£¬½«safeExit±ê¼ÇΪtrue£¬±íʾÒѾ­µÃµ½äÖȾ½ø³ÌµÄÈ·ÈÏ£¬È»ºó¾Í¿ÉÒÔʹÓÃapp.quit()°²È«Í˳öÁË¡£µ±È»£¬ÔÚÍ˳öǰ£¬¿ÉÒÔÔÙÖ´ÐÐһЩÆäËü²Ù×÷£¨±ÈÈç±£´æ²ÎÊýÅäÖõȣ©¡£

±àÒë´ò°ü

¼üÈëÒÔÏÂÃüÁî½øÐбàÒë´ò°ü£º

npm run make

¸ÃÃüÁî»á½«Îļþ´ò°üµ½µ±Ç°ÏîĿĿ¼ÏµÄoutÎļþ¼ÐÏ¡£´ò°üºó·¢ÏÖ£¬Ô´ÂëÖ±½Ó±©Â¶ÔÚ[appÏîĿĿ¼] \ out\notepad-win32-x64\resources\app\src Ŀ¼Ï¡£

ÐÞ¸Äpackage.json£¬ÔÚ electronPackagerConfig ²¿·ÖÌí¼Ó"asar": true¡£

"electronPackagerConfig": {
"asar": true
}

ÖØÐ´ò°üºóÔ´ÂëÎļþ»á±»´ò°ü½øapp.asarÎļþÖУ¨¸ÃÎļþÈÔÈ»ÔÚsrcĿ¼Ï£©¡£

¿ÉÒÔÖ±½ÓÔËÐдò°üºóµÄnotepad.exeÆô¶¯³ÌÐò¡£

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

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

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

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