JavaScript容器是服务器简化的未来吗

1,494

大多数服务端程序都运行于 Linux 系统,它们由一个文件系统、一些可执行文件、一些共享库组成,它们还可能与 systemdnsswitch 等系统软件交互。

但由于服务端软件通常依赖于许多系统资源和配置,因此它的部署一直是个挑战,Linux 容器的出现很好的解决了这个问题。Docker 进一步让 Linux 容器得到普及。操作系统级的虚拟化为分发服务器软件提供了极好的机制,每个容器映像都是一个无依赖性的随时可以运行的软件包。

Ryan Dahl 表示,尽管 browser JavaScript 是在更高的抽象级别上,但其中依旧能找到类似的封闭环境。直到 2018 年,Cloudflare 的 Zack Bloom 推出了 Workers 服务,这才促使我们思考 JavaScript 本身能否提供一种新型的自给自足的服务器容器 —— 我们越能消除不必要的抽象,就越能接近 The Network Is the Computer的概念。

通用脚本语言

Ryan Dahl 认为,技术很难进行预测,但是 World Wide Web 肯定会在 10 年后出现。越来越多的基础设施通过网络应用程序联系在一起,10 年后 HTTP、HTML、CSS、JavaScript 等网络标准肯定会出现,因此 Dahl 相信 JavaScript 将得到进一步的开发和改进。

网络是人类信息传递的基本媒介,脚本语言则像是驱动网络发展的基石,JavaScript 不同于其他编程语言,它与基础架构紧密联系。

脚本语言对于解决许多服务器端问题很有意义,它允许更快、更便宜地编写业务逻辑,而且大多数正在编写的代码不受计算的限制,而是受生产力的限制 —— 编写速度和开发人员的薪酬成本。

脚本语言(Python、Ruby、Lua、Shell、Perl、Smalltalk、JavaScript)非常相似。它们虽然在语法和 API 方面存在差异,但其余部分非常相似。

Ryan Dahl 总结道,脚本语言特别有用,特别是 JavaScript,它使用的最为广泛,且面向未来,因此,将 JavaScript 视为通用脚本语言是有道理的。

JavaScript 沙箱

服务端出现了新的更高级别的容器:JavaScript 沙箱。

该容器并不是为了解决 Linux 容器针对的问题,而是 Linux 简单化的结果。它最大限度减少了 Web 服务业务逻辑的模板数量,减少程序员需要了解的概念。

JavaScript 容器抽象是建立在大多数 Web 工程师都熟悉的浏览器 API 上的,因此这有效地降低了容器的复杂性和理解难度。

Shell 是调用 Unix 程序的解释性脚本语言,可以做条件、循环等,但 Shell 的能力有限,难以进行编程。

在这个新服务器抽象层中,JavaScript 取代了 Shell,且比 Bash/Zsh 更适合编写脚本。JavaScript 沙箱可以调用 Wasm,而非像 Shell 那样调用 Linux 可执行文件。

未来

浏览器 JavaScript 是脚本语言的未来。Node.js 的根本错误在于随着新 API 的标准化而慢慢与浏览器背道而驰。

2010 年,Node 没有 ES 模块,但是 ES 一旦被标准化,它就会被引入到 Node.js 中, promises、async、await、fetch、streams 都是类似的道理。像 ComonJS require、package.json、npm 这些非标准化的用法,全局 process 对象等最终只会有两种途径: 要么被标准化并添加到浏览器中,要么被类似 Web 功能取代。

例如目前 Cloudflare Workers 和 Deno Deploy 利用如下的方式来使用 FetchEvent API

addEventListener("fetch", (event) => {
  event.respondWith(new Response("Hello world"));
})

总结

JavaScript 是通用脚本语言,由于 JavaScript 的普遍性,一种新的类似容器的抽象正在出现—— JavaScript 容器,它简化了服务器。

但这并不意味这 Linux 容器正在消亡,这种抽象层级有其独特的价值。特别是对于编写的许多业务逻辑的开发者来说,当你建立一个网站的时候,或许大多数 Web 服务可以通过使用 JavaScript 容器而不是 Linux 容器来简化。