摘要:所以我们需要将打包成模块提供给进行调用。安装完之后我们执行,新建一个项目。需要注意的是编译的版本需要与运行的版本一致,否则会出现无法调用的情况。
前言
近段时间学习了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-forge electron-forge init my-new-project cd my-new-project electron-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 + Q if (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{ 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的各项工具和库都不是很成熟,所以大家再实践过程中会遇到各种问题,都可以评论到下面大家一起讨论。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/108960.html
摘要:前言在上一篇文章使用开发跨平台桌面应用一中,我们将结合起来,使用编写核心业务逻辑,并编译成库提供给的界面调用,但是在上一篇文章中发现遇到了很多问题,尤其是的版本和编译出来的版本必须要一致,否则会无法调用成功,这就很坑了,所以为了改变这一情况 前言 在上一篇文章使用Rust + Electron开发跨平台桌面应用 ( 一 )中,我们将Rust + Electron结合起来,使用Rust编...
摘要:杨冀龙是安全焦点民间白帽黑客组织核心成员,被浪潮之巅评为中国新一代黑客领军人物之一他在本文中依次分享了对于黑客的定义如何从黑客成为一名安全创业者技术创业踩过的坑给技术创业者建议等内容。 showImg(https://segmentfault.com/img/remote/1460000012377230?w=1240&h=796); 前端每周清单专注前端领域内容,以对外文资料的搜集为...
摘要:导读使用开发客户端程序已经有一段时间了,整体感觉还是非常不错的,其中也遇到了一些坑点,本文是从运行原理到实际应用对进行一次系统性的总结。一桌面应用程序桌面应用程序,又称为程序,但是和程序也有一些区别。就开发速度方面,比原生编译技术要快一些。 导读 使用Electron开发客户端程序已经有一段时间了,整体感觉还是非常不错的,其中也遇到了一些坑点,本文是从【运行原理】到【实际应用】对Ele...
摘要:以下内容来自我特别喜欢的一个频道这是一个年你成为前端,后端或全栈开发者的进阶指南你不需要学习所有的技术成为一个开发者这个指南只是通过简单分类列出了技术选项我将从我的经验和参考中给出建议首选我们会介绍通用的知识最后介绍年的的一些趋势基础前端开 以下内容来自我特别喜欢的一个Youtube频道: Traversy Media 这是一个2019年你成为前端,后端或全栈开发者的进阶指南: 你...
摘要:说起桌面应用,想必大家使用过的就已经海了去了。那么现在我们就来生成一个程序包吧最后生成的可执行程序出就现在了如下位置愉快的双击使用吧 说起桌面应用,想必大家使用过的就已经海了去了。什么暴风影音、QQ、skype之类的,早已不是新鲜事!不过大家有没有了解过如何编写一个桌面应用?历史上,我们都有哪些方式去编写桌面应用呢? 实际上,桌面应用的历史并不算久远,不去查找各种资料,仅凭记忆,我能想...
阅读 2026·2023-04-26 01:33
阅读 1658·2023-04-26 00:52
阅读 1034·2021-11-18 13:14
阅读 5392·2021-09-26 10:18
阅读 2900·2021-09-22 15:52
阅读 1487·2019-08-29 17:15
阅读 3016·2019-08-29 16:11
阅读 1037·2019-08-29 16:11