前端大厦建立在并不牢固的地基上:JavaScript 的未来到底往哪走?

一个小小的
__dirname is not defined,让我重新思考了前端的未来。
上周我新建了个 Vite 项目,顺手写下那段陪伴我十年的配置代码:
javascript
// vite.config.js
import path from 'path';
export default {
resolve: {
alias: { '@': path.resolve(__dirname, 'src') }
}
};
结果 TypeScript 给了我当头一棒:
__dirname is not defined。
这段从 Node.js 时代一路走来的"老伙计",为什么突然就不行了?
不是 API 不见了,是我们换了运行时代
path 没问题,Node.js 也没问题。
真正的问题叫:你已经进入 ESM 时代了。
在 ES Modules 里,确实没有 __dirname 这个东西。
要写的话,只能这样绕一圈:
javascript
import { fileURLToPath } from 'node:url';
import { dirname } from 'node:path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
或者换个更现代的写法:
arduino
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
}
看着有点繁琐,但它背后的意义非常大:
我们正在统一运行时,让配置文件能在 Node、Bun、Deno 甚至浏览器里跑起来。
以前所有工具都默认你用 Node。
现在工具链在努力"脱 Node 而不反 Node"。
这是一次升级,而不是破坏。
工具链不是抛弃 Node.js,而是让我们不再依赖它的"私货"
这几年,构建工具几乎在"集体逃离 JavaScript":
- ESBuild 用 Go 写
- Rspack 和 Turbopack 用 Rust 写
- SWC 也用 Rust 写
于是很多人开始问:
"那我还学 Node.js 干嘛?"
其实答案很简单:要学,但重点不一样了。
你不必再研究:
- libuv 怎么调度事件
- C++ 插件怎么写
- 事件循环有几层 phase
但你仍然需要懂:
- ESM 下路径、文件系统的正确写法
- 构建工具配置怎么写
- 插件怎么开发
原因很现实:
工具链底层可以用 Rust 或 Go 写,但你写的配置、插件、脚本还是要走 JavaScript。
"工具在加速,你在抽象。"
我们写的不是底层引擎,而是告诉编译器我们想要什么。
这就是未来。
Node 模块不会消失,但会变成"兼容层"
我相信未来工具链会出现类似这样的 API:
csharp
import { resolveAlias } from 'vite/utils';
alias: { '@': resolveAlias('./src') }
不用再管:
- 是 Node 在运行
- 还是 Bun
- 还是 Deno
- 甚至未来是不是浏览器直接跑构建工具
到那时,Node.js 的模块依然在,但它会慢慢变成"大家都懂的基本 API",就像互联网的通用协议一样。
你要学 Node?
要,但不需要钻那么深。
你需要的是写出更通用、更标准、更不绑定运行时的代码。
Rust 重写的是工具,不是 JavaScript 本身
这句真的很重要。
工具链被 Rust 重写,是因为 JavaScript 不适合做"工程级大工具"。
但这不代表 JS 要退出舞台。
Rust 替代的是:
- Babel → SWC
- Webpack → Rspack / Turbopack
- 部分 CLI 工具 → Rust 版本的高速实现
但真正跑你业务代码的仍然是:
- 浏览器里的 V8 / JavaScriptCore
- Node.js / Deno / Bun
Rust 是发动机,JavaScript 是燃料。两者不是竞争关系。
V8 会被抛弃吗?JavaScript 凭什么还活得这么滋润?
JavaScript 的确有很多槽点:
0.1 + 0.2 !== 0.3typeof null === 'object'- 隐式转换能把人心态搞崩
但它有一项别人打不败的技能:
所有浏览器都支持 JavaScript。
这就是"现实世界的压制力"。
而 V8 更不是简单的 JS 引擎,它还是:
- DOM / Web API 的实现者
- WebAssembly 的宿主
- Node.js 和 Deno 的基石
- 前后端通用运行时的底层
所以说:
你可以骂 JavaScript,但你没法绕过它。
生态的力量不是某种语言可以轻易撼动的。
JavaScript 的未来:正在悄悄变成"前端的汇编语言"
你可能已经感觉到了:
- 你写的业务逻辑越来越依赖 TypeScript
- UI 越来越声明式(Vue / Svelte / React)
- 重性能逻辑靠 Rust + WASM
- 构建工具自动把一切编译成 JS + WASM
你写的纯 JavaScript 可能越来越少。
但是 JS 不会消失,它会像"浏览器的汇编语言"一样静静待在那里,作为:
- 运行时的中间层
- WASM 的宿主
- TypeScript 的目标产物
- 工具链真正输出的落地代码
它不是主角了,但它变得更稳定、更基础、更不可替代。
结语:在流沙之上建高楼,是前端工程师的浪漫
前端的世界地基确实不稳:
- JavaScript 的历史包袱
- Node.js 的割裂
- 浏览器的碎片化
- 工具链一次次的重写
我们用 TypeScript 修补类型。
用 Rust 提升性能。
用 ESM 拉齐规范。
用工具链把复杂性藏到地板下面。
最终,我们居然真正在这片流沙上,建起了一座足够坚固的数字城市。
地基我们没法选,但建筑方式我们能决定。
最后的最后
如果真的有 JavaScript 和 V8 被彻底替代的一天,那么被推翻的将远不止前端程序员的工具链,而是整个现代 Web 生态:数十亿网站、数千万开发者、上万亿美元的数字基础设施,都将随之重构。
但到那时,我们可能早就------
不再称它为"Web"了。
或许我们已全面进入空间计算、神经交互或去中心化协议的新范式;或许"浏览器"已成为历史名词;又或许,人类与机器的交互方式早已超越"页面"与"脚本"的范畴。
在那个未来里,JavaScript 的退场不会是一场革命,而是一次静默的谢幕------如同马车消失于汽车时代,不是被禁止,而是被超越。
但在今天,在可预见的未来十年甚至二十年,JavaScript 仍是我们唯一可行的通用语言,V8 仍是这座数字世界最可靠的引擎。
所以,不必等待完美地基。
在流沙之上,继续建造。
你怎么看 JavaScript 的未来?欢迎在评论区聊聊你的想法。