1.成果展现
2.前言
在当下流量简直被瓜分的背景下,如果说Web利用是从他人那里抢流量,那桌面利用和手机利用就是留住抢来的流量。Web利用裸露在搜索引擎下,所以能够通过网络营销链接不便疾速的引流web产品上。
然而桌面和手机利用是封闭式的,这样就又能够从本人Web产品上导流,通过独到益处的性能减少用户粘性。那么本人的一套简略的互联网生态圈就能够定型了,前期再凋谢商户端口进行商业化经营。所以有了Web和App或小程序外,桌面利用也很有必要。
3.Electron介绍
Electron是一个能让你应用传统前端技术(Nodejs, Javascript, HTML, CSS)开发一个跨平台桌面利用的框架。这里所说的桌面利用指的是在Windows、OSX及Linux零碎上运行的程序。
4.环境要求
(1). Node.js
(2). Cnpm
(3). Electron
(4). Visual Studio
(5). electron-packager 打包工具
5.编码
Electron的环境搭建网上也有很多,一下仅以开发案例阐明网络申请,主过程,渲染过程,窗口交互,利用的调试与打包等等。
(1). 创立窗口
const {app, BrowserWindow} = require('electron')const path = require('path')const url = require('url')const ipc = require('electron').ipcMain // 跳转主过程let mainWindow = null; // 主窗口function createWindow() { // 创立主窗口 mainWindow = new BrowserWindow({ width: 340, // 窗口宽度 height: 280, // 窗口高度 //frame: false, // 勾销window自带的敞开最小化等 resizable: false, // 禁止扭转主窗口尺寸 webPreferences: { nodeIntegration: true, // 解决在渲染层的其余js文件中呈现require无奈应用的状况【node的形式引入模块】 webSecurity: false, preload: path.join(__dirname, 'preload.js') } }) // 加载本地页面到利用中 mainWindow.loadFile('index.html') mainWindow.setMenu(null); // 敞开菜单栏 //mainWindow.webContents.openDevTools(); // 开启调试}
(2). 跳转窗口1——创立新窗口
// 渲染过程局部const ipc = require('electron').ipcRenderer // 用于跳转的// 1.点击按钮关上新窗口document.getElementById('target').onclick = function () { ipc.send('add');}// 渲染过程局部// 主过程局部const ipc = require('electron').ipcMain // 跳转主过程let newwin;ipc.on('add', () => { mainWindow.hide(); // 暗藏原窗口 newwin = new BrowserWindow({ width: 450, height: 400, resizable: false, parent: mainWindow, // win是主窗口[原窗口] webPreferences: { nodeIntegration: true, // 解决在渲染层的其余js文件中呈现require无奈应用的状况【node的形式引入模块】 webSecurity: false // 跨域 } }) newwin.setMenu(null); // 勾销原菜单 newwin.loadURL(path.join('file:', __dirname, './page/index.html')); //new.html是新开窗口的渲染过程 //newwin.webContents.openDevTools(); newwin.on('closed', () => { newwin = null })})// 主过程局部
(3). 跳转窗口2——替换本窗口页面
/* 渲染过程局部 */const ipc = require('electron').ipcRenderer // 用于跳转的// 点击按钮替换主过程页面URLdocument.getElementById('target').onclick = function () { ipc.send('load-page', 'file://' + __dirname + './page/index.html');}/* 渲染过程局部 *//* 主过程局部 */const ipc = require('electron').ipcMain // 跳转主过程// 不开新窗口/替换页面urlipc.on('load-page', (event, arg) => { mainWindow.loadURL(arg);});/* 主过程局部 */
(4). 网络申请——GET,POST
/* get申请 */function login_get(account, password) { let url = 'http://www.mytp5.com/index/user/login?account=' + account + '&password='+password; let request = net.request(url); request.on('response', (response) => { console.log(response.statusCode); console.log(response.headers); response.on('data', (chunk) => { console.log(JSON.parse(chunk.toString())); }) response.on('end', () => { console.log('end'); }) }) request.end();}/* get申请 *//* post申请 */function profile_post(userid) { let request = net.request({ method: 'POST', // 申请形式 protocol: 'http:', // 协定http / https hostname: 'www.mytp5.com', // 申请的域名 port: 80, // 端口 path: '/index/user/profile' // 申请的地址 }) request.on('response', (response) => { response.on('data', (chunk) => { let res = JSON.parse(chunk.toString()); let appendString = ''; // 追加数据 if (res.code == 200) { appendString = '<p>头像: <img src="' + res.data.avatar + '" style="width:50px;height:50px;border-radius:50px;" /></p>' + '<p> 姓名: ' + res.data.realname + '</p >' + '<p>年龄: ' + res.data.age + '</p>' + '<p>登录次数:' + res.data.login_count + '</p>' + '<p>最近登录:' + res.data.last_login + '</p>' + '<p>座右铭:' + res.data.content + '</p>'; } else { appendString = '<p>' + res.msg + '</p>'; } // 这里执行时还遇到过页面追加中文乱码,解决办法js文件和html文件确定全副保留为utf8 document.getElementById('profile_content').innerHTML = appendString; console.log(appendString); }) response.on('end', () => { //console.log('end'); }) }) // 申请参 let data = { userid: 11 }; // 搜寻能够间接搜“node.js 的request-promise模块”找答案 request.write(require('querystring').stringify(data)); request.end();}/* post申请 */
(5). electron中应用jquery解决办法。
<script>if (typeof module === 'object') { window.module = module; module = undefined; }</script> <!--jq解决方案--><script src="http://cdn.static.runoob.com/libs/jquery/2.1.1/jquery.min.js"></script><!--jq申请--><script type="text/javascript"> $("#login").click(function () { let url = 'http://www.mytp5.com/index/user/login'; var account = $('#account').val(); var password = $('#password').val(); $.ajax({ type: "POST", url: url, data: { account: account, password }, success: function (res) { if (res.code != 200) { alert(res.msg); return; } else { alert('登录胜利'); console.log(res.data); ipc.send('add'); } } }) }); </script><script src="./renderer.js"></script><script src="./static/js/index.js"></script><script>if (window.module) module = window.module;</script> <!--jq解决方案-->
(6). electron中应用css或禁止调整窗口和敞开默认菜单。
(7). 后盾接口局部,轻易测试写的。
6.文件打包
electron的打包会生成一个绿色软件装置目录,代码其实是齐全裸露在软件的一个资源文件中。加密混同网上也有其余解决方案,还一个是须要将绿色包打成exe安装包就须要应用Inno Setup Compiler的工具了。
(1).装置electron打包工具electron-packager
npm install electron-packager -g
(2).配置打包命令
"scripts": { "start": "electron .", "pack": "electron-packager . myClient --win --out ../myClient --arch=x64 --app-version=0.0.1 --electron-version=2.0.0"}
命令构造如下(依据理论状况批改):
“.”:须要打包的利用目录(即当前目录),
“myClient”:利用名称,
“--win”:打包平台(以Windows为例),
“--out ../myClient”:输入目录,
“--arch=64”:64位,
“--app-version=0.0.1”:利用版本,
“--electron-version=2.0.0”:electron版本
执行打包命令:
npm run pack
打包实现后,找到输入目录,关上打包实现后的文件夹。
(3). 下载安装Inno Setup
装置实现当前关上Inno Setup客户端
a. file->new,新建脚本
b.填写应用程序信息,黑体为必填项Application name: 利用名称;Application version:利用版本;Application publisher:发行单位(可选);Application websiter:应用程序网址(可选);
c.欠缺利用文件信息Application destination base folder:应用程序指标根本文件夹,可默认也可自定义;Application folder name:利用文件夹名称;Allow user to change the application folder:勾选,容许用户自定义装置地位;
d.指定属于应用程序的文件Application main executable file:应用程序主执行文件,即第8步中打包生成的.exe文件;Allow user to start the application after Setup has finished:容许用户在装置实现后启动应用程序;Add folders:增加应用程序文件,抉择第8步中打包出的文件根目录即可,要把所有.dll文件及其他配置文件都蕴含进去;
点击增加之后能够看到:
文件目录以本人的理论状况为准。e.指定应用程序的快捷方式,勾选默认的两项即可,即“创立主执行程序的快捷方式到公共开始菜单程序文件夹”、“容许用户创立桌面快捷方式”
f.指定装置期间要显示的文档文件License file:许可文件;Information file shown before installation:装置之前显示信息文件;Information file shown after installation:装置之后显示信息文件;
g.指定应包含的装置语言(汉化版的有简体中文选项),抉择之后点击下一步
h.指定根本编译设置Custom compiler output folder:自定义编译器输入文件夹,即最终编译出的安装包要放哪个地位;Compiler output base file name:编辑器输入根本文件名,即安装包名称;Custom Setup icon file:自定义安装程序图标文件;Setup password:装置明码;
i.点击下一步
剩下的就是一路确定了,会询问你在编译之前要不要保留你的脚本(下面的配置步骤,最终会生成一个编译脚本文件),点击保留,先不要编译,关上脚本文件,新增配置项,批改注册表,设置开机自启动:
[Registry]Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "testrun"; ValueData: "{app}\{#MyAppExeName}"
而后,执行编译文件:build->compile