摘要:所以我們需要將打包成模塊提供給進行調用。安裝完之后我們執行,新建一個項目。需要注意的是編譯的版本需要與運行的版本一致,否則會出現無法調用的情況。
前言
近段時間學習了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的各項工具和庫都不是很成熟,所以大家再實踐過程中會遇到各種問題,都可以評論到下面大家一起討論。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/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之類的,早已不是新鮮事!不過大家有沒有了解過如何編寫一個桌面應用?歷史上,我們都有哪些方式去編寫桌面應用呢? 實際上,桌面應用的歷史并不算久遠,不去查找各種資料,僅憑記憶,我能想...
閱讀 2028·2023-04-26 01:33
閱讀 1660·2023-04-26 00:52
閱讀 1035·2021-11-18 13:14
閱讀 5394·2021-09-26 10:18
閱讀 2901·2021-09-22 15:52
閱讀 1488·2019-08-29 17:15
閱讀 3017·2019-08-29 16:11
閱讀 1039·2019-08-29 16:11