基于Electron的桌面应用开发

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuanzhu007/article/details/78288698

一、环境搭建

1、安装node.js

如果你的机器上还没有Node.js和npm ,请安装它们。

2、安装electron

windows系统下直接在命令行输入

npm install -g electron-prebuilt

mac 系统需要在管理员权限下安装,输好密码就可以开始等他安装了

sudo npm install -g electron-prebuilt

全局安装后就可以在命令行使用 electron 工具,也可以通过 electron启动应用,当然也可以选择局部安装。

3、安装electron-packager

windows系统下:

npm install -g electron-packager

同样,mac系统需要在管理员权限下安装

sudo npm install -g electron-packager

4、安装vscode

推荐一款比较常用的编辑器:vscode

5、使用淘宝 NPM镜像

大家都知道国内直接使用 npm 的官方镜像是非常慢的,这里推荐使用淘宝 NPM 镜像。

淘宝NPM 镜像是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟一次以保证尽量与官方服务同步。

你可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:

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

这样就可以使用 cnpm 命令来安装模块了:

$ cnpm install [name]

 

二、简单开发

1、项目框架

参看官方的 demo ,一个 Electron 应用的目录结构大体如下:

app/

├── package.json

├── main.js

└── index.html

  • package.json

可以理解为 android 里面的 mainfest 文件,里面声明了程序的名称、简介、版本等信息;设置 Electron主进程运行的脚本(main.js),即设置程序的入口;设置快捷键,在你的 CLI(命令行)中可以用 electron . 方便地启动应用。可以看下面例子:

{
"name": "channel",
"version": "1.0.0",
"description": "This is a demo",
"main": "main.js",
"author": "leoleo",
"scripts":
    {
        "start":"electron ."
    }
}
  • main.js

这个文件是程序的入口,Electron 的主进程将用它来启动并创建桌面应用。

  •  index.html

这个文件就是我们要呈现出来的网页了。既可以使用本地的html,也可以使用远程的html。

2、踩坑记录

  • Electron 加载带 jquery的项目报错

solution: 详细解答可以查看这里

  • Electron使用网络请求

solution:原来也有很多库(superagent、bluebird)提供给我们使用的,使用方式方法也很简单。

三、打包发布

1、命令打包

electron-packager的打包基本命令是:

electron-packager <location of project> <name ofproject> <platform> <architecture> <electron version><optional options>

命令说明: 
* location of project
:项目所在路径 
* name of project:打包的项目名字 
* platform:确定了你要构建哪个平台的应用(Windows、Mac 还是 Linux) 
* architecture:决定了使用 x86 还是 x64还是两个架构都用 
* electron version:electron 的版本 
* optional options:可选选项

命令比较长,每次要是都用这个命令来打包会很烦,可以使用第二种方法;

2、脚本打包

首先在项目根目录下面的 package.json 里添加代码,

"packager": "electron-packager ./app HelloWorld--all --out ./OutApp --version 1.4.0 --overwrite --icon=./app/img/icon/icon.ico"

PS:这里要注意,字段里的 项目名字,version,icon路径要改成自己的;

然后,再使用命令 npm run-script packager 

四、electron调用C++动态链接库(dll)

1、Foreign Function Interface(FFI)

FFI的全称是Foreign FunctionInterface,该项目生来就是解决NodeJS的本地调用问题的,其流程就相当于Windows下的LoadLibrary()和GetProcAddress(),亦可以理解为NodeJS下的平台调用。有了它,本地调用变得异常简单,因为它在NodeJS环境中为JavaScript提供了一套强大的工具集用来调用动态链接库。

  • 环境配置

1)安装node-gyp

npm install -g node-gyp

装之前要安装python 2.7,而node-gyp不支持python 3.x,所以安装了多个版本python 的读者得留意一下自己当前的python 版本了。

2)安装ffi

npm install ffi

  • 简单开发
var FFI = require('ffi');
 

var user32 = new FFI.Library('user32', {

   'MessageBoxA':[ 'int32', [ 'int32', 'string', 'string', 'int32' ]]

});
 

var retCode = user32.MessageBoxW( 0, 'Node.JS!', 'Hello, World!', 1);

Library需要传入两个参数,第一个表示动态链接库的路径,不需要后缀;第二个参数是json,每个元素表示一个函数签名,依次为函数名、函数返回值,函数参数,可以同时加载多个函数,即对应多个元素。这两个参数可以用来指定加载哪个文件中的哪些函数。

注:ffi只能调用C风格的模块。即:ffi只能调用采用C导出的动态链接库。

2、C/C++ Addons

  •  环境配置

1)安装编译工具

npm install -g --production windows-build-tools

2)安装node-gyp

npm install -g node-gyp

  • 编写cc文件

1)   在cc文件中调用C++代码,在C++代码中调用dll

略。

2)   直接在cc文件中调用dll

  HINSTANCE hDLL;

  hDLL=LoadLibrary("dlldemo.dll");//加载动态链接库dlldemo.dll文件;

  typedef int(*pMax)(int a,int b);//函数指针

  pMax Max=NULL;

  Max=(pMax)GetProcAddress(hDLL,"Max");


  if (Max)

  {

     int ret=Max(99,100);    

  }

其中dlldemo.dll 里有个 Max 函数,求两个 int 整数的最大值。

  • 构建

1)编写binding.gyp文件

当源代码已被编写,它必须被编译成二进制 addon.node 文件。要做到这点,需在项目的顶层(和package.json同一级)创建一个名为 binding.gyp 的文件,它使用一个类似 JSON 的格式来描述模块的构建配置。 该文件会被 node-gyp(一个用于编译 Node.js 插件的工具)使用。

{

 "targets": [
    {
     "target_name": "addon",
     "sources": [ "hello.cc" ]
    }
  ]
}

2)node-gyp configure

当binding.gyp 文件已被创建,使用 node-gyp configure 为当前平台生成相应的项目构建文件。 这会在 build/ 目录下生成一个 Makefile 文件(Unix平台)或 vcxproj 文件(Windows平台)。

3)node-gyp build

调用 node-gyp build 命令生成编译后的 addon.node 的文件。 它会被放进 build/Release/ 目录。

Build的时候可能会出现一个奇怪的错误提示The system cannot find message text for message number 0x%1 in the message file for %2你就不能直接告诉我Wrong Architecture么……Don't panic,你需要重新编译一下:

node-gyp rebuild-target=1.4.13 -arch=ia32 -dist-url=https://atom.io/download/atom-shell (1.4.13是你用的 Electron版本号)

五、写在后面

Electron 结合了 ChromiumNode.js 和用于调用操作系统本地功能的 API(如打开文件窗口、通知、图标等)。

  • Chromium:Google创造的一个开源库,并用于 Google 的浏览器 Chrome。
  • Node.js(Node:一个用于在服务器运行 JavaScript的运行时(runtime),它拥有文件系统和网络的权限(你的电脑也可以是一台服务器!)。

Electron 应用就像 Node应用,它也依赖一个 package.json 文件。该文件定义了哪个文件作为主进程,并因此让 Electron 知道从何启动你的应用。然后主进程能创建渲染进程,并能使用 IPC让两者间进行消息传递。


Electron 的一个缺点是:即使你的应用是一个简单的时钟,但它也不得不包含完整的基础设施(如 ChromiumNode等)。因此,一般情况,打包后的程序至少会达到几十兆(根据系统类型进行浮动)。当你的应用越复杂,就越可以忽略这部分了。

众所周知,页面的渲染难免会导致『白屏』,而且这里采用了 Vue框架,情况就更加糟糕了。另外,Electron应用也避免不了『先打开浏览器,再渲染页面』的步骤。下面提供几种方法来减轻这种情况,以让程序更贴近原生应用。

1.    指定BrowserWindow的背景颜色;

2.    先隐藏窗口,直到页面加载后再显示;

3.    保存窗口的尺寸和位置,以让程序下次被打开时,依然保留的同样大小和出现在同样的位置上。

对于第一点,若程序的背景不是纯白(#fff)的,那么可指定窗口的背景颜色与其一致,以避免突变。

mainWindow = new BrowserWindow({
    title: 'Vanish',
    backgroundColor: '#f5f5f5',};

对于第二点,由于 Electron本质是一个浏览器,需要加载非网页部分的资源。因此,我们可以先隐藏窗口。

var mainWindow = new BrowserWindow({    
title: 'ElectronApp',
show: false,};

等到渲染进程开始渲染页面的那一刻,在 ready-to-show 的回调函数中显示窗口。

mainWindow.on('ready-to-show', 
function(){
    mainWindow.show();
    mainWindow.focus();
});

对于第三点,其实现方式,可参考4 must-know tips for building cross platform Electron apps

猜你喜欢

转载自blog.csdn.net/xuanzhu007/article/details/78288698