为什么我抛弃了 JavaScript、Python 和 NPM,转而使用 Rust(你也应该如此)

发布: (2025年12月4日 GMT+8 11:02)
7 min read
原文: Dev.to

Source: Dev.to

临界点

凌晨 3 点。我盯着屏幕,看着 npm install 在第 47,000 个依赖上慢慢爬行。我的 React 应用只需要一个简单的日期选择器。一个。node_modules 文件夹?1.2 GB。实际我写的代码?200 行。

就在那时,我决定:忍无可忍。

大家假装正常的 JavaScript 噩梦

让我们坦诚一下我们已经“正常化”的东西:

  • “直接跑 npm audit fix — 翻译:拿依赖玩俄罗斯轮盘,祈祷别出问题。
  • “在我的机器上可以跑” — 因为不知为何,到了 2025 年我们仍然无法可靠地复现构建。
  • “这里加 @ts-ignore — TypeScript 的暗示:“我放弃了,自己搞吧”。
  • node_modules 只有 800 MB” — 面不改色地说,好像这对一个待办事项应用来说是可以接受的。

我们自我催眠,觉得这没问题。其实根本不正常,简直疯狂。

Python:通往沮丧站的慢车

Python 开发者喜欢炫耀“简洁”。让我来告诉你 Python 的简洁到底是怎样的:

def calculate_total(items: List[Item]) -> float:
    return sum(item.price for item in items)

很美,对吧?现在看这个:

calculate_total("not a list")          # Runtime error! 💥
calculate_total(None)                  # Runtime error! 💥
calculate_total([None, "lol"])         # Runtime error! 💥

那些类型提示?**纯装饰。**它们只是建议。你的代码会开心地忽略它们,在凌晨 2 点的生产环境里炸掉。

再说说 GIL——Python 那迷人的机制,确保你的“多线程”代码实际上只在单核上跑。2025 年,在你那台 16 核机器上。

然后我遇见了 Rust

我当时持怀疑态度。“学习曲线很陡”,他们说。“借用检查器很烦人”,他们警告。

真正让人烦的是什么?凌晨 3 点调试一个空指针异常,因为 JavaScript 认为 undefinednull 是两回事。

之前(React + TypeScript)

  • 包体积:220 KB(已压缩)
  • node_modules:1.1 GB
  • 构建时间:45 秒
  • 运行时错误:有
  • 漏洞数量:47(其中 12 严重)

之后(Rust + Leptos)

  • 包体积:52 KB(WebAssembly)
  • 依赖:下载一次,永久缓存
  • 构建时间:首次 2 分钟,增量 10 秒
  • 运行时错误:几乎不可能
  • 漏洞数量:0

Rust 的区别

无垃圾回收的内存安全

不再有神秘崩溃。不再有“某处内存泄漏”。只要能编译,就能运行。就这么简单。

真正的类型安全

fn add(a: i32, b: i32) -> i32 {
    a + b
}

add(5, "hello"); // Won't compile. Not a linter warning. Compile error.

实际的性能

我对同一个算法分别在 Python 和 Rust 上做基准测试。Python:450 ms。Rust:5 ms。快了 90 倍。不是打错。

一个编译器,一个包管理器,一个锁文件

不再有 webpack、Babel、Rollup、Parcel、Vite、Turbopack、esbuild、Snowpack 的戏码。只要 cargo build。每次、每台机器都能成功。

“但是 Rust 很难!”

真的难吗?

  • 哪个更难:一次性学会 Rust 的借用检查器,还是第 10,000 次调试 “cannot read property of undefined”?
  • 哪个更难:用 Result 写显式错误处理,还是在生产环境里困惑于 Python 脚本悄悄失效?
  • 哪个更难:面对 Rust 的编译错误,还是面对 JavaScript 那种 “编译通过但运行时崩溃” 的胡闹?

Rust 难得像刷牙一样。是的,需要付出努力。但另一条路就是腐烂。

生态其实很合理

Cargo vs NPM

  • 想添加依赖?cargo add serde — 完事。
  • 想升级?cargo update — 完事。
  • 想检查安全性?cargo audit — 完事。
  • 想知道哪里坏了?Cargo 在编译时就会详细告诉你。

没有 npm audit 报出上千个你修不了的漏洞,因为升级会把一切都砸碎。没有 package-lock.json 的合并冲突。没有 “删掉 node_modules 然后祈祷” 的仪式。

关于 Web 开发的真实对话

我刚刚交付了一个使用 Rust 同时构建后端(Axum)和前端(Leptos + WebAssembly)的生产仪表盘。

  • 零 JavaScript。 不是“极少 JavaScript”。
  • 后端快得惊人。
  • 前端响应式、类型安全,编译成的 WASM 比大多数 JavaScript 框架还小。
  • WebSocket 连接能够毫无瑕疵地处理实时更新。

我能用 React 和 Node.js 完成同样的事吗?可以。但会慢 4 倍、出错 10 倍、让人沮丧 100 倍吗?绝对会。

结论

我并不是说 JavaScript 和 Python 没用。它们有自己的位置。

我说的是,它们的 位置 已经不在我的生活里了。

Rust 教会了我:

  • 可靠性不是奢侈,而是底线。
  • 性能很重要。
  • 你的工具应该帮助你,而不是和你作对。
  • “它编译通过”应该真的有意义。

如果你已经厌倦了:

  • 运行时调试显而易见的错误
  • 与构建工具搏斗(npm install 花的时间比写代码还长)
  • “在我的机器上可以跑” 综合症
  • 类型系统只是建议而非保证

去学 Rust。 它并不像人们说的那样难。编译器是你的朋友,社区也很热心。一旦上手,你会惊讶于自己为何曾经容忍那种疯狂。

轮到你了

还在跑 npm install 并祈祷能顺利吗?
还在加 @ts-ignore 然后收工吗?
还在假装 GIL 不重要吗?

Rust 编译器正等着你。它真的会站在你这边。

🦀 Rust:让“它编译通过”真的有意义。

Back to Blog

相关文章

阅读更多 »