近日,Node.js 创始人 Ryan Dahl 在社区以“JavaScript Containers”为题发文谈论了自己对 Javascript 容器的看法 —— Javascript 是通用脚本语言的“未来”,而 Javascript 容器则是简化服务器抽象的“先驱”践行者。
众所周知,大多数服务器程序都运行的是 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 这些构成网络的标准肯定也会出现。因此,“我相信 JavaScript 将会继续得到开发和改进”。
我们知道,网络是人类信息的基本媒介,脚本语言则像是驱动网络发展的“基石”,这其中,JavaScript 不同于其他编程语言,因为它与这个基础设施紧密相连。
脚本语言对于解决许多服务器端问题很有意义,它允许更快、更便宜地编写业务逻辑,但大多数正在编写的代码不受计算的限制,而是受生产力的限制 —— 编写速度和开发人员的金钱成本。
脚本语言(Python、Ruby、Lua、Shell、Perl、Smalltalk、JavaScript)非常相似,在语法和 API 方面存在差异,但几乎没有其他可以与之对比的地方。这一点,相信每一位在 Rust 或 C 中工作过的人都能理解脚本语言的感受。
Ryan Dahl 总结称,脚本语言很有用,但它们几乎都是一样的,其中 “JavaScript 的使用要广泛得多,而且是未来的证明。因此,将 JavaScript视为通用脚本语言是有道理的”。
Javascript 中的沙箱并非传统意义上的沙箱,它是一种语法上的 hack 写法,指 Javascript 中处理模块依赖关系的闭包。
JavaScript 沙箱本身这个“容器”并非为了解决 Linux 容器所针对的问题,它的出现是其简单化的结果 —— 最小化了 web 服务业务逻辑的样板文件,它与浏览器共享概念,并减少程序员需要知道的概念(如在编写web服务时,很可能任何 systemd 配置都只是不必要的样板)。
提起 JavaScript browser API,相信每个网络开发者都知道,因为 JavaScript 容器抽象是在相同的 browser API 上构建的,所以开发者需要的经验总量减少了,这恰恰是 Javascript 的通用性降低了其复杂性。
在这个新服务器抽象层中,JavaScript 取代了 Shell,且比 Bash/Zsh 更适合编写脚本。JavaScript 沙箱可以调用 Wasm,而非像 Shell 那样调用 Linux 可执行文件。
不可否认,JavaScript 是通用的脚本语言,也正是由于 JavaScript 的普遍性,一种新的类似容器的抽象正在出现 —— JavaScript 容器,它简化了服务器。
JavaScript 容器的出现并非意味着 Linux 容器正在“消亡”,这种抽象层次总是有用的。特别是对于编写的许多“业务逻辑”的开发者来说,当你建立一个网站的时候,或许大多数“web服务”可以通过使用 JavaScript 容器而不是 Linux 容器来简化。
目前,为了试图从根本上简化服务器抽象,为了进一步探索这些想法,JavaScript 容器或许就是一种“先驱”践行者。你是否也这么觉得呢?欢迎在评论区留言互动。