JavaScript 的作用:服务器端和客户端
JavaScript 无处不在:从浏览器到服务器
JavaScript 最初是一种用于使网页交互的简单脚本语言。如今,它是唯一一种在浏览器和服务器上都能原生运行的语言,使得使用单一编程语言构建整个应用程序成为可能。这改变了我们开发软件的方式。
浏览器中的 JavaScript
每个现代浏览器都有一个运行代码的 JavaScript 引擎。Chrome 使用 V8,Firefox 使用 SpiderMonkey,Safari 使用 JavaScriptCore。这些引擎速度极快——它们将 JavaScript 即时编译为机器代码,使现代 Web 应用程序感觉像原生应用程序一样响应迅速。
在浏览器中,JavaScript 可以访问广泛的 API。它可以操作 DOM(页面结构),使用 fetch 发出网络请求,使用 WebGL 或 Canvas 绘制图形,使用 IndexedDB 本地存储数据,甚至访问摄像头和麦克风等硬件功能。现代 JavaScript 使用 ES 模块,这允许您将代码组织成可重用的文件,这些文件可以导入和导出功能。
服务器上的 JavaScript:Node.js
Node.js 将 JavaScript 带到了浏览器之外。它使用与 Chrome 相同的 V8 引擎,但添加了用于处理文件系统、创建网络服务器和处理数据流的 API。关键创新是其事件驱动、非阻塞架构——Node.js 不会等待文件读取或数据库查询完成,而是继续处理其他请求,并在结果准备好时返回。
Node.js 附带了一个用于常见任务的大型标准库,npm 注册表是世界上最大的包生态系统。流行的框架(如 Express)使构建 Web 服务器和 API 变得容易,而更固执己见的框架(如 NestJS)为大型应用程序提供了结构。
现代替代方案:Deno 和 Bun
Deno 由创建 Node.js 的同一个人创建,但根据经验教训从头开始重新设计。它默认是安全的——除非您明确授予权限,否则脚本无法访问文件系统或网络。它具有原生 TypeScript 支持、标准库,并直接使用 fetch 等现代 Web API。
Bun 是最新的竞争者,用 Zig 编写以实现最大性能。它旨在成为 Node.js 的直接替代品,但启动时间显著更快,并内置了捆绑、测试和包管理工具。它仍在成熟中,但显示出有希望的结果。
边缘计算:网络边缘的 JavaScript
JavaScript 的一个新前沿是在 CDN 边缘位置(分布在世界各地靠近用户的服务器)运行代码。Cloudflare Workers、Vercel Edge Functions 和 Deno Deploy 允许您在边缘运行 JavaScript,以最小的延迟响应请求。权衡是这些环境有限制——没有文件系统访问权限、有限的 CPU 时间和内存限制——但它们非常适合身份验证、路由和个性化等任务。
在客户端和服务器之间共享代码
随处使用 JavaScript 的最大优势之一是代码共享。您可以一次定义 TypeScript 类型,并在客户端和服务器上使用它们。验证逻辑可以在两个地方运行。用于格式化日期、验证输入或处理数据的实用函数可以共享。使用 Nx 或 Turborepo 等 monorepo 工具,管理全栈应用程序中的共享代码非常简单。
TypeScript:让 JavaScript 可扩展
对于大型项目,TypeScript 已变得必不可少。它为 JavaScript 添加了静态类型,在错误到达生产环境之前捕获它们。接口、泛型和条件类型等功能使您能够以工具和编辑器可以理解的方式表达复杂的数据关系。端到端的类型安全——数据库中的类型连接到 API 和前端中的类型——现在可以通过 tRPC 和 GraphQL Code Generator 等工具实现。
未来:一次编写,随处运行
WinterCG 社区组正在努力标准化所有运行时(浏览器、Node.js、Deno、Bun 和边缘函数)的 JavaScript API。目标是让为一个运行时编写的代码只需最少的更改即可在任何其他运行时上运行。常见的 API(如 fetch、WebSocket 和流)已经随处可用。这种标准化正在使 JavaScript 真正通用。
