electron教程(一): electron的安装和项目的建立javascript
electron教程(番外篇一): 开发环境及插件, VSCode调试, ESLint + Google JavaScript Style Guide代码规范html
electron教程(番外篇二): 使用TypeScript版本的electron, VSCode调试TypeScript, TS版本的ESLint前端
electron教程(二): http服务器, ws服务器, 子进程管理java
electron教程(三): 使用ffi-napi引入C++的dllnode
electron教程(四): 使用electron-builder或electron-packager将项目打包为可执行桌面程序(.exe)jquery
此次, 咱们一块儿经过几个例子, 进一步了解node.js+electron.web
1. 搭建一个http服务器, 经过web对服务器进行访问
2. 搭建一个ws服务器, 经过web向服务器发送消息
3. 进程管理, 打开/关闭一个外部进程chrome
按步骤完成electron教程(一): electron的安装和项目的建立所介绍的内容.npm
确保你的cmd工做目录为项目根目录.后端
执行指令:
yarn add http-server --save
在main.js的最下方, 添加以下代码:
// http-server const httpServer = require('http-server'); httpServer.createServer().listen(8080);
在这段代码中:
咱们建立了一个httpServer
对象
const httpServer = require('http-server');
这个对象是经过http-server
模块建立出来的.
使用httpServer对象, 建立一个http服务器
, 而且监听了8080端口
.
服务器启动后, 用户就能够经过浏览器来访问咱们的服务器了.
执行指令:
npm start
在本身的浏览器中,访问http://localhost:8080/index.html
,就会获得本地的index.html文件
(这是chrome浏览器打开的效果)
node.js+electron教程(一): 安装nodejs和electron
确保你的cmd工做目录为项目根目录.
执行指令:
yarn add ws --save
在main.js的最下方, 添加以下代码:
// ws-服务器 const WebSocketServer = require('ws').Server; wss = new WebSocketServer({port: 12122}); wss.on('connection', (ws) => { // 有客户端链接时, 打印一条日志 console.log('client connected'); // 而且建立'message'监听 ws.on('message', (message) => { // 直接将消息打印出来 console.log(message); }); });
在这段代码中:
咱们建立了一个WebSocketServer
对象
const WebSocketServer = require('ws').Server;
这个对象是经过ws
模块建立出来的.
使用WebSocketServer
对象, 建立一个ws服务器
叫作wss
对象, 而且监听了12122端口
.
为wss对象的两个事件分别绑定了回调:
connection
事件, 有客户端链接时, 打印一条日志.
message
事件, 直接将消息打印出来.
在jquery官网下载jquery库, 将jquery.min.js
放在html目录
下的lib目录
中.
并在index.html的<head>
和</head>
块中, 添加以下代码:
<script type="text/javascript" src="./lib/jquery.min.js"></script>
在index.html的<body>
和</body>
块中的最下方, 添加以下代码:
<div class="vertical-center"> <div class="container"> <p> </p> <form role="form" id="chat_form" onsubmit="sendWsMessage(); return false;"> <div class="form-group"> <input class="form-control" type="text" name="message" id="message" placeholder="Type text to echo in here" value="" /> </div> <button type="button" id="send" class="btn btn-primary" onclick="sendWsMessage();"> Send! </button> </form> </div> </div>
在这段代码中:
咱们首先定义了一个输入框即表单form
, 该表单包含了input
元素, 用户能够在该输入框内填写字符, 而html能够经过message
来获取输入框内的字符.
接着咱们定义了一个按钮button
, 在网页中按钮显示为send!
, 并给该按钮的左键点击事件onclick
绑定了一个函数onclick="sendWsMessage();"
, 当用户左键点击这个send!
按钮, 就会触发sendWsMessage()
函数.
在index.html的<script>
和</script>
块中的最下方, 添加以下代码:
const ws = new WebSocket("ws://localhost:12122");
这段代码中:
咱们先实例化了一个websocket
对象ws
, 其参数为要链接的地址, 这里使用本机localhost的12122端口
, 若是你是在局域网内启动, 也能够将localhost
替换为你的内网ip.
在index.html的<script>
和</script>
块中的最下方, 添加以下代码:
function sendWsMessage() { ws.send($('#message').val()); }
这段代码中:
咱们调用了websocket对象ws
的send()
方法, 向目标地址localhost的12122端口
发送数据, 数据的内容是经过#message
获取的, 即用户在输入框
内输入的数据.
前端流程:
当用户点击
send!
按钮, 获取输入框
内的内容, 经过ws
, 向localhost的12122端口
发送.
执行指令:
npm start
此时的程序界面, 出现了输入框
和send!
按钮.
回到cmd中, 发现cmd打印了一条日志
client connected
那是由于咱们在ws服务器(main.js)中, 添加了以下代码:
wss.on('connection', (ws) => { // 有客户端链接时, 打印一条日志 console.log('client connected');
当程序启动的时候, 自动创建了链接, 因此打印了这条日志.
若是你已经完成了例子1, 而且尚未删除代码的话, 试着再次从浏览器中访问http://localhost:8080/index.html
, 是否又打印出了一条相同的日志?
如今, 咱们试试发送消息的功能:
在程序界面的输入框内, 输入一个
Hello electron!
, 点击send!
回到cmd中, 成功打印了日志Hello electron!
.
前端流程:
当用户点击
send!
按钮, 获取输入框
内的内容, 经过ws
, 向localhost的12122端口
发送.
后端流程:
当ws服务器收到消息的时候, 直接将消息打印出来.
node.js+electron教程(一): 安装nodejs和electron
在main.js中, 添加以下代码:
const myChildProccess = require('child_process'); // 打开一个子进程notepad++ const mySpawn = myChildProccess.spawn( 'e:\\Application\\Notepad++\\notepad++.exe');
在这段代码中:
咱们建立了一个myChildProccess
对象
const myChildProccess = require('child_process');
这个对象是经过child_process
模块建立出来的, 该模块主要用于建立子进程.
咱们调用这个对象的spwan()
方法, 启动一个子进程. 该方法接受一个字符串参数, 是子进程的路径, 注意路径的书写方式.
执行命令:
npm start
在程序启动后, notepad++也紧跟着启动了, notepad++就是本程序启动的子进程.
electron能够启动子进程, 天然也能够关闭子进程, 否则算什么进程管理?
如今咱们关闭程序, 继续进行下一步.
在index.html的<body>
和</body>
块中的最下方, 添加以下代码:
<button onclick="killChildProcess()">关闭子进程</button>
在这段代码中, 咱们添加了一个按钮button
, 在网页中按钮显示为关闭子进程
, 并给该按钮绑定了一个函数killChildProcess()
.
在html目录建立一个renderer.js文件
添加以下代码:
function killChildProcess() { // 发消息,由html的按钮调用,给主进程发消息,回调中关闭进程 const ipcRenderer = require('electron').ipcRenderer; ipcRenderer.send('kill-child-now', 'get async message'); }
咱们定义了关闭子进程
按钮的点击函数killChildProcess()
, 这个函数只有两行:
在函数的第一行, 建立了一个ipcRenderer
对象
const ipcRenderer = require('electron').ipcRenderer;
这个对象是经过ipcRenderer
模块建立出来的, w3cschool是这样解释的:
ipcRenderer 模块是一个 EventEmitter 类的实例. 它提供了有限的方法,你能够从渲染进程向主进程发送同步或异步消息. 也能够收到主进程的响应.
简单的说, main.js是主进程
, renderes.js是渲染进程
, 在渲染进程调用ipcRenderer.send()
方法, 能够发送消息. 在主进程能够收到消息, 若是你给这个消息绑定了回调, 收到消息后, 就会触发回调.
在函数的第二行, 咱们发送了kill-child-now
消息.
如今咱们把renderer.js引入到项目之中
和jquery
类似, 在index.html的<head>
和</head>
块中, 添加以下代码:
<script type="text/javascript" src="../dist/renderer.js"></script>
在main.js的最下方, 添加以下代码:
// 监听消息, 关闭子进程 const ipcMain = require('electron').ipcMain; ipcMain.on('kill-child-now', (e, appUrl)=>{ // 收到消息, 关闭进程 mySpawn.kill(); });
在这段代码中:
咱们建立了一个ipcMain
对象
const ipcMain = require('electron').ipcMain;
这个对象是经过ipcMain
模块建立出来的, w3cschool是这样解释的:
ipcMain 模块是类 EventEmitter 的实例.当在主进程中使用它的时候,它控制着由渲染进程(web page)发送过来的异步或同步消息.从渲染进程发送过来的消息将触发事件.
简单的说, ipcMain
是使用在主进程中的, 负责监遵从渲染进程中发送出来的消息.
( 还记得吗? 渲染进程是经过ipcRenderer
发送消息的. )
咱们用ipcMain对象监听了消息kill-child-now
, 而且绑定了一个回调函数. 一旦收到这个消息, 就会触发这个回调函数.
回调函数只有一行, 简单直接:
mySpawn.kill( )
关闭在第三步中建立的子进程notepad++.
执行命令:
npm start
和以前的测试同样, 在程序启动后, notepad++也紧跟着启动了, notepad++就是本程序启动的子进程.
不同的是, 程序界面上出现了一个按钮关闭子进程
.
点击这个按钮试试看!