使用Rust + Electron开发跨平台桌面应用 ( 一 )
前言
近段时间学习了Rust,一直想着做点什么东西深入学习,因为是刚学习,很多地方都不熟悉,所以也就不能拿它来做编译器这些,至于web开发,实际上我并不建议拿这个来学习一门语言,大概有几个方面,一是web开发的套路无非也就那么几个,对学习一门语言并不会有多大的帮助。二是web开发大多已经被封装了很多东西,对学习语言本身其实不利,真的要深入学习的话还是建议从语言本身出发,尽量不要用封装好的东西,当然,标准库除外。
为什么是Rust + Electron
原因其实很简单,我不想做太复杂的东西,因为大部分的精力还是要放在工作上,其次是希望做一个我日常能用的东西,当然现在还没想好,可能是个音乐播放器,也可能是个天气展示的app,这样我就可以每天使用了,这也会更有动力促使我开发好它。
Rust 和 Electron 想必就不用我多介绍了吧,至于为什么是这个组合可以查看知乎的这个问题,我赞同的是的方案是
使用 C/Cpp/Rust 开发的核心 + Electron / Qt 开发界面
本期目标
本期的目标非常简单,将Rust 和 Electron结合起来,使用Rust获取电脑cpu核数,Electron将数据绘制在界面上展示。
初始化Electron项目
Electron项目的初始化我用的工具是electron-forge,首先我们按照electron-forge的官网介绍来
npm install -g electron-forgeelectron-forge init my-new-projectcd my-new-projectelectron-forge start
解释一下,首先我们要安装electron-forge,这是一个脚手架工具,类似于Vue-cli。
然后我们初始化一个项目,项目名称为my-new-project。
需要注意的是这初始化的过程中electron-forge会构建package.json, 然后下载依赖,我第一次下载依赖的时候卡在了electron-runtime,第二次重试的时候就好了。
第二个是electron-forge中的依赖会对Python版本有要求,只能要求Python2,这里要注意的一点是,我十分不建议使用pyenv来控制Python版本,会出现以下错误,我的解决方式是使用virtualenv新建一个Python2 的环境。
Fatal Python error: PyThreadState_Get: no current thread
现在我们来看一下项目结构
整个项目结构非常简单,src中是我们的源文件,index.html是界面文件,index.js是界面逻辑文件,大家打开index.js就可以看到一段自动生成的代码,主要是创建了一个app,以及监听app的活动,需要注意到的是其中对mac的处理。
app.on('window-all-closed', () => {// On OS X it is common for applications and their menu bar// to stay active until the user quits explicitly with Cmd + Qif (process.platform !== 'darwin') {app.quit();}
});
好了,现在让我们把项目跑起来,在项目目录下执行electron-forge start命令,稍等一会我们就可以看到界面运行起来了
初始化Rust项目
在开发之前我们要知道,JS是无法直接运行Rust的,就像JS无法直接运行C++一样。所以我们需要将Rust打包成Node模块提供给JS进行调用。所以我们会使用neon来做到这件事,neon的github地址在这里
首先我们需要安装neon,注意,neon对python版本也是有要求的,如果你是mac,python版本必须要是Python2.7,不支持Python3,同样,这里也会出现上面说过的no current thread问题,所以我们在开发时最好用virtualenv新建一个Python2的环境。
安装完neon之后我们执行neon new thread-count,新建一个项目。看一下项目结构
lib是我们最终的导出文件,提供给electron进行调用,native下则是我们的rust代码,注意,这里的入口文件是native/src/lib.rs,因为我们建立的是一个库而不是一个可执行的应用程序。
让我们先编译项目,在文件目录下执行neon build --release命令。
让我们进入终端调用一下项目试试:
成功!到现在我们就成功的将rust写的代码封装成node库,使得JS可以进行调用了,接下来我们回到上面说过的,将rust的功能更改为获取CPU核数,然后将它封装成一个函数并进行导出。
首先我们要修改Cargo.toml,在[dependencies]下增加一个num_cpus = "1.4.0"的依赖项,
然后修改native/src/lib.rs文件如下
#[macro_use]
extern crate neon;use neon::prelude::*;fn thread_count(mut cx: FunctionContext) -> JsResult<JsNumber> {Ok(cx.number(num_cpus::get() as f64))
}register_module!(mut cx, {cx.export_function("thread_count", thread_count)
});
修改lib/index.js如下:
var addon = require('../native');module.exports = addon.thread_count;
然后我们再进行编译,执行neon build --release命令,然后再进入终端调用这个函数试试
成功啦,至此,我们就成功的将rust代码封装给JS进行了调用。需要注意的是编译rust的node版本需要与运行electron的node版本一致,否则会出现无法调用的情况。好了,到此第一期就结束了,代码我会抽空整理到github,以供有需要的同学查看。
效果
最后看一下效果图吧
ps: 现在Rust的各项工具和库都不是很成熟,所以大家再实践过程中会遇到各种问题,都可以评论到下面大家一起讨论。
使用Rust + Electron开发跨平台桌面应用 ( 一 )相关推荐
- 入坑 Electron 开发跨平台桌面应用
作为一个跨平台的桌面应用开发框架,Electron 的迷人之处在于,它是建立在 Chromium 和 Node.js 之上的 -- 二位分工明确,一个负责界面,一个负责背后的逻辑,典型的「你负责貌 ...
- app头像上传vue_Vue+Electron开发跨平台桌面应用实践
总篇43篇 2019年第17篇 背景 公司去年对 CDN 资源服务器进行了迁移,由原来的通过 FTP 方式的文件存储改为了使用 S3 协议上传的对象存储,部门内 @柴俊堃 同学开发了一个命令行脚本工具 ...
- Electron开发跨平台桌面应用
虽然 B/S 是目前开发的主流,但是 C/S 仍然有很大的市场需求.受限于浏览器的沙盒限制,网页应用无法满足某些场景下的使用需求,而桌面应用可以读写本地文件.调用更多系统资源,再加上 Web 开发的低 ...
- 使用XUL开发跨平台桌面应用
先上图: 现在使用html,css,js开发桌面的优势越来越明显了,硬件性能的不断提升,人力成本越发昂贵,用户对界面要求越来越高,全球化下企业间的竞争越发激烈.桌面软件50%+的工作量都在界面开发这一 ...
- 用JS开发跨平台桌面应用,从原理到实践
导读 使用Electron开发客户端程序已经有一段时间了,整体感觉还是非常不错的,其中也遇到了一些坑点,本文是从[运行原理]到[实际应用]对Electron进行一次系统性的总结.[多图,长文预警-] ...
- 使用Electron打造跨平台桌面应用
https://uinika.github.io/web/server/electron.html 早期桌面应用的开发主要借助原生 C/C++ API 进行,由于需要反复经历编译过程,且无法分离界面 ...
- php开发桌面应用程序_使用PHP开发跨平台桌面应用程序的3种方法
php开发桌面应用程序 PHP as a cross-platform desktop app development language? Blasphemy! Nonetheless, it's p ...
- 手把手教你使用Electron5+vue-cli3开发跨平台桌面应用
Electron是一个基于Chromium和 Node.js,可以使用 HTML.CSS和JavaScript构建跨平台应用的技术框架,兼容 Mac.Windows 和 Linux.虽然B/S是目前开 ...
- 跨平台桌面应用的开发框架——Electron
一.背景 在团队中,我们因业务发展,需要用到桌面端技术,如离线可用.调用桌面系统能力.什么是桌面端开发?一句话概括就是:以 Windows .macOS 和 Linux 为操作系统的软件开发.对此我们 ...
最新文章
- 关于IE记录Cookie的问题
- django中实现websocket
- PageStateLayout
- 基因表达式编程(GEP)自学 第【7】天 Python 实现
- 常见问题之Golang——verifying github.com/go-playground/assert/v2@v2.0.1/go.mod: checksum mismatch错误...
- HDU1922 POJ3004 Subway planning “神题”留名
- Error: [vuex] do not mutate vuex store state outside mutation handlers.
- 正好股票杠杆大盘在这个位置只有两个重要买点
- 汉明码纠错java_汉明码纠错的基本原理及优化解决方案
- PolSARpro v5.1.3 处理Sentinel-1A SLC数据
- go-stat-reporter(1):golang开发通用报表展示系统,设计数据结构
- mac微信备份位置macos手机微信备份的文件迁移走
- win10使计算机进入睡眠状态什么意思,技巧:如何在win10中进入睡眠模式计算机睡眠模式设置教程...
- 成考计算机科学与技术考试科目,计算机科学与技术本科自考有哪些科目
- 用邮件联系导师有哪些注意事项需要关注呢?如何选择适合自己的导师呢?
- 【C语言】文学研究助手
- 【监控施工项目必备】
- 第五届河南省CCPC河南省省赛题解+复盘
- Blender安装最新版本
- 多叉树的递归和非递归遍历
热门文章
- 微软职位内部推荐-Senior Software Engineer-Eco
- Windows7防火墙服务无法启用怎么办
- 制作安全网站的checklist
- 巧用CSS的alpha滤镜
- 绑定CPU逻辑核心的利器——taskset
- 朴素、Select、Poll和Epoll网络编程模型实现和分析——Select模型
- java 读取数据库结构_JAVA从SQLITE数据库中读取省份地市构造一棵树
- jsp java数据,jsp怎么遍历数据
- matlab 通过矩阵变换使图像旋转平移_图像的几何变换
- 4104 oracle 数据文件名,Oracle 11g 常遇到ora-01034错误,这是为什么?