# 编程语言、ES 标准、JS 引擎和运行时
JavaScript 是前端使用频率最高的编程语言,用它配合 HTML 和 CSS 足以构建出一个完整的 Web 应用
但是在现代前端,除了 JS 还会涉及到许多别的编程语言,它们各有所长

我们经常提到 ES6,它的全称是 ECMAScript 6 或是 ECMAScript 2015,它是一套文档,规范了脚本语言的设计,包括语法、数据类型、内置对象等等,而 JS 则是遵循这套规范的编程语言之一,ES 规范确保了无论在何处使用 JS,它的写法和行为都应该是一致的。
ES 规范每年引入一些新特性,从 ES2015 的 let/const、箭头函数,到 ES2024 的 Object.groupBy,已经加入了非常多实用的功能。
借助于现代前端工具链的转义和 polyfills 的等效实现,你可以在不支持这些新特性的环境中使用它们。
TypeScript 是 JavaScript 的超集,正如其名,它的核心特性是类型系统。
类型系统有许多优势,即便没有写 TypeScript,你依然在享受类型系统带来的便利,比如 VSCocde 提供的类型提示就是基于 TypeScript 类型的。
TypeScript 最终依然会编译到 JavaScript,但在大型前端应用中,TypeScript 的类型检查可以使许多常见错误暴露于编译阶段,从而减少运行时错误,极大地提升了代码的健壮性和可维护性,因此,使用 TypeScript 开发高质量前端应用几乎是必须的。
近些年 Rust 在前端发展十分迅猛,它正在占领前端工具链生态,比较典型的案例有:对标 Babel 的 SWC、对标 Webpack 的 Rspack、Farm,Next.js 的 Turbopack 等都是基于 Rust 语言编写的,这里最根本的原因是前端项目的体量越来越庞大,构建性能已经成为瓶颈,传统的打包优化方案已经无法进一步提升性能,因此需要借助性能更强的编程语言,它就是 Rust。
Rust: 兼顾性能、安全和稳定的现代编程语言。与其说 Rust 占领了前端基建,不如说它是好刀用到了刀刃上。
WebAssembly 简称 Wasm,最早用于在浏览器中处理计算密集型任务,而到了现代,它已然成为一套完整的应用运行生态。它通常不由人直接编写,而是系统语言 C/C++/Go 和 Rust 的编译目标之一。
Wasm Runtime 的出现使其能在非浏览器环境中运行,比如我们可以直接在 Node.js 中运行 Wasm。
WebAssembly System Interface(WASI)API,又为 Wasm 提供了访问系统功能的能力,比如文件系统和网络等。
Wasm 在 Web 开发中有着广泛的应用,除了满足重度计算需求外,它还应用于跨平台开发、安全沙箱、容器和虚拟化技术。
你也许使用过在浏览器中打开的云 IDE,它就是 Wasm 落地应用的集大成者,还有一类编程语言称之为领域特定语言(DSL),它通常是某个现有语言基础上,增加一定约束和扩展,应用于某个特定场景。
比如我们在微信小程序中编写的 WXML、在 React 中编写的 JSX、在 Vue 中编写的 Template 等等,它们都统称领域特定语言。领域特定语言并不是通用型语言,但相比通用型语言,它的语法更简单、开发效率更高、专业对口业务、可维护性强。
你写的代码要运行,自然离不开 JS 引擎和 JS 运行时,JS 引擎负责代码解析、编译、执行和优化,而 JS 运行时不仅自带一个 JS 引擎,还提供了一组环境相关的 API,比如服务端的 Node.js,是基于 V8 的运行时,而 Bun 则是基于 JavaScriptCore 的运行时,它们提供了不同的 API。
比如同样是打开文件,Node.js 是 fs.open (),而 Bun 则是 Bun.file (),再比如 Chrome 浏览器提供了基于 V8 引擎的运行时,而 Safari 浏览器提供了基于 JavaScriptCore 引擎的运行时,它们都提供了 Web API,但实现上有着细微差异。这也是客户端代码容易产生兼容性问题的根本原因。
又比如 Next.js 提供的边缘运行时,不支持 Node.js API;
而 Cloudflare 云服务的边缘环境则支持有限的 Node.js API,因此,前端开发者需要分清楚自己的代码会在什么样的运行时中运行,我们已经知道 Node.js 是最常用的 JS 运行时,但在企业级的大型 Node.js 应用中,仅仅用它还是不够的。大型 Node.js 应用,还会考虑性能监控、安全提醒、故障排除、性能优化等问题,比如阿里云前端基建团队的 Node.js 性能平台(前身叫 alinode),就在 Node.js 的基础上增加了这些功能,提供了一整套解决方案。