deno如何偿还node.js的十大技术债Node.js之父RyanDahl去年初准备开发JavaScript交互式数据分析工具时,忍不住吐槽自己十年前创造的技术.RyanDahl想设计一个类似于IPython的交互式数据科学分析命令行工具,但是切换到JavaScript语言,让JavaScript也能像Python勇士一样进行各种数据分析、统计计算和数据可视化。曾经离开Node.js开发社区的RaynDahl再次拿起自己发明的Node.js来开发这个新的数据分析工具,但越用越笨拙。他开始思考如何改进Node.js。Node.js于2009年11月8日在JavaScript社区的欧洲JSConf会议上由他首次发布。它将浏览器端的JavaScript技术带入了服务器端的应用领域。前端Web工程师从来没有想过自己可以成为后端工程师,但是Node.js让前端技术走出了浏览器,前端工程师甚至可以成为全端工程师。Node.js改变了前端工程师的世界。自从RyanDahl在2009年设计了这个服务器端的JavaScript框架,现在已经发展到10版本了。与Node.js一起诞生的另一位开发者Isaac设计了JavaScript包管理工具npm,这已经成为web的必知技术开发商。超过600,000个Node.js模块已在npm存储库中注册,这使得Node.js的应用在各种开发或软件需求中大行其道。JavaScript是最流行的语言,Node.js是最流行的框架根据StackOverFlow2018年开发者调查(全球超过100,000名开发者参与),JavaScript是最受开发者欢迎的技术,近7位开发者都在使用它开发者,其渗透率高于HTML或CSS。Node.js在最易理解的开发框架中排名第一,近50%的开发者(49.6%)经常使用它,高于2017年。2019年也小幅上升了2个百分点,用户数量持续增加,远高于排名第二的Angular(36.9%)。这正是因为Node.js是一项前端和后端工程师都可以使用的技术。Node.js不仅是当前的主流技术,也是下一代Web应用架构Serverless(无服务器)架构的关键技术。微软负责AzureFunctions项目的高级首席软件工程师ChristopherAnderson曾直言,主流的Serverless服务商纷纷押注Node.js,是看中了JavaScript工具的丰富生态,再加上Node.js的轻量级,易于去中心化和水平扩展的特性,以及各种操作系统易于运行的特点,让Node.js成为了serverless服务的首选支撑框架,这也让Node.js更适合超大规模部署应用。RyanDahl自己也承认,他从来没有想过Node.js会在未来产生如此大的影响。他还将这归功于开发社区的不断完善,使其越来越成熟。截至2018年8月,已有超过2000名开发者参与Node.js,近十年来发布了500多次更新,GitHub上代码累计下载次数超过10亿次。诸如PayPal,或者顶级科研机构NASA等公司都在使用它。不过,RyanDahl在2012年开始淡出Node.js社区,随后进入了Go和Rust语言社区,又回到了自己的数学应用领域。2017年,他还申请了谷歌大脑一年实习项目,成为谷歌大脑研究团队的一员。成员,作为深度学习工程师,致力于图像处理技术的研究。直到2018年6月上旬,就在Node.js准备进入第10个年头之前,JSConfEurope再次邀请RyanDahl做开场演讲。尽管流行,Node.js仍然存在十大技术债务,两者都没有发挥作用。原本准备放弃这次演讲的RyanDahl改变了主意,简单分享了他回归Node.js后发现的问题。这是去年在全球发展界引发热议的演讲。js的10个遗憾”。RyanDahl在演讲中坦言Node.js有十个设计错误,甚至可以说是他的Top10regret(他特意用了Regret这个词来形容)!RyanDahl说的这些错误Dahl的遗憾包括没有使用Promise对象进行JavaScript异步处理,低估了安全的重要性,使用gyp来设计Build系统,继续使用gyp而不是听从社区的建议转为FFI。此外,他还觉得Node.js过于依赖npm功能(内置支持package.json是一个错误),很容易用require("")嵌入任意模块,package.json容易出现错误的模块概念(这让开发者误认为同目录下的文件是同一个模块),臃肿复杂的node_module设计,以及开发社区抱怨已久的下载黑洞问题(下载npm需要等待很长时间),require("module")函数不是强制性的注意.js扩展名和无用的index.js设计。2012年,RyanDahl离开了Node.js社区。他事后解释说,Node.js的发展一直走上正轨,达到了他最初的目标,所以他决定离开,但在2018年的这次演讲中,他承认Node.js仍然有很多问题需要解决,所以现在他回来了,来偿还当年的技术债,挽回Node.js的设计失误。RyanDahl的答案是创建一个新的服务器端JavaScript运行环境,这就是Deno项目。让RyanDahl后悔的Node.js十大技术债无用JavaScript异步处理Promise对象低估安全的重要性使用gyp设计Build系统没有听取大家的建议提供FFI继续使用gyp过度依赖npm上(buildpackage.jsonsupport里面)太容易导致require("arbitrarymodule")package.json建立错误的模块概念(同目录下的文件都是同一个模块)臃肿复杂的node_module设计下载黑hole(下载npm往往要花很长时间很长的时间)index.js的无用设计没有在require("module")时强制.js扩展名。Deno如何弥补Node.js设计的遗留问题这是Deno项目的一个例子,它是Unix系统的基本命令cat的一个实现。cat可以从标准输入中获取一个文件,然后将文件的内容逐行发送到标准输出。这个例子反映了Deno对I/O进行抽象和简化的意图。RyanDahl希望通过创建Deno来解决Node.js的三大问题,Deno是一个全新的服务器端JavaScript运行环境,包括精确的I/O接口、预设的安全性(SecurebyDefault)和引入一套去中心化的Module系统,etc最后一项是解决下载时间过长过慢的老问题。RyanDahl进一步解释说,虽然他把所有时间都花在了C++、Go或Rust等编译型语言的开发上,但仍有一些他经常做的事情需要使用动态脚本程序。例如,组织数据、协调测试任务、部署服务器或客户端环境、绘制统计图表、设置BuildSystem的参数,或者设计应用程序原型等。但是,这些针对不同目的的任务需要切换不同的脚本语言或Bash、Python、Node.js等工具,比较麻烦。2018年上半年这个交互式数据分析工具开发的挫折,让他对是否有通用的脚本工具产生了强烈的想法。Deno架构打造简单易用的通用脚本工具RyanDahl在2018年11月参加台湾一年一度的JavaScript开发者大会(JSDC)时特别提到:“我不喜欢用不同的工具来处理不同的东西。我只是想有一个简单的、直接可执行的、随手可得的工具,这就是创建Deno的初衷。”简而言之,Deno和Node.js一样使用了Chrome的JavaScript引擎V8,但是Deno采用了更严格的JavaScript语法规范TypeScript,Deno相当于一个TypeScriptruntime。Denoruntime的第一个版本是用Go语言实现的,但是RyanDahl再-开发了Rust语言的Deno运行时,避免重复使用两套垃圾收集器(一套用于Go语言,一套用于V8引擎)而影响性能。另外,TypeScript编译器也被内置到Deno运行时,Deno的目标是安全、简洁、单一可执行文件,Deno的设计目标是安全、简洁模块、单一可执行文件(简化打包),目前已经完成的特性之一最重要的是可以导入各种Module,还预设了安全性,访问物理资源或者网络都需要授权,用户代码只能在安全的沙箱中执行,为什么他最熟悉的Go做不到呢?因为“动态语言还是很有必要的”。他强调动态脚本语言是不可或缺的工具,尤其是在建立适当且易于使用的I/O处理流程(管道)时。而JavaScript是他心目中理想的动态语言。然而,Node.js是一项将近10年的技术,受限于最初的设计架构。他认为,JavaScript近年出现的特性可以重新思考。Node.js的基础设计包括可以访问原始内存的标准方法ArrayBuffers,适合弹性组合的TypeScript接口,以及新兴的异步机制Async和Await。RyanDahl将这些新的JavaScript特性放入Deno中,以设计一个新的服务器端JavaScript框架。不过这一次,他不想走Node.js的老路,把整个web服务器都放到框架里。RyanDahl决定创建一个自给自足且功能齐全的运行时程序,该程序易于携带,而不是拥有复杂的目录和结构框架。而且,打包成运行时的形式,可以部署在各种环境中。比如RyanDahl,如果Deno部署在serverless服务上,你可以指定一个URL来启动serverless服务的调用,不需要上传一段代码在serverless服务平台上执行,也可以部署到边缘计算设备上完成小数据处理任务。不信任用户的代码只能在沙箱中执行。另外,在安全机制方面,Deno设计了两层权限结构,一层是有权限的核心层,一层是没有权限的用户空间。RyanDahl解释说,这就像操作系统的设计一样,用户的代码是不可信的,用户的权限与系统核心的权限级别是区分的。用户程序要使用关键资源,必须通过系统调用,由系统内核控制。要执行的程序。Deno也是如此,“客户端的JavaScript程序不受信任,只能在安全的沙箱中执行。”所有涉及敏感资源(例如底层文件系统)的处理都需要授权才能执行。这就是预设安全的设计。包括网络访问、文件系统写入、环境变量访问和执行在内的敏感操作需要授权才能执行。此外,Deno的设计还对I/O处理进行了抽象,使得JavaScript程序不必处理各种输出或输入配置,由运行时接管,从而无法直接接触物理资源。首先,它简化了各种I/O访问方式。无论是本地还是远程I/O,都可以用同样的读写指令完成。其次,它还可以增强安全性。另外,Deno也借鉴了很多Go语言的特性,比如Deno的copy()参考了Go语言的io.Copy(),BufReader()也参考了Go语言的bufio.Reader的设计等,用于测试机制,文件等,RyanDahl也提到了他熟悉的Go语言。指定URL嵌入第三方函数库Deno第三个设计目标是创建一个去中心化的模块系统。RyanDahl的设计是Deno可以像JavaScript一样通过URL嵌入外部第三方函数库。此外,Deno和Rust语言之间还有很多集成。即使在转用Rust实现Deno之后,RyanDahl透露会建立一个桥接机制,让Deno可以方便地使用Rust中的函数库。不过他坦言,嵌入外部第三方函数库的机制也是Deno项目发布后问得最多、最担心的功能。他们担心通过URL引入外部函数库可能容易导致安全问题或中间人攻击。问题。“这就是Deno采用默认安全设计来隔离来自外部第三方代码的威胁的原因。”另外,当通过URL链接到第三方函数库时,Deno会通过缓存在本地环境中生成一份副本,第二次调用同一个URL时不需要再次下载第三方函数库,从而加快执行速度。甚至这个通过外部URL引用函数库的函数也可以指定版本,即使修改了,依然可以指向旧版本。当然,RyanDahl强调,所有访问外部网络或下载和写入本地文件的操作都需要授权才能执行。未来会支持WebGL,Deno可以调用GPU资源。Deno和Node.js最大的区别是未来会支持机器学习。RyanDahl透露,他们正在开发一个用于数值计算的插件模块。最重要的是支持GPU,这也是机器学习模块最需要的功能。“Deno未来会原生支持WebGL,让JavaScript程序可以调用GPU资源,这是他打造Deno的目标之一。”甚至,RyanDahl预测TensorFlowJS未来可能会在Deno上执行,因为TensorFlowJS也使用了WebGL。未来,Deno将针对小规模机器学习的推理需求。与Nvidia的CUDA可以用来调度多个GPU资源进行复杂的机器学习训练不同,RyanDahl解释说,Deno想要提供的是简单而足够的机器学习能力,能够支持WebGL就足以满足计算需求只有一个GPU,而且它很小或只需要推理。Deno从2018年5月中旬到今年3月一直在Github网站上开源。参与开发者80余人,经常贡献代码的核心开发者有5人。目前主要关注默认安全架构的功能设计。最后,企业可以使用Deno吗?RyanDahl坦言,Deno距离1.0还有很长的路要走,仍然是一项非常新的技术。不过,“再等一年,如果有公司想用,请发邮件给我,我会提供技术支持。”他认真地说。关于RyanDahl2009年11月8日,Node.js之父RyanDahl在欧洲JSConf大会上首次发布了Node.js。然而,他在2012年开始淡出Node.js社区,进入了Go和Rust语言社区。2017年加入谷歌大脑研究团队,担任深度学习工程师。现在是一名自由开发者。2018年6月上旬,RyanDahl在JSConf欧洲大会上公布了Node.js的十大遗憾,并推出了全新的服务器端JavaScript运行时解决方案Deno。
