Electron 可以让你使用纯 JavaScript 调用丰富的原生 APIs 来创造桌面应用。你可以把它看作是专注于桌面应用而不是 web 服务器的,io.js 的一个变体。这不意味着 Electron 是绑定了 GUI 库的 JavaScript。相反,Electron 使用 web 页面作为它的 GUI,所以你能把它看作成一个被 JavaScript 控制的,精简版的 Chromium 浏览器。以下的教程会帮你开始创建一个简单的项目。如果你只是想创建一个基础的 Hello World 的项目来初步了解 electron,那么可以忽略带 * 标题及其以下文本的内容。
node.js 下载链接:http://nodejs.cn/download/
根据自己的系统选择适当的安装包。
打开cmd,在里面输入 npm install --g electron-prebuilt
安装完成后运行 electron -v
检查是否安装成功,如果安装成功将会输出 electron 的版本号。
sublime text 3 下载连接:https://www.sublimetext.com/3
{ "name" : "your-app", "version" : "0.1.0", "main" : "main.js" }
const electron = require('electron'); const app = electron.app;//控制应用生命周期的模块 const BrowserWindow = electron.BrowserWindow;//创建原生浏览器窗口的模块 //保持一个对于 Window 对象的全局引用,不然,当 JavaScript 被 GC 时 Window 会被自动关闭 var mainWindow = null; // 当所有窗口被关闭了,退出 app.on('window-all-close',function() { //在 OS X 上,通常用户在明确地按下 cmd + Q 之前,应用会保持活动状态 if(process.platform != 'darwin') { app.quit(); } }); //当 Electron 完成了初始化并且准备创建浏览器窗口的时候,这个方法就被调用 app.on('ready',function() { //创建浏览器窗口 mainWindow = new BrowserWindow({width:800,height:600}); //加载应用的 index.html mainWindow.loadURL('file://E:/app/index.html'); //打开开发者工具 //mainWindow.openDevTools(); //当 window 被关闭,这个事件会被发出 mainWindow.on('close',function() { //取消引用 window 对象,如果你的应用支持多窗口的话,通常会把多个 window 对象存放在一个数组里面 mainWindow = null; }); });
当你创建了最初的 main.js, index.html 和 package.json 这几个文件,就可以尝试在本地运行并测试。
如果你已经用 npm 全局安装了 electron-prebuilt,只需要按照如下方式直接运行你的应用:输入 dos指令 进入你的项目所在目录,然后在输入 electron .
开始运行。
ipcMain 模块是类 EventEmitter 的实例,当在主进程中使用它的时候,它控制着由渲染进程(web page)发送过来的异步或同步消息,从渲染进程发送过来的消息将触发事件。发送消息,事件名为 channel
。回应同步消息, 可以设置 event.returnValue
。回应异步消息, 可以使用 event.sender.send(...)
。
const ipcMain = require('electron').ipcMain; ipcMain.on('asynchronous-message', function(event, arg) { console.log(arg); // prints "ping" event.sender.send('asynchronous-reply', 'pong'); }); ipcMain.on('synchronous-message', function(event, arg) { console.log(arg); // prints "ping" event.returnValue = 'pong'; });
const ipcRenderer = require('electron').ipcRenderer; //监听mian process里发出的message ipcRenderer.on('asynchronous-reply', function(event, arg) { alert(arg); // 在electron中web page里的console方法不起作用,因此使用alert作为测试方法=>prints "pong" }); ipcRenderer.send('asynchronous-message', 'ping');//在web page里向main process发出message
electron-packager <location of project> <name of project> <platform> <architecture> <electron version> <optional options>
location of project:项目所在路径。
name of project:打包的项目名字。
platform:确定了你要构建哪个平台的应用(Windows、Mac 还是 Linux)。
architecture:决定了使用 x86 还是 x64 还是两个架构都用。
electron version:electron 的版本。
optional options:可选选项。
"packager": "electron-packager ./ HelloWorld --all --out ./outApp --version 1.4.0 --overwrite --icon=./app/img/icon/icon.ico" //--all 可以换成 --platform=win32 --arch=ia32,其中 platform 是发布平台,arch=ia32 指32位windows 64位的则为x64。
npm run-script packager
。最终会在你指定的目录下生成打包后的文件:npm install -g asar
安装 asar。asar pack ./app app.asar
用 asar pack 打包。jQuery 等新版本的框架,在 Electron 中使用普通的引入的办法会引发异常,原因是 Electron 默认启用了 Node.js 的 require 模块,而这些框架为了支持 commondJS 标准,当 Window 中存在 require 时,会启用模块引入的方式。分别有以下几种解决方案:
//比如 jQuery 中的第一行代码中 !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)} //改成: !function(a,b){b(a)}
//在引入框架之前先输入下面的代码 <script> window.nodeRequire = require; delete window.require; delete window.exports; delete window.module; </script>
// In the main process. let win = new BrowserWindow({ webPreferences: { nodeIntegration: false } });
//置于引入 jQuery 之后 <script>if (typeof module === 'object') {window.jQuery = window.$ = module.exports;};</script>
刚开始看到页面跳转,大家一般会想到用 window.location.href = './index.html';
这样的代码。结果是可以跳转,但 DOM事件 基本都会失效。到最后还是使用的 electron 提供的 ipc 接口来创建新的窗口。
//在main.js中:: const ipc = require('electron').ipcMain; //进行监控,如果有new-window 发送过来,则重新创建一个窗口,文件是list.html ipc.on('new-window',function() { mainWindow.loadURL(url.format({ pathname: path.join(__dirname, '/views/list.html'), protocol: 'file:', slashes: true })) })