当前位置: 首页 > 科技观察

DenovsNode.js:哪个更好?_0

时间:2023-03-13 16:03:14 科技观察

翻译|布加迪评论|SunShujuan在本文中,您将了解Node.js和Deno、CommonJS和ECMAScript模块之间的区别,将TypeScript与Deno结合使用,并使用DenoDeploy进行更快的部署。末尾有注释可帮助您决定是在下一个开发项目中使用Node.js还是Deno。Node.js简介Node.js是一个跨平台的JavaScript运行时环境,可用于服务器应用程序和桌面应用程序。它运行一个向系统注册的单线程事件循环来处理连接,每个新连接都会触发一个JavaScript回调函数。回调函数可以使用非阻塞I/O调用来处理请求。如有必要,它可以从池中生成线程以执行阻塞或CPU密集型操作并平衡CPU内核之间的负载。大多数竞争架构都使用线程进行扩展,包括ApacheHTTP服务器、各种Java应用程序服务器、IIS和ASP.NET以及RubyonRails。相比之下,Node使用回调函数进行扩展,这种方法可以用更少的内存处理更多的连接。节点应用程序不限于纯JavaScript。您可以使用任何可转换为JavaScript的语言,例如TypeScript和CoffeeScript。Node.js包含GoogleChromeV8JavaScript引擎,它支持ECMAScript2015(ES6)语法,并且根本不需要像Babel这样的ES6到ES5转译器。Node的实用性主要来自其庞大的包库,可通过npm命令访问。NPM代表NodePackageManager,是标准Node.js安装系统的一部分,但它有自己的网站。基于JavaScript的Node.js平台于2009年由RyanDahl推出。这个更具可扩展性的平台最初是作为用于Linux和MacOS的ApacheHTTP服务器的替代品而开发的。NPM由IsaacSchlueter编写并于2010年推出。Node.js的原生Windows版本于2011年推出。Deno简介Deno是一个用于JavaScript和TypeScript的安全运行时环境,针对WebAssembly、JavaScriptXML(JSX)及其TypeScript扩展TSX进行了扩展。Deno由Node.js的创建者开发,旨在重新构想Node,以利用自2009年以来JavaScript的进步,包括TypeScript编译器。与Node.js一样,Deno本质上是围绕Google的V8JavaScript引擎的外壳。与Node不同,它在其可执行映像中包含TypeScript编译器。创建这两个运行时环境的Dahl表示,Node.js存在三个主要问题:基于集中分布的设计不佳的模块系统、它必须支持的许多遗留API以及缺乏安全性。Deno解决了这三个问题。2022年中期更新解决了Node的模块系统问题。CommonJS模块和ECMAScript模块Node创建时,JavaScript模块的事实标准是CommonJS,最初由npm支持。从那时起,ECMAScript委员会正式支持ECMAScript模块(又名ES模块),由jspm包管理器提供支持。Deno还支持ES模块。Node.js12.12中添加了对ES模块的实验性支持,并成为Node.js16版本的稳定功能。TypeScript4.7还支持Node.js16的ES模块。在JavaScript中加载CommonJS模块的方法是使用require语句。加载ECMAScript模块的方法是使用带有匹配导出语句的导入语句。最新的Node.js具有CommonJS和ES模块的加载器。它们有何不同?CommonJS加载器是完全同步的,负责require()调用;支持文件夹作为模块;如果在require()调用中省略了扩展名(.js、.json或.node),可以尝试添加它们。CommonJS加载器不能用于加载ECMAScript模块。ES模块加载器是异步的,负责处理import语句和import()表达式;不支持文件夹作为模块(目录索引必须完整指定,例如./startup/index.js);不搜索扩展;并且仅接受JavaScript文本文件的.js、.mjs和.cjs扩展名。ES模块可用于加载JavaScriptCommonJS模块。为什么Deno更安全?众所周知,Deno可以提高Node.js的安全性。这主要是因为Deno默认不允许程序访问磁盘、网络、子进程或环境变量。如果您需要访问其中任何一个,您可以使用命令行标志选择加入,如您喜欢的粒度,例如--allow-read=/tmp或--allow-net=google.com。Deno的另一个安全改进是它总是在发现未捕获的错误后立即终止。相比之下,Node允许在出现无法预测的结果的未捕获错误后继续执行。Node.js和Deno可以一起使用吗?当您考虑为下一个服务器端JavaScript项目使用Node.js还是Deno时,您可能想知道是否可以将两者结合起来。答案是“也许”。首先,通常可以使用Deno的Node包。更好的是,许多常见障碍都有解决方法。这包括使用Deno标准库的std/node模块来“polyfill”Node的内置模块;使用CDN访问大多数npm包并确保它们与Deno一起工作;使用导入地图。另外,从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。从Deno1.23开始,默认情况下Deno中没有TypeScript类型检查。由于大多数开发人员通过编辑器与类型检查器交互,因此在Deno启动时再次进行类型检查没有多大意义。话虽如此,您可以使用--check标志启用类型检查。DenoDeploy用于更快的部署DenoDeploy是一个分布式系统,允许您在靠近全球用户(即边缘)的地方运行JavaScript、TypeScript和WebAssembly。DenoDeploy服务器与V8运行时环境深度集成,提供最小延迟并消除不必要的抽象。您可以使用DenoCLI在本地开发脚本,然后在不到一秒的时间内将它们部署到DenoDeploy的托管基础??设施,无需任何配置。DenoDeploy建立在与DenoCLI相同的现代系统上,以全球可扩展的方式提供最新最好的Web技术:建立在Web上:使用fetch、WebSocket或URL,就像在浏览器中一样。内置对TypeScript和JSX的支持:类型安全代码和直观的服务器端渲染,无需构建此步骤。Web兼容的ECMAScript模块:像在浏览器中一样导入依赖项,无需显式安装。GitHub集成:推送到分支机构,查看已部署的预览,并合并以发布到生产环境。极速:不到一秒即可部署;服务全球,贴近用户。?从URL部署:仅使用URL部署代码。DenoDeploy有两个版本。免费版限制为每天100,000个请求、每月100GiB的数据传输以及每个请求10毫秒的CPU时间。Pro计划每月收费10美元,包括每月500万个请求和100GiB的数据传输,每月每增加100万个请求再加2美元,超过配额后每GiB的数据传输0.30美元;专业版允许每个请求占用50毫秒的CPU时间。选择哪个:Node.js还是Deno?正如您所料,哪种技术更适合您的用例取决于许多因素。我的结论是,如果您现有的Node.js部署没有损坏,请不要修复它。如果您打算用TypeScript编写一个新项目,我强烈建议您考虑Deno。但是,如果您的TypeScript项目需要使用多个没有Deno等效项的Node.js包,您需要权衡Deno项目的可行性。从概念验证开始几乎是必不可少的:如果不尝试,很难预测是否可以让Node.js包在Deno中工作。原标题:Denovs.Node.js:哪个更好?,作者:MartinHeller