不曉得大家最近好不好,我前陣子公司有個 project 做收尾了也順利 deploy 出去了,不過後來在 DataDog 上面看到一個 error 叫 high memory consumption,調整了一下 Kubernetes 的設給它多一點 memory,目前為止好像沒事了,這代表說 monitoring 很重要,能給 developer 一個 debug 的方向。除此之外也有我自己的諮詢服務以及準備我下禮拜的眼睛雷射手術,雖然知道現在成功率非常的高彈還是會有一點點的害怕,相信科技也相信醫生的技術,希望一切平安,如果你想要跟我聊聊軟體工程師職涯相關話題或是對前端迷茫的可以和我約時間諮詢一下。
大家或多或少應該都有聽過一個程式語言叫 Rust,現在很多前端工具都開始往 Rust 靠攏比如 SWC、Turbopack、甚至前陣子 ViteConf 發表說他們在和 Rollup team 做一個 Rollup 的 Rust 版本叫 Rolldown,除了前端領域 Rust 很紅以外,微軟也說他們在用 Rust 重寫 Window core libraries;Android 底層架構也有使用到 Rust;Discord 在 2019 年開始把架構從 Go 轉成 Rust 而且也看到了在記憶體處理方面的優化以及解決了以前常有的延遲的問題,這讓我對 Rust 感到好奇所以這集講講 Rust 是什麼然後在前端領域解決了什麼樣的問題。
Rust 是個主打 performance、type safety、memory safety 的語言,Graydon Hoare 在 2006 年時候創造的語言,當時還是他在 Mozilla 上班所做的 side project,在 2016 年 Mozilla 發佈了新的瀏覽器引擎 Servo 是用 Rust 寫的,之後 Firefox 部分 CSS 渲染引擎也是用 Rust 寫的,在2023年的 Stackoverflow survey中,Rust 是最被欣賞的語言,80%的開發者說之後還會想繼續有 Rust 開發他們的 project 而且這橫跨很多 domain 包括 web、系統底層比如 Linux 和 Windows、開發工具、desktop apps、伺服器等等都可以看到 Rust 的身影。這邊特別提一下 Rust 的一大特色是剛才提的 memory safety,在 JS 中和其他語言會有個步驟叫做 garbage collection,會把整個 program 停住然後找沒有被 referenced 的 variables objects 等等,根據語言不同和 implementation 不同,garbage collector 會有自己的週期和需要的時間來把這些可以釋放出來的 memory 釋放出來,剛才提到在這期間整個 program 是不會動的,但 Rust 選擇另一種 ownership 的方式,當 variables 不用的時候這些 memory 會自動馬上被釋放出來,避免了需要 garbage collection 的步驟,也因為如此 Discord 本來有的 latency spikes 因為用了 Rust 就沒有了
Rust 的語法對我這前端來說有點像 TypeScript 加上 C 的感覺,看起來很現代但帶點底層系統 programming 的感覺,我不知道我這樣講對不對啦但只是我自己在讀 Rust 文件的時候自己的感想。
每一個 variable 你可以先定義會是什麼 type也可以讓 Rust 去 infer,比如這邊開一個 variable 給它一個數字 8,Rust 可能就會自動定義說這是一個 type i32,而且 by default 你不能在 runtime 時候去改變它的值除非特別加上 mut 代表這個 variable 是 mutable 的。然後 Array 需要一開始就定義好 size 是多少這樣 compile time 時候就會給這個 array 多少 memory 除非你用 vector。String 要用 pointer這類前端其實不會看到的東西。有個比較厲害的寫法是我們定義 variable 的時候後面等於後加個大括號就可以寫一個類似function的東西然後從裡面return value,Twitter上面有人跟我說 Ruby 和 Swift 有類似的寫法但 JS TS 沒有,JS 要這麼做一定要寫一個 function 然後去叫那個 function 或是先定義好 variable 然後 if else 在下面寫而不能像 Rust 這樣在同一個地方定義,這個感覺挺酷的。還有其他類似 OOP 或是 Prototype 的寫法讓你自定義一個 type 然後在這個 type 的基礎上加你要的 function。我們 JS 最常用的 Promise Rust 也有支援不過得裝成 Rust 自帶的 Future type,我們常用的 async await Rust 也有支援,不過有趣的是 JS 的 await 是在 function 前面而 Rust 的 await 是在那個 future 後面點 await。
有follow我的人知道我在看 Google android team 發布的一個 Rust 的課程那我會繼續把這個看完然後找個 Rust repo 看看,之後學到什麼或有什麼更新我會在 Twitter 和 Threads 上面和大家聊聊。
在前端世界中當我們要管理 packages 我們有 npm registry 來放我們 publish 的 module 然後用 npm 或是其他市面上看到的 yarn、pnpm、bun等等把這些 module 下載下來,然後這些所謂的 package manager 會自動去 resolve dependencies 確保這些 module 有拿到需要的版本最終確保你的 application 可以正常運作,而 Rust 也有自己的 registry 叫 crates.io 而 package manager 叫 cargo,就一個是箱子一個是貨運,你 set up 一個 Rust project 也是透過 cargo 來創建,類似 package.json 你也會有一個 cargo.toml 檔案裡面紀錄這個 project version 名字和 dependencies,要跑 Rust 和 build for release 也都是透過 cargo 來做這些事情。
我們話題講回前端,前端從幾年前開始整個 infra 變的相對複雜,TypeScript 需要 compile 成 JavaScript;Webpack 需要根據 code splitting 和 dynamic import 的規則來 generate chunks;dev server 讓你在 local development 更容易尤其是 hot module reload,這些起初都是 JavaScript 寫的也透過後來的 algorithm 更新來優化整體效能,但 JS 效能瓶頸也慢慢看到了,所以之後開始看看有什麼其他的方案比如:
因為 Rust 的好寫和對 JS 的友好加上語言上的優勢帶來的 high performance,讓很多不管什麼領域的都想試試 Rust,這是我猜的啦,因為我查半天沒找到確切的原因怎麼前端工具鏈開始這麼喜歡用 Rust。
市面上也有用 Rust 來開發的前端框架比如 Yew 利用 Rust 和 Web Assembly 來創造非常高效能的前端 application。
最後身為前端工程師的你要不要學 Rust,撇開你有興趣想多看看新東西,那除非你想走比較 infra 的東西或是工具類的開發,你大概可以不太需要因為前端開發主流還是 JS / TS 這類語言,除非未來除了 jsx tsx 弄了個 rsx,要不然對平常前端開發 Rust 應該沒有特別有影響。