您可以在此處找到本系列的第二篇文章(「部署您的第一個 Rust 應用程式」)。

鐵鏽則不同。您可以在周末學習 Python 或 Ruby,建立第一個 CRUD 應用程式並對結果感到滿意。

使用 Rust……使用 Rust,您將很難將字串傳遞給不同的方法,更改並返回它。然後,您將訂購 Rust 書,查看其大小,嘆氣並開始。

下班後花了幾週讀完這本書,你放棄了,等待別人建立一個易於理解的教程。

這是您的“簡單”教程

我也遇到了同樣的問題。然而,生活環境給了我幾個月的時間來真正專注於 Rust。

以下是第一個概述、概念和遵循的路徑。在接下來的幾週和幾個月裡,我將發布一系列文章來幫助您從概念到產品。

NodeJS 與 Rust

安裝它們後(在本例中我為 macOS 選擇了brew,方法並不重要),底層堆疊看起來有所不同。 NodeJS 需要 V8(來自 Google 的執行時間引擎)並綁定到 JavaScript 程式庫來執行 JavaScript 程式碼。

Rust 幾乎完全依賴 Rust 本身。只是編譯器使用llvm函式庫,它們是用 C 和 C++ 寫的。

os_difference_node_rust

Rust 中有多少「網路」?

過去和現在都是一個設計決定,不在 Rust 中包含標準 http 函式庫。因此,OSI 層的覆蓋方式有所不同:

osi_layer_rust_node

Node 涵蓋了整個堆疊,並與 Koa 和 Express 一起提供了兩個眾所周知且「堅如磐石」的 Web 框架,可協助您在 HTTP 之上建立應用程式。

在 Rust 方面,Rust Core 中僅實作了TCP 。目前的 Web 框架( actixRocket )正在實作 HTTP 之前的所有內容。所以你不需要關心它來自哪裡。

如果你想要使用純 HTTP 呼叫而不需要任何更大的框架,你可以安裝實作 HTTP 協定的「crates」(相當於 Node 世界中的 npm 套件)(如hypertiny_http )。

npm 與貨物

Node 使用 npm 進行套件管理:

  • npm install正在安裝依賴項

  • npm run xyz正在package.json中執行腳本

在 Rust 方面, cargo正在處理與您的專案相關的所有內容

  • cargo new NAME --bin正在建立一個應用程式

  • cargo new NAME --lib建立一個庫

  • cargo run正在執行程式碼

  • cargo build正在建立一個可執行文件

  • cargo test正在執行專案內的所有測試

有一個開放的PR來加入cargo add來安裝依賴項。現在您必須手動將它們新增至您的Cargo.toml檔案中。如您所見,您不需要在package.json中包含腳本來執行測試或建置和測試應用程式。

心態改變:Cargo 會在cargo run後取得包,且版本會改變。因此,第一次它將獲取所有包,第二次將在版本號發生更改時獲取。與npm i不同的是,它會立即獲取包,並將其加入到帶有save符號的package.json中。

生態系統

節點無緣無故沒有成功。生態系豐富、繁榮。 Rust 仍在開發中,但已經有很多很棒的「板條箱」。網站arewewebyet.org正在追蹤進度並向您展示 Rust 世界中有趣的軟體包。

也嘗試建立一個名為Tide的官方 Rust Web 框架。它已經相當成熟,可以用於副專案。請隨意貢獻並協助為 Rust 的 Web 開發打造一個良好的環境。

Asnyc 編程又稱 Promises 又稱 Futures

節點殺手級功能是 Promise。儘管並不總是易於理解和處理,但 Promise 和事件循環使 Node 如此有利可圖。

Rust 也實作了非同步機制,但尚未出現在最終版本中。它們被稱為期貨。一個名為Tokio的函式庫已經提供了非同步執行時。您可以在areweasyncyet上追蹤 Rust 非同步程式設計的進度。

如何開始?

  1. 安裝 Rust: curl https://sh.rustup.rs -sSf | sh

  2. 建立一個新專案: cargo new web-app --bin

  3. cd web-app

現在您可以選擇您喜歡的 Web 框架。您可以從Rocketactix開始。您可以按照網站上的教學來執行第一個 Web 應用程式。

注意:未定義、借用和類型

為了在我的下一篇文章之前不要感到沮喪,這裡有關於 Rust 的主要四件事,你必須習慣(一段時間後它們會變得非常棒)。

更新的請求範例

  1. 沒有未定義的。 Rust 沒有真正的空值。這是一個特點。 Rust 有一個名為Option的類型,它封裝了傳回值或 None。在本例中,我們使用Result類型傳回一個值。您可以返回一個可能具有字串值的選項,而不是返回字串,如果我們從中獲取的網站不包含任何文本,則返回 None 。一個簡單的解決方案(不應在生產中使用)是.unwrap()結果以將字串從封裝中取出。作業:嘗試檢查 GET 請求是否出錯,在這種情況下傳回 Error 而不是 Ok()。

  2. 你一定聽過借貸。簡而言之:對非平凡類型(所有沒有固定大小的類型)的每次賦值(=)都會轉移所有權。方法fetch_text()並不會取得 url 的所有權,而只是使用對其的引用(透過& )。 作業:找出這段程式碼失敗的原因以及如何解決它。

  3. 您始終必須知道方法傳回哪種類型。在此範例中,我們的 HTTP 套件reqwest傳回一個實作某些方法的 Response 結構(類型)。與許多板條箱一樣,該文件非常出色。那麼看看這裡吧

  4. 您不必鍵入return即可從方法傳回值。只是不要放一個;在語句末尾,這將成為您的回傳值。

使用這個範例來嘗試一下,看看哪裡可能會出現錯誤並學習修復它們。

這就是全部嗎?

兩種意見:

  • “遺憾的是沒有!”

  • “不,不過這是一件好事!”

實際上,您必須學習相當多的 Rust 才能開始。這就是我來這裡的目的。在接下來的幾天、幾週和幾個月中,我將介紹基礎知識,直到建立一個可靠的 Web 應用程式。

在那之前,我可以推薦Exercism.io 上的 Rust 曲目和 Rust Book,您也可以在當地書店或亞馬遜找到紙本版本。

正如我在第一篇文章中提到的,Rust 正在讓你成為更好的開發人員,所以這條路有時會很長,但總是值得的。在TwitterMediumdev.to上關注我,了解最新動態!


原文出處:https://dev.to/gruberb/intro-to-web-programming-in-rust-for-nodejs-developers-lp


共有 0 則留言