大多数服务端程序都运行于 Linux
系统,它们由一个文件系统、一些可执行文件、一些共享库组成,它们还可能与 systemd
或 nsswitch
等系统软件交互。
但由于服务端软件通常依赖于许多系统资源和配置,因此它的部署一直是个挑战,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
容器来简化。