翻译者:兰博基尼
您在责任编辑上将了解Node.js和Deno、CommonJS与ECMAScript组件间的差别、将TypeScript与Deno紧密结合采用,和采用Deno Deploy展开更慢的布署。结尾附上注解,协助您决定下一个合作开发项目采用Node.js还是Deno。
Node.js概要
Node.js是虚拟化的JavaScript运转时自然环境,对服务器插件和图形界面插件都很管用。它运转向控制系统注册登记的单缓存该事件循环式来处置相连,每一新相连单厢促发JavaScript反弹表达式。反弹表达式能采用非堵塞I/O初始化处置允诺。若有必要性,它能从池中聚合缓存,以继续执行堵塞型或CPU专门化操作,并在CPU核心理念间均衡阻抗。
绝大多数计划性构架采用缓存展开扩充,包括Apache HTTP Server、各种JavaArcGIS、IIS和ASP.NET和Ruby on Rails。相对而言,Node采用反弹表达式展开扩充,这种方法只需极少的缓存就能处置更多的相连。
Node插件并不仅指单纯的JavaScript。您能采用任何转录成JavaScript的词汇,比如说TypeScript和CoffeeScript。Node.js包涵Google Chrome V8 JavaScript发动机,该发动机支持ECMAScript 2015(ES6)句法,显然不需要Babel等等的ES6-to-ES5转录器。
Node的商业用途主要来自其巨大的应用软件库,该库可通过npm指示来出访。NPM的全名是Node应用软件指示行,是标准Node.js加装控制系统的一部分,不过它有自己的中文网站。
如前所述JavaScript的Node.js网络平台由Ryan Dahl于2009年面世。原本合作开发这个极具可扩充性的网络平台是为了代替面向全国Linux和MacOS的Apache HTTP Server。NPM由Isaac Schlueter撰写,于2010年面世。Node.js的原生植物Windows版于2011年首度现身。
Deno概要
Deno是面向全国JavaScript和TypeScript的安全可靠运转时自然环境,已特别针对WebAssembly、JavaScript XML(JSX)及其TypeScript扩充TSX展开了扩充。Deno由Node.js的创建者合作开发,试图重新构思Node,充分利用自2009年以来JavaScript方面的进步,包括TypeScript编译器。
与Node.js一样,Deno本质上是Google V8 JavaScript发动机外面的外壳。与Node不同,它在其可继续执行映像中包涵TypeScript编译器。创建了这两个运转时自然环境的Dahl曾表示,Node.js存在三个主要问题:如前所述集中式分发的设计欠佳的组件控制系统、必须支持的许多遗留API和缺乏安全可靠性。Deno全部解决了这三个问题。
Node的组件控制系统问题通过2022年年中的更新得到了解决。
CommonJS组件和ECMAScript组件
Node创建之时,JavaScript组件的事实标准是CommonJS,这是npm最初支持的。此后,ECMAScript委员会正式支持ECMAScript组件(又叫ES组件),它得到jspm应用软件指示行的支持。Deno也支持ES组件。
对ES组件的实验性支持已添加在Node.js 12.12中,从Node.js 16版成了稳定功能。 TypeScript 4.7也为Node.js 16支持ES组件。
在JavaScript中加载CommonJS组件的方法是采用require语句。加载ECMAScript组件的方法是采用import语句和匹配的export语句。
最新的Node.js拥有CommonJS和ES组件的加载器。它们有何不同?CommonJS加载器是完全同步的,负责处置require()初始化;支持文件夹作为组件;如果在require()调用中省略了扩充名(.js、.json或.node),能尝试添加扩充名。CommonJS加载器不能用于加载ECMAScript组件。ES组件加载器则是异步的,负责处置import语句和import()表达式;不支持文件夹作为组件(必须完整指定目录索引,比如说./startup/index.js);不搜索扩充名;并且只接受JavaScript文责任编辑件的.js、.mjs和.cjs扩充名。ES组件可用于加载JavaScript CommonJS组件。
为什么Deno的安全可靠性更高?
众所周知,Deno提高了Node.js的安全可靠性。这主要是由于Deno在默认情况下不允许程序出访磁盘、网络、子进程或自然环境变量。如果您需要出访其中任何一项,能采用指示行标志选择加入,这个标志的细粒度有多高就看您喜欢了,比如说–allow-read=/tmp或–allow-net=google.com。Deno的另一个安全可靠改进是,它总是一发现未捕获的错误就终结。相对而言,Node允许在未捕获的错误后继续继续执行,结果无法预测。
能紧密结合采用Node.js和Deno吗?
当您考虑是否将Node.js或Deno用于下一个服务器端JavaScript项目时,可能想知道是否能紧密结合采用两者。答案是“也许能”。
首先,从Deno采用Node应用软件往往是可行的。更棒的是,许多常见的阻碍有解决的方法。这包括采用Deno 标准库的std/node组件来“polyfill”Node的内置组件;采用CDN出访绝绝大多数npm应用软件,并确保适用于Deno;采用导入图(import maps)。此外,从Deno1.15开始,Deno拥有Node兼容模式。
缺点是,Node 的插件控制系统与Deno不兼容;Deno的Node兼容模式不支持TypeScript;几个内置的Node组件(比如说vm)与Deno不兼容。
如果您是考虑换成Deno的Node用户,这里有一份速成表有所协助。
将TypeScript与Deno一起采用
Deno将TypeScript视为头等词汇,就像JavaScript或WebAssembly一样。它紧密结合采用Deno中内置的TypeScript编译器和名为swc的Rust库,将TypeScript(和TSX和JSX)转换成JavaScript。代码经过类型检查(如果启用检查)并转换后,存储在缓存中。换句话说,与Node.js或浏览器不同,您不需要采用tsc编译器手动为Deno转录TypeScript。
从Deno 1.23开始,默认情况下Deno中没有TypeScript类型检查。由于绝大多数合作开发人员通过编辑器与类型检查器展开交互,因此在Deno启动时再次展开类型检查没多大意义。话虽如此,您能采用–check标志启用类型检查。
Deno Deploy实现更慢的布署
Deno Deploy是一个分布式控制系统,允许您在全球各地靠近用户的地方(即边缘)运转JavaScript、TypeScript和WebAssembly。Deno Deploy服务器与V8运转时自然环境深度集成,提供最小的延迟,消除不必要性的抽象。您能采用Deno CLI在本地合作开发脚本,然后在不到一秒的时间内将其布署到Deno Deploy的托管基础构架,无需展开任何配置。
Deno Deploy建立在与Deno CLI相同的现代控制系统上,以全球可扩充的方式提供最新、最出色的Web技术:
在Web上构建:采用fetch、WebSocket或URL,就像在浏览器中一样。对TypeScript和JSX的内置支持:类型安全可靠的代码和直观的服务器端渲染,无需构建这一步。与Web兼容的ECMAScript组件:像在浏览器中一样导入依赖项,无需显式加装。GitHub 集成:推送到分支,查看已布署的预览,并合并以发布到生产自然环境。速度极快:不到一秒即可布署;服务全球,靠近用户。
从URL来布署:仅采用URL即可布署代码。
Deno Deploy有两种版。免费版仅指每天100000个允诺、每月100 GiB数据传输量和每一允诺10毫秒的CPU时间。专业版每月收费10美元,包括每月500万次允诺和100 GiB数据传输量,加上每月每多出1百万次允诺就收费2美元,和超过配额后每传输1 GiB 数据就收费0.30美元;专业版允许每一允诺50毫秒的CPU时间。
选择哪一个:Node.js还是Deno?
如您所料,至于哪种技术更适合您的用例,答案取决于许多因素。我的结论是,如果您现有的Node.js布署没坏掉,别修复它。如果您打算用TypeScript撰写一个新项目,我强烈建议考虑Deno。然而,如果您的TypeScript项目需要采用多个没有Deno同等应用软件的 Node.js应用软件,需要权衡Deno项目的可行性。从概念验证入手几乎必不可少:如果不尝试一下,很难预测您是否可以让某个Node.js应用软件在Deno中工作。