从Node到Deno

2020-05-17 23:49:34

上周我发表了一篇关于Deno的文章,以及如何使用Deno和Preact创建聊天应用程序。从那时起,出现了许多疑问。他们中的大多数都是关于如何做我们在Node中做过的相同的事情,但是是关于新的Deno生态系统。

我试着收集了Node中一些最常用的主题,并寻找它们与Deno的替代方案。首先,我想说明一下,我们可以使用许多当前的Node.js模块。没有必要为所有事情寻找替代方案,因为许多模块都是可重用的。您可以访问pika.dev来查找要在Deno中使用的模块。也就是说,让我们从下面的清单开始吧:

有了Node.js,我们可以使用Electron创建桌面应用程序。电子使用Chromium作为界面来运行Web环境。但是,我们能把电子和德诺一起用吗?还有其他选择吗?

嗯,现在电子还远远不能在德诺的统治下被处决。我们必须寻找替代方案。因为Deno是用Rust制作的,所以我们可以使用web-view rust绑定在Deno中运行Destkop应用程序。

这样,我们就可以使用原生操作系统Webview来运行任意多个Webview。

从";https://deno.land/x/webview/mod.ts";;const contentType=';text/html';const sharedOptions={Width:400,Height:200,Resizable:TRUE,DEBUG:TRUE,NETWORM:FALSE,};导入{Webview};const webview 1=new Webview({title:";Multiple Deno_Webview Example";,url:`data:${contenttype},<;html>;<;body>;<;h1>;1<;/h1>;<;/body>;<;/html>;`,.。sharedOptions,});const webview2=new WebView({title:";Multiple Deno_webview Example";,url:`data:${contentType},<;html>;<;body>;<;h1>;2<;/h1>;<;/body>;<;/html>;`,.。共享选项,});等待承诺。全部([webview1.。run(),webview2。run()]);

Foreve和PM2是用于确保给定脚本作为守护进程连续运行的CLI工具。与Forever不同的是,PM2更完整,并且还充当负载均衡器。两者在Node中都非常有用,但是我们可以在Deno中使用它们吗?

永远仅用于节点,因此使用它是不可行的。另一方面,使用PM2,我们可以运行非节点脚本,因此我们仍然可以将其用于Deno。

Express和Koa是最著名的Node框架。它们以其健壮的路由系统和HTTP助手(重定向、缓存等)而闻名。我们可以在德诺使用它们吗?答案不是..。但也有一些替代方案。

Deno自己的STD库已经涵盖了Express或Koa提供的许多需求。https://deno.land/std/http/.。

从";https://deno.land/std/http/server.ts";导入{getCookie};从";https://deno.land/std/http/cookie.ts";;let Request=new ServerRequest();请求导入{serverRequest}。Headers=新的Header();请求。标题。设置(";Cookie";,";Full=of;Tasty=巧克力";);const cookies=getCookies(Request);控制台。日志(";cookies:";,cookies);

然而,申报路线的方式并不是很有吸引力。因此,让我们来看看更多的替代方案。

从";https://deno.land/x/oak/mod.ts";;const app=new Application();app导入{应用程序,}。使用((Ctx)=>;{ctx.。回应。Body=";Hello World!";;});等待APP。监听({port:8000});

从";https://deno.land/x/abc/mod.ts";;const app=new Application();app导入{Application}。静态(";/static&34;,";资产";);应用程序。GET(";/hello";,(C)=>;";Hello!";)。启动({port:8080});

将*作为Exp从";https://raw.githubusercontent.com/NMathar/deno-express/master/mod.ts";;const port=3000;const app=new exp导入。app();app。使用(例如。static_(";./public";));应用。使用(例如。bodyParser。json());app.。get(";/api/todos";,async(req,res)=>;{等待res.。json([{name:";买点牛奶";}]);});const server=等待APP。监听(端口);控制台。log(`app侦听端口${server.。port}`);

MongoDB是一个具有巨大伸缩性和灵活性的文档数据库。在JavaScript生态系统中已经被广泛使用,有许多像Mean或MERN这样的堆栈使用它。它很受欢迎。

所以,是的,我们可以将MongoDB与Deno一起使用。为此,我们可以使用此驱动程序:https://github.com/manyuanrong/deno_mongo.。

从";https://deno.land/x/[email protected]/mod.ts";;//初始化插件等待init();const client=new mongoClient();客户端导入{init,mongoClient}。connectWithUri(";mongodb://localhost:27017";);const db=client。数据库(";test";);常量用户=db.。Collection(";Users";);//INSERT常量INSERTID=等待用户。insert One({username:";user1";,password:";pass1";});//findOne常量user1=等待用户。findOne({_id:insert tId});//查找常量用户=等待用户。find({username:{$ne:null}});//聚合常量文档=等待用户。Aggregation([{$Match:{username:";Many";}},{$group:{_id:";$username";,总计:{$sum:1}]);//updateOne const{matchedCount,modfiedCount,upsertedId}=等待用户。updateOne(username:{$ne:null},{$set:{username:";username";});//delete eOne常量delete eCount=等待用户。delete One({_id:insert tId});

从";https://deno.land/x/postgres/mod.ts";;const client=new client({User:";user";,database:";test";,hostname:";localhost";,port:5432});导入{Client};等待客户端。connect();const result=等待客户端。查询(";SELECT*FROM People;";);控制台。日志(结果。行);等待客户端。end();

从";https://deno.land/x/mysql/mod.ts";;const client=导入{Client}等待新客户端()。connect({hostname:";127.0.0.1";,username:";root";,db:";dbname";,poolSize:3,//连接限制密码:";password";,});让result=等待客户端。EXECUTE(`INSERT INTO USERS(Name)VALUES(?)`,[";aralroca";,]);console。log(Result);//{affectedRows:1,lastInsertId:1}。

从";https://denopkg.com/keroxp/deno-redis/mod.ts";;const redis=等待连接({主机名:";127.0.0.1";,端口:6379})导入{CONNECT};const ok=等待redis。set(";Example";,";This is a Example";);Const Example=Await redis。GET(";示例";);

Nodemon在开发环境中用于监视文件中的任何更改,自动重启服务器。这使得节点开发更加愉快,无需手动停止和重新启动服务器即可看到应用的更改。可以在德诺使用吗?

在Node.js生态系统中,测试者有很多选择。然而,没有一种官方方法可以测试Node.js代码。

Deno的优点之一是,我们可以将ESmodule与TypeScript一起使用,而不需要webpack、Parcel或Rollup等捆绑器。

然而,您可能想知道,如果给定一棵文件树,我们是否可以将所有内容都放在一个文件中,以便在Web上运行它。

嗯,是的,这是可能的。我们可以使用Deno的CLI来做到这一点。因此,不需要第三方捆绑器。

在过去的几年里,更漂亮已经在JavaScript生态系统中广为人知,因为有了它,您就不必担心格式化文件了。

事实是,它仍然可以在Deno上使用,但它失去了意义,因为Deno有自己的格式化程序。

使用Deno时,Package.json将不复存在。我非常怀念的一件事是在Package.json中声明的脚本。

一个简单的解决方案是使用Makefile并使用make执行它。但是,如果您错过了NPM语法,可以为Deno提供一个NPM风格的脚本运行器:

NVM是用于管理多个活动节点版本的CLI,可根据您的项目轻松升级或降级版本。

近年来,NPX在执行NPM包时变得非常流行,而不必安装它们。现在,许多项目不会存在于NPM中,因为Deno是一个独立的生态系统。那么,我们如何才能执行DENO模块,而不必使用Deno Install https://url-of-module.ts?安装它们

与我们运行项目的方式相同,我们将模块的URL放入模块的URL中,而不是放入文件:

如您所见,我们不仅需要记住模块的名称,还要记住整个URL,这使得它的使用更加困难。另一方面,它提供了更大的灵活性,因为我们可以运行任何文件,而不仅仅是像npx这样在Package.json中指定为二进制文件的文件。

从海德/阿尔卑斯山-德诺出发:1.0.0号港口。WORKDIR/APP用户拒绝复制部门。运行deno cache dess.ts#缓存deps add。。运行Deno cache main.ts#main入口点。CMD[";--Allow-Net";,";main.ts";]。

要将Deno用作lambda,在Deno STD库中有一个模块。https://deno.land/x/lambda.。

从";https://deno.land/x/lambda/mod.ts";;导出异步函数处理程序(Event:APIGatewayProxyEvent,Context:Context)导入{APIGatewayProxyEvent,APIGatewayProxyResult,Context}:Promise<;APIGatewayProxyResult>;{Return{Body:`欢迎使用Deno${deno.。版本。Deno}🦕`,标题:{";Content-Type";:";Text/HTML;Charset=utf8";},statusCode:200};}。

我确信我忘记了一些Node主题和它们的Deno替代方案,如果我错过了什么您想让我解释的地方,请告诉我。我希望这篇文章能帮助你和德诺打破僵局。