作者:RyanDahl 原文链接:JavaScriptContainers 译文首发链接:zhuanlan。zhihu。comp511485016 服务端绝大部分程序都是Linux程序。这些程序一般由文件系统、一些可执行文件,一些共享的库文件(这些库文件与一些系统库例如systemd或者nsswitch做交互)。 Docker让使用Linux容器变得更容易,也更流行。系统级别的虚拟化让发布服务端程序有一套不错的机制。每一个容器镜像都是一个无依赖且可以立即执行的软件包。 因为服务端软件经常依赖很多系统资源和配置,在过去部署这些软件是一件有挑战的工作。Linux容器很好的解决了这个问题。 我们可以在浏览器的JavaScript发现一个类似这样的环境,只不过是一个更高层面(译者注:相比linux容器)的抽象。2018年时,Cloudflare公司的ZackBloom的文章激发了我们对于JavaScript自身可以提供一种新类型的、独立的系统层级的容器。 我们去除不必要的抽象越多,我们就越接近互联网本身就是一台计算机这个概念。CloudflareWorkers(译者注:CLoudflare的一种serverless服务)就是这种概念在Cloudflare公司在Cloudflare网络里的一种实现。DenoDeploy(译者注:Deno公司提供一种基于deno的serverless服务)是一种这个概念的新实现(在Google的GCP网络中)。 在这个博文里,我会描述我关于JavaScript容器的理解,以及我认为这种技术在今后的日子里的可能的发展情况。统一脚本语言〔TheUniversalScriptingLanguage〕 科技是非常难去预测的,但是可以肯定的是,10年以后,万维网(WorldWideWeb)仍然还存在。在过去的日子里,我们看到越来越多的人类基础设施通过web应用连接到了一起web在吞噬整个世界。如果你认为web10年后还存在,那么,组成web的标准HTTP、HTML、CSS、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工程师都已经非常熟悉浏览器的JavaScriptAPI。因为JS容器抽象是在同样的浏览器API之上构建的,所以工程师使用这种容器需要的知识并没有增加很多。让JavaScript成为统一的脚本语言,可以有效减少复杂度。 Shell是一种解释型脚本语言,用来调用Unix程序。它可以做条件判断,循环,也有变量。但是Shell编程的体验是比较差的。它更多的功能还是编写相对简单的可执行文件。 在这个正在发展的抽象容器层,JavaScript可以取代Shell的地位。JavaScript的各方面能力都远超Bash或者Zsh。JavaScript不但可以调用Linux可执行文件,就像Shell一样,JavaScript容器也可以调用WASM。如果你的业务由计算密集型的负载,例如图片调整,那可能直接使用wasm的能力,比编写JS程序要效率更高。就好像,你不会在Bash里编写图片调整的程序一样,你调用imagemagick命令。北极星〔TheNorthStar〕 脚本语言的未来是浏览器的JavaScript。(我创始)Node。js的一个基础错误是把Node。js的API没有与浏览器做统一,反而诞生了很多自己的API。在2010年,我们没有ES模块,但是JavaScript有了ES模块,应该把这个模块标准直接带到Node。同样的事情,还发生在promises,asyncawait,fetch,stream以及更多的JavaScript新增的功能里。更不要提过时的Node自有的功能例如CommonJSrequire,package。json,nodemodules,NPM,全局process对象。这些功能应该要么被标准化,并且让浏览器提供,要么被浏览器的功能取代。(译者注,除了CommonJS这一点赞同,其他的几个功能,即便在目前看,并不是糟粕。RD写这篇文章多少有贬低node抬高deno的嫌疑,所以读者们要辩证看待他的说法。) 这种更高级别的容器的标准化还不成熟。我们不知道多会可以完善这种标准。比如,CloudflareWorkers和DenoDeply使用下面的FetchEventAPI:addEventListener(fetch,(event){event。respondWith(newResponse(Helloworld))})复制代码 也许我们也能找到更好的写法(来做标准)。结论 JavaScript是统一脚本语言。因为JavaSCript能提供的统一性,一种新的容器类似的抽象正在萌芽,并且可以简化服务端软件。 我并不是说,Linux容器会被淘汰。那个层面的抽象总是有意义的。只是对于大部分人们编写的业务逻辑来说,Linux容器过于低层级。如果你是开发一些网站的服务,你如果用Linux容器,你仍然需要写很多类似systemd配置的模版代码。 也许绝大多数web服务可以通过JavaScript容器极大的简化,而不是使用传统的Linux容器。 在Deno我们正在探索这种理念。我们的目标是极大简化服务端的抽象。如果你感兴趣,我们也在招人。 HackerNews评论〔(https:news。ycombinator。comitem?id31262542)〕。