Node.js/Deno 之父关于JavaScript成为新一代容器的思考

更新日期: 2022-06-24阅读: 704标签: 容器
作者:Ryan Dahl
原文链接:JavaScript Containers

服务端绝大部分程序都是 Linux 程序。这些程序一般由文件系统、一些可执行文件,一些共享的库文件(这些库文件与一些系统库例如 systemd 或者 nsswitch 做交互)。

Docker 让使用 Linux 容器变得更容易,也更流行。系统级别的虚拟化让发布服务端程序有一套不错的机制。每一个容器镜像都是一个无依赖且可以立即执行的软件包。

因为服务端软件经常依赖很多系统资源和配置,在过去部署这些软件是一件有挑战的工作。Linux 容器很好的解决了这个问题。

我们可以在浏览器的 JavaScript 发现一个类似这样的环境,只不过是一个更高层面(译者注:相比 linux 容器)的抽象。2018 年时,Cloudflare 公司的 Zack Bloom 的文章激发了我们对于 JavaScript 自身可以提供一种新类型的、独立的系统层级的容器。

我们去除不必要的抽象越多,我们就越接近 “互联网本身就是一台计算机” 这个概念。Cloudflare Workers(译者注:CLoudflare 的一种 serverless 服务)就是这种概念在 Cloudflare 公司在 Cloudflare 网络里的一种实现。Deno Deploy(译者注:Deno 公司提供一种基于 deno 的 serverless 服务)是一种这个概念的新实现(在 Google 的 GCP 网络中)。

在这个博文里,我会描述我关于 JavaScript 容器的理解,以及我认为这种技术在今后的日子里的可能的发展情况。

统一脚本语言[The Universal Scripting Language]

科技是非常难去预测的,但是可以肯定的是,10年以后,万维网(World Wide Web)仍然还存在。在过去的日子里,我们看到越来越多的人类基础设施通过 web 应用连接到了一起 - web 在吞噬整个世界。如果你认为 web 10 年后还存在,那么,组成 web 的标准 - HTTP、htmlcss、JavaScript 也同样会存活。所以,我非常自信的认为,JavaScript 仍然会被开发和改进。

web 是人类信息的基础载体。JavaScript 和其他编程语言不一样,这门语言植根在 web 基础设施中。

脚本语言对于很多服务端的问题意义重大。绝大部分脚本语言编写的代码,都不是计算负载重的代码,而是为了追求更高的效率:追求程序开发的速度以及更低的开发者工资的消耗。脚本语言可以让业务逻辑更快和更便宜的写出。脚本语言(包括不限于 Pthon、Ruby、Lua、Shell、Perl、Smalltalk、JavaScript)都差不多。它们之间的差异更多是语法api 上,但是其他方面的差别并不大。任何人只要在 Rust 或者 C 上花一些时间(译者注:当然也要写一些脚本语言)都能明白脚本语言的特点。

我总结一下:脚本语言是很有用的,但是它们都差不多,但是显然,JavaScript 是目前被应用最广泛的脚本语言,也是未来前景最好的脚本语言。所以我认为,JavaScript 可以作为统一脚本语言。

Shell : Executables :: JavaScript : WebAssembly

(译者注:这个标题模拟了 rust 调用名字空间里函数的语法。)

现在对于服务端软件诞生了一种更高层级抽象的容器:JavaScript 沙盒本身。

这个容器的目标不是为了接近 Linux 容器目标解决的问题。这种容器的出现本身就是这种容器简单架构的结果。这种容器最小化了 web 服务业务逻辑的样板代码。这种容器发展了浏览器的概念,减少了开发这种容器承载的代码的开发者需要知道的概念。(例如:写一个 web 服务,和任何一个 systemd 配置差不多,只不过不需要写那么多样板代码)(译者注:这里潜在的是说,有很多事云服务商通过接口和自身的服务帮开发者做了,开发者只需要关注业务逻辑就好了。)

每一个 web 工程师都已经非常熟悉浏览器的 JavaScript API。因为 JS 容器抽象是在同样的浏览器 API 之上构建的, 所以工程师使用这种容器需要的知识并没有增加很多。让 JavaScript 成为统一的脚本语言,可以有效减少复杂度。

Shell 是一种解释型脚本语言,用来调用 Unix 程序。它可以做条件判断,循环,也有变量。但是 Shell 编程的体验是比较差的。它更多的功能还是编写相对简单的可执行文件。

在这个正在发展的抽象容器层,JavaScript 可以取代 Shell 的地位。JavaScript 的各方面能力都远超 Bash 或者 Zsh。JavaScript 不但可以调用 Linux 可执行文件,就像 Shell 一样,JavaScript 容器也可以调用 WASM。如果你的业务由计算密集型的负载,例如图片调整,那可能直接使用 wasm 的能力,比编写 JS 程序要效率更高。就好像,你不会在 Bash 里编写图片调整的程序一样,你调用 imagemagick 命令。

北极星[The North Star]

脚本语言的未来是浏览器的 JavaScript。(我创始)Node.js 的一个基础错误是把 Node.js 的 API 没有与浏览器做统一,反而诞生了很多自己的 API。在 2010 年,我们没有 ES 模块,但是 JavaScript 有了 ES 模块,应该把这个模块标准直接带到 Node。同样的事情,还发生在 promises,async/await,fetch,stream 以及更多的 JavaScript 新增的功能里。更不要提过时的 Node 自有的功能例如 CommonJS require,package.json,node_modules, npm,全局 process 对象。这些功能应该要么被标准化,并且让浏览器提供,要么被浏览器的功能取代。(译者注,除了 CommonJS 这一点赞同,其他的几个功能,即便在目前看,并不是糟粕。RD 写这篇文章多少有贬低 node 抬高 deno 的嫌疑,所以读者们要辩证看待他的说法。)

这种更高级别的容器的标准化还不成熟。我们不知道多会可以完善这种标准。比如,Cloudflare Workers 和 Deno Deply 使用下面的 FetchEvent API:

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

也许我们也能找到更好的写法(来做标准)。

结论

JavaScript 是统一脚本语言。因为 JavaSCript 能提供的统一性,一种新的容器类似的抽象正在萌芽,并且可以简化服务端软件。

我并不是说,Linux 容器会被淘汰。那个层面的抽象总是有意义的。只是对于大部分人们编写的“业务逻辑”来说,Linux 容器过于低层级。如果你是开发一些网站的服务,你如果用 Linux 容器,你仍然需要写很多类似 systemd 配置的模版代码。

也许绝大多数“web 服务”可以通过 JavaScript 容器极大的简化,而不是使用传统的 Linux 容器。

在 Deno 我们正在探索这种理念。我们的目标是极大简化服务端的抽象。如果你感兴趣,我们也在招人。HackerNews 评论

链接: https://www.fly63.com/article/detial/11797

Web容器_Web服务器及常见的Web容器有哪些?

首先来理解一下简单的一个请求发送到响应的过程。客户端,通常是浏览器或者一些应用发送请求到你的服务器地址,比如访问你的Url或者其他的东西。而我们的服务器通常要分为两个部分,一部分是服务器硬件,有了硬件之后还有有硬件上对应运行的软件。

css实现图片自适应容器的几种方式

css实现图片自适应容器:经常有这样一个场景,需要让图片自适应容器的大小。img标签的方式:我们马上就能想到,把width、height 设置为100%啊。来看一哈效果。

销毁servlet

web容器可能决定一个Servlet是否从servic中移除(例如,当一个容器想要回收内存资源时或者被关闭时)。在上面的场景中,容器会调用Servlet接口的destroy方法。在方法中,可以释放servlet使用的任何资源

搞懂依赖注入, 用 PHP 手写简易 IOC 容器

好的设计会提高程序的可复用性和可维护性,也间接的提高了开发人员的生产力。今天,我们就来说一下在很多框架中都使用的依赖注入。要搞清楚什么是依赖注入如何依赖注入,首先我们要明确一些概念。

如何优雅监听容器高度变化

不管是对元素的哪种操作,都会造成它的属性、子孙节点、文本节点发生了变化,如果能能监听得到这种变化,这时只需比较容器宽高变化,即可实现对容器宽高的监听,而无需关系它外部行为。DOM3 Events 规范为我们提供了 MutationObserver 接口监视对 DOM 树所做更改的能力

css怎么使容器放不下自动换行?

css可以通过word-break与white-space这两个属性来设置自动换行。word-wrap属性允许长单词或URL地址换行到下一行。white-space属性可以设置文本换行方式。

CSS容器查询

CSS容器查询终于来了! 它们目前在谷歌浏览器(105)中得到了支持,很快就会在Safari 16中得到支持。这对前端来说容器查询与媒体查询一样重要。在这节课中,我们介绍一下容器查询是如何工作的,如何使用它们

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!