从JS的混沌到TypeScript的禅定:一个Rust后端程序员的顿悟
哥们,让我猜猜。
你是不是一个后端程序员?每天和 Java 的 Spring、Rust 的 Axum 或者 Python 的 Django 亲密无间,享受着强类型、严谨架构带来的那种“一切尽在掌握”的快感?
然后,你瞥了一眼隔壁前端同事屏幕上花花绿綠的 JavaScript 代码,嘴角是不是划过一丝不屑?
“切,这玩意儿也叫编程?”
如果被我说中了,别紧张。因为,我曾经也和你一模一样。
我热爱 JavaScript,从它还野得像个没人管的疯孩子时,我就在它身边了。不是因为它有多优雅,也不是因为它逻辑多清晰,而是因为它拥有其他语言无法企及的一样东西:
那就是在浏览器里、在每一个屏幕上呼风唤雨的、最原始的统治力!
今天,很多人看着被 TypeScript、React 全副武装的现代 JavaScript,点点头说:“嗯,现在总算能用了。”
但我,早在它“从良”之前,就看到了它的价值。
这篇文章不是一篇教程。这是一个后端老兵从**“鄙视”到“真香”**的心路历程。如果你也是一个还在对 JS 持有偏见的后端开发者,我只想对你说一句话:
别再抗拒 Web 的浪潮了,你应该去驾驭它!
想当年,JavaScript 就是个狂野的西部世界
在那个遥远的 2010 年代,写 JS 简直就像蒙着眼睛走钢丝。
- 全局变量满天飞,一不小心就污染了整个世界。
==
和===
的爱恨情仇,能让你在调试时怀疑人生。- 没有模块,没有类型,更别提什么代码检查工具了。
- IE、Chrome、Firefox 三国鼎立,一段代码,三种死法。
那时候,你不是在写应用,你是在雷区里跳舞。
比如下面这段远古代码,现在看简直是“犯罪现场”:
// 蛮荒时代的JS代码
function doStuff(a, b) {
if (a == b) { // 天知道这里会发生什么隐式转换
alert("它们匹配了");
}
}
但即便如此,我还是爱死了那种感觉。那就像是在“黑入”现实世界。我用最原始的 DOM 操作,写出了表单、动画、幻灯片。虽然代码丑得不忍直视,但它能跑,而且跑在每个人的电脑上!
黎明前的曙光:jQuery、ES6 和理智的回归
然后,变革的浪潮来了。
- jQuery 横空出世,这位“带善人”让操作 DOM 变得不再那么反人类。
- JSON 成了 API 的通用语,前后端总算有了共同的沟通方式。
- ES6 带着天神下凡,
let/const
、箭头函数、Promise……它让 JS 看起来终于像一门“正经”语言了。 - Node.js 炸开了后端的大门,JS 第一次走出了浏览器,开始在服务器端搅动风云。
突然之间,JS 不再只是个浏览器里的“小丑脚本”,它成了一门真正的语言。
我看到很多老派的开发者对此嗤之以鼻:“还是太松散了,不成体统。”
但我却一头扎了进去。因为我能感觉到,这场混乱,正在孕育着伟大的秩序。
今天的JS:类型安全、框架加持、武装到牙齿
快进到现在。我写的 JavaScript,和我刚出道时写的,已经完全是两个物种了。
- TypeScript 带来了我们后端最爱的类型安全。
- React/Vue 让我们用组件化的思维优雅地抽象 UI。
- Vite/Webpack 提供了快如闪电的构建体验。
- ESLint + Prettier 负责把你的代码收拾得比你的桌面还干净。
- Jest/Playwright 让自动化测试变得轻而易举。
- Node/Deno/Bun 在后端和工具领域大杀四方。
看看现在的代码,这还是你印象中的那个“弱鸡”吗?
// 现代 TypeScript + React 代码片段
type User = { id: number; name: string };
const UserCard: React.FC<{ user: User }> = ({ user }) => (
<div className="card">{user.name}</div>
);
这已经不是玩具了。这是驱动着无数真实商业系统的工业级引擎。
后端大佬们,求求了,别再躲着 JavaScript 了!
如果你来自 Rust、Go 或 Java 的世界,我完全理解你的犹豫。
JS 感觉……太不一样了,太乱了。
但如果你选择彻底无视它,你失去的将是:
- 对前端的控制权:你将永远受制于人。
- 构建全栈应用的能力:你只能做“半个”程序员。
- 错过 SSR/SPA/边缘计算的浪潮:这些技术能极大提升产品体验。
- 严重依赖第三方 UI 团队:沟通成本高,效率低下。
你不需要成为一个 React 大师。但你必须具备:
- 基本的 JS 语言能力
- 能看懂并编写 TypeScript
- 理解主流框架的思想
- 在浏览器里独立调试问题的能力
因为猜猜怎么着?
就算你用 Yew 或者 Leptos,你的代码最终还是会编译成 WebAssembly,并且与那个只说一种语言的浏览器交互。而那个语言,就是 JavaScript。
打通任督二脉:当 Rust 与 TypeScript 开始“说人话”
对我来说,最神奇的时刻,是当我意识到,我可以在前后端之间共享同一套业务逻辑,而不会产生任何偏差。
我给你讲一个我曾经追了好几天的 Bug。
我的 UI 总是告诉用户订单“可以发货了”,但后端却还没确认。用户很生气,我也很崩溃。
为什么?因为前端和后端对于“可以发货”的定义,有那么一丁点的不同。
在我的 Rust 代码里,逻辑是这样的:
// lib.rs
#[derive(serde::Serialize)]
pub struct Order {
pub status: String,
pub total: f64,
}
impl Order {
pub fn is_shippable(&self) -> bool {
self.status == "Confirmed" && self.total >= 50.0
}
}
但在 JavaScript 里,检查稍微松散了一点,然后随着时间推移,这里的逻辑变得越来越复杂,最终导致了不一致。
直到我找到了神器 ts-rs。它能直接从我的 Rust 数据结构,自动生成 TypeScript 的类型定义。
这意味着:
- API 的数据结构,自动生成 TypeScript 类型,再也不会错。
- 枚举和常量,前后端共享一份,永远同步。
- 一个强类型的 API 客户端,让调用后端就像调用一个本地方法一样简单。
现在,只要我修改了后端的 is_shippable
逻辑,前端的类型定义就会自动更新。一个地方修改,处处同步。
朋友们,这不是为了方便,这是为了拯救我们的头发!
JavaScript 从来都不是问题,无知和偏见才是
真相是:
JavaScript 的胜利,不是因为它天生丽质。
而是因为它无处不在。
而现在,当它已经变得结构化、类型化,并且经过了战火的考验,我们真的没有任何借口再把它拒之门外了。
如果你脑子里还回响着那句:
“我不喜欢JS,它就是一团乱麻。”
那你还活在 2010 年。2025 年的 JavaScript 技术栈,早已是精干、强大、可信赖的代名词。
对于我们这些花了数年时间在后端世界里追求严谨和完美的开发者来说,拥抱现代 JavaScript,不是一种倒退,而是解锁你的下一个超能力。
别再犹豫了。
去用 TypeScript 写一个 Hello World。 去玩玩 Vue 或 React。 去用 Node 写一个命令行小工具。
很快,你就会停止问:“为什么是 JavaScript?”
然后开始感叹:
“为什么我没有早点开始?”
关注梦兽编程微信公众号,解锁更多黑科技。