0

JavaScript 容器

 1 year ago
source link: https://blog.p2hp.com/archives/9000
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

JavaScript 容器

大多数服务器程序是 Linux 程序。它们包括一个文件系统、一些可执行文件,可能还有一些共享库,它们可能与 systemd 或 nsswitch 等系统软件交互。

Docker 普及了 Linux 容器的使用;操作系统级虚拟化,为分发服务器软件提供了一种极好的机制。每个容器镜像都是一个无依赖的可立即运行的软件包。

由于服务器软件通常依赖于许多系统资源和配置,因此在过去部署它一直充满挑战。Linux 容器解决了这个问题。

在浏览器 JavaScript 中可以找到类似的封闭环境,尽管它处于更高的抽象级别。 Cloudflare 的 Zack Bloom 早在 2018 年 就激励我们思考 JavaScript 本身是否可以提供一种新型的自包含服务器容器。

我们越能去除不必要的抽象,就越能接近“网络就是计算机”的概念。Cloudflare Workers 本质上是 Cloudflare 网络中这一概念的实现。Deno Deploy 是这个想法的新实现(在 GCP 网络上)。

在这篇文章中,我将描述我对 JavaScript 容器的看法,并推测这项技术在未来几年将如何发展。

通用脚本语言

技术很难预测,但万维网肯定会在 10 年后出现。每过一天,越来越多的人类基础设施通过网络应用程序连接在一起——网络正在吞噬世界。如果你相信网络将在 10 年后出现,那么构成网络的标准——HTTP、HTML、CSS、JavaScript——肯定会出现。因此,我相信 JavaScript 将继续得到开发和改进。

网络是人类信息的基本媒介。JavaScript 与其他编程语言的不同之处在于它与此基础架构紧密相关。

脚本语言对许多服务器端问题很有意义。大多数正在编写的代码不受计算限制,而是受生产力的限制:可以编写的速度和开发人员的金钱成本。脚本语言允许更快、更便宜地编写业务逻辑。脚本语言(Python、Ruby、Lua、Shell、Perl、Smalltalk、JavaScript)非常相似。语法和 API 存在差异,但没有什么可以与之对比的。任何使用过 Rust 或 C 的人都了解脚本语言的感受。

总而言之:脚本语言很有用,但它们几乎都一样,其中 JavaScript 使用得更广泛,而且是面向未来的。因此,将 JavaScript 视为通用脚本语言是有道理的。

Shell : 可执行文件 :: JavaScript : WebAssembly

服务器软件出现了一个新的更高级别的容器:JavaScript 沙箱本身。

这个容器并不是为了解决 Linux 容器所针对的同样广泛的问题。它的出现是其简单性的结果。它最大限度地减少了 Web 服务业务逻辑的样板。它与浏览器共享概念并减少程序员需要了解的概念。(例如:在编写 Web 服务时,很可能任何 systemd 配置都只是不必要的样板。)

每个 Web 工程师都已经知道 JavaScript 浏览器 API。因为 JS 容器抽象是建立在相同的浏览器 API 之上的,所以工程师需要的经验总量减少了。Javascript 的普遍性降低了复杂性。

Shell 是用于调用 Unix 程序的解释性脚本语言。它可以做条件,循环,它有变量......但不幸的是它是有限的,难以编程。真正的功能归于可执行文件。

在这个新兴的服务器抽象层中,JavaScript 取代了 Shell。它比 Bash 或 Zsh 更适合编写脚本。JavaScript 沙箱可以调用 Wasm,而不是像 shell 那样调用 Linux 可执行文件。如果你有一些繁重的计算工作,比如图像大小调整,使用 Wasm 而不是用 JS 编写它可能更有意义。就像您不会在 bash 中编写图像大小调整代码一样,您会产生 imagemagick。

脚本语言的未来是浏览器 JavaScript。Node.js 的根本错误在于随着新 API 的标准化而与浏览器背道而驰,发明了太多东西。在 2010 年,我们还没有 ES 模块,但是一旦标准化,它就应该被引入到 Node.js 中。对于 promises、async/await、fetch、streams 等也可以这样说。node_modules像 CommonJS require, package.json, , NPM这样过时的非标准位,全局process 对象最终要么被标准化并添加到浏览器中,要么被与 web 对齐的替代品取代。

这个更高级别的容器还有待标准化。我们不太清楚这一切将如何发展。目前 Cloudflare Workers 和 Deno Deploy使用 FetchEvent API:

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

可能还可以找到更好的界面。

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

我并不是说 Linux 容器正在消失。这种抽象级别总是有用的。对于人们编写的大部分“业务逻辑”来说,它只是相当低级的。当您构建网站时,诸如 systemd 配置之类的东西都是样板文件。

也许大多数“Web 服务”可以通过考虑 JavaScript 容器而不是 Linux 容器来简化。

Deno,我们正在探索这些想法;我们正在尝试从根本上简化服务器抽象。 如果您觉得这听起来很有趣,我们正在招聘。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK