为什么我抛弃了 JavaScript、Python 和 NPM,转而使用 Rust(你也应该如此)
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 认为 undefined 和 null 是两回事。
之前(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:让“它编译通过”真的有意义。