1.安装 node.js

进入Node官网下载node.js,安装,已经集成了npm就不需要重复安装了


2.配置环境变量

在命令行窗口输入 node -v 查看node是否安装成功;输入 npm -v 查看npm是否安装成功


3.安装 electron

g表示全局变量(系统环境)

已翻墙的可以直接通过npm指令安装,未翻墙的需要通过cnpm安装:

(1)安装cnpm


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

(2)通过cnpm安装electron


cnpm install -g electron


安装electron组件(node_modules)


cnpm install electron --save-dev



安装完成后 electron -v 查看是否安装成功

安装electron-packager


npm install -g electron-packager



4.创建electron程序

直接复制粘贴index.html 、app.js 、package.json 3个文件到程序文件夹中;

(1)package.json 如果没有现成的可以在命令窗口中进入程序文件夹中

cd f:\xx\xx\


然后 npm init 创建package.json文件;没有的直接回车过

创建好的文件需要再添加新的信息,直接复制进去(scripts):

"start": "electron ."


以下2个可加可不加,为electron版本号(生成文件的时候会用到)


"dependencies": {
    "electron-prebuilt": "^1.7.9"
  },
  "devDependencies": {
    "electron-prebuilt": "^1.7.9"
  },



{
  "name": "app",
  "version": "1.0.0",
  "description": "SUN",
  "main": "app.js",
  "dependencies": {
    "electron-prebuilt": "^1.7.9"
  },
  "devDependencies": {
    "electron-prebuilt": "^1.7.9"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "electron ."
  },
  "author": "SunXin",
  "license": "ISC"
}

(2)在app.js 中添加如下代码:


const {app, globalShortcut, BrowserWindow} = require('electron');
let win;
let windowConfig = {
    width:800,
    height:600
};
function createWindow(){
    win = new BrowserWindow(windowConfig);
    win.loadURL(`file://${__dirname}/index.html`);
    //开启调试工具
    win.webContents.openDevTools();
    //全屏
    win.setFullScreen(true);
    globalShortcut.register('ESC', () => {
        win.setFullScreen(false);
    });
    //关闭
    win.on('close',() => {
        //回收BrowserWindow对象
        win = null;
    });
    win.on('resize',() => {
        win.reload();
    })
}

app.on('ready',createWindow);
app.on('window-all-closed',() => {
    app.quit();
});

app.on('activate',() => {
    if(win == null){
        createWindow();
    }
});


作用如下:

第一行加载app ,以及BrowserWindow模块。
app模块是为了控制整个应用的声明周期而设计的,它可以监听很多的事件,做出相应的响应。
BrowserWindow模块可以创建一个窗体,目前我们需要这么多就行了。

然后声明了一个win变量,实际上我们可以把它看做窗体对象的引用。直到现在还没赋初始值。

let win;



紧接着我创建了一个窗体的配置JSON,内部指明了该窗体的大小(宽高)。

let windowConfig = {
    width:800,
    height:600
};



然后声明一个createWindow的函数用于创建窗体,在app模块被触发ready事件后执行。
内部为win变量进行赋值,它是一个BrowserWindow对象的实例。
win.loadURL用于加载一个html页面供显示,这里填入的是我上面创建的index.html。
当win被赋值为窗体对象后,对它的resize和close事件进行监听,意思是当窗体宽高大小发生变化后进行”重绘“,而close事件是监听窗体的关闭,当窗体被关闭时,令win = null,以便触发V8的GC机制时,回收掉BrowserWindow对象。


win = new BrowserWindow(windowConfig);
    win.loadURL(`file://${__dirname}/index.html`);
    //开启调试工具
    win.webContents.openDevTools();
    //全屏
    win.setFullScreen(true);
    globalShortcut.register('ESC', () => {
        win.setFullScreen(false);
    });
    //关闭
    win.on('close',() => {
        //回收BrowserWindow对象
        win = null;
    });
    win.on('resize',() => {
        win.reload();
    })



下面是app的事件监听
ready事件,当electron完成初始化时触发,并执行createWindow创建窗体。
window-all-closed ,当所有窗体都被关闭时触发,此时执行app.quit()用于结束整个应用。
activate ,当应用被激活时触发,此事件对于Mac用户很有用,比如DOCK上点击就相当于触发了activate事件,此时我们需要手动调用createWindow进行窗体创建。

app.on('ready',createWindow);
app.on('window-all-closed',() => {
    app.quit();
});

app.on('activate',() => {
    if(win == null){
        createWindow();
    }
})

PS:webstrom报错的话,在 设置-> 语言和构架-> JavaScript-> 设置为 ECMAScript6即可



5.webstrom运行程序:

视图 -> 工具窗口 -> Terminal (快捷键 alt+F12)

electron .  回车 即可


6.打包程序

命令行窗口进入到程序文件夹下,输入如下指令:

electron-packager . ProgramName --win --out ../ProgramApp --arch=x64 --version=1.0.0 --electron-version=1.7.9


对应的含义如下

electron-packager <应用目录> <应用名称> <打包平台> --out <输出目录> <架构> <应用版本>



至此,一个包含可执行的exe文件的程序就做好了



7.打包成一个可安装的 SetUp.exe 文件

需要用到NSIS来处理

(1)把程序生成一个 asar 文件,来代替 resources\app (程序源文件)

安装 asar

npm install -g asar


打包项目(在你的程序源文件下)

asar pack ./ app.asar


把生成的 app.asar 文件复制到已打包好的程序目录下的 resources 文件夹中,删除 app 源文件夹(为了打包成SetUp.exe时不出错误)


(2)使用NSIS进行打包

NSIS使用方法