自从 deno 1.0 发布以来,有关 deno 的文章很多,大多数都是在讨论怎样装置 deno 、deno 有哪些特点 、deno 和 node 有哪些异同、deno是不是 node 的替代品等。咱们今日不讨论这些,究竟 Talk id + 7 ` 3 Q 1s cheap. Sq Y 9 Ohow me+ 8 n ` the code! 亲身体验一把 deno 开发带来的快H k { d X e感、用 deno 搞一个m 4 s ,“企业级”运用:d0 6 @ ( ven! G T 3 v j ^o-supermarket,难道不香吗?

deno 常见的一些坑

在实战之前,仍是先来介绍几个我在刚触摸 deno 时遇到的小坑。

权限标志符位置的问题

咱们都知道, deno 默认是安全的,就是导致了默认情况下是不允许访问网络、读写文件等。比方有个名为 index.ts 的文件_ _ k U x n : R F内容如下:

import { serve } from "https://P u K T C q } ! Edeno.land/std@0.50.0/http/server.ts";
const s = serve({ port:L P t 8000 });
consoV a 2 -le.log("http://localhost:8000/");
for await (const req ofm i + % 7 = s) {
req.respond({ body: "Hello Wors q {ldn" });
}

假如直接履行 deno run index.ts, 会报错z l X )

error: Uncaught PermissionDenied: network access to "0.0.0.0:8000", run again with the --allow-net flag

所以咱们很自然的就会在启动指令的最后加上 --allow-net ,如下:

deno run index.ts --allow-net

可是,这样仍然会报错。查了资料才知道 ,--allow-net--allow-read 之类的标志是不能4 W X L – % l够放到文件名后边的,必须紧跟在 deno run 后边,比方,如下才是正确的:

deno run --alow-n; ( g 6 9 T D het index.ts

H h H什么调换了位置就不可呢? issue 上的答复是,假如 --allow-net 跟在文件名后边,是传给 js 脚本的,而不是传给 deno 的。想了解更多的,能够看这个 confused by order of cli optioj ; T } Vn flags。横竖,记住一点就行:权限标志一定要跟在 deno run 后边!

由于咱们前端同学大多数平常很少写后台,不太清楚安全的重要性,为了防止遇到各种权限问题,我建议平常在写一些练手项目时,直接用 deno= O 6 $ ^ J 0 run -A 来启用悉数的权限。(这只是方便调试,在生产环境中一定要慎用!)

不安稳的 API

由于实战进程中运用了 mongodb , 所以需求引进 Deno 的第三方模块 mongo,然而在启动项目会报错:

error: TS2339 [ERROR]: Property 'openPlugin' does not exist on type 'typeof Deno'.

查了一下,发现是由于 openPlugin 这个方法现在还不安稳M e J [ ? `。默认情况下,deno 只会提供安稳的 api。假如需求开启不安稳 api,能够增加 --stable 标志。比方:

deno run -A --unstable index.ts

可能有人会问,-A--unstable 的位置调换会不会有问题。这个亲测过不会有问题。只要标志符在文件称号之前就行了。

还有个问题,到底哪些是安稳 API,@ T Q哪些是不安稳 API 呢?其实 deno 官方文档现已帮咱们分好类的了,进口$ 4 h _ d 4地址分别是:

  • 安稳的 am ; epi 文档
  • 不安稳的 api 文档

假如你怀S S 3 d--unsta6 ; F 2 m $ N ? Zble 的效果,能够运M { T k 1 . 1 H P用下面的方法打印出 Denof { F B V 上的一切成员:

console.log(Object.keys(Deno).length)

运用 deno run --unstable index.ts 输出的结果是 117,运用 deA ^ L t M d T Mno runP . k index.ts 输出的结果是 88 。阐明安稳的 api 有 88 个,不安稳的有 2I % | Q X r i9 个。

deno 的一些运用技巧

从 node 切换到 deno, 咱们的开发思想也要P 4 ?随之改变。所以P @ m,咱们再来看看 dd W R U a G .eno 的一些和 node 不一样的开发^ T [ 4 @ D | k技巧。

如何N ) P : ] o . y办理版别?

刚开始我也很疑惑:没有了 package.json, 那怎样控制各依靠的版别呀?比方,咱们有10个文件b u 8都依靠了 mongo@v0.0.6, 那每个文件都运用以下代码进行引进:

 import { init, MongoClE 4 n R B bient } from 'https://deno.land/x/mongo@v0.6.0/mod.d d ( A 6 ) w & Yts'

可是有一天,我突然想把 0.6.0 升级到 0.7.0, 那怎样办呢?一个5 ; S个文件的进行替换简单漏掉,当然也能够大局搜索批量替换 。可是这种效率都不是很高。

官方给出的推荐做法是,运用 deps.ts 文件来引进长途文件,并办理版别。(当然 ,P T ( l x文件称号% z (不一定叫做 d5 I )eps.ts, 你也能够改成其他的称号)。具体做法就是,把一切用到的长途依靠,都在 deps.ts 中引进 ,而且经过 Re-export 手法导出各依靠,然后其他文件就能够% r Jdeps.ts 中拿到所需. U w K求的依靠了。

回到刚才说10个文件都依靠到 mongo 的问题,假如改成 deps.ts 文件来统一办理是这样的:

export * from K 6 +'https://deno.land/x/mongo@v0.6.0/my * % a | ( = Nod.ts'

然后那些需求用到 mongoQ / s ^ _ & r O t 的文件,不要直接从长途引进,而是从 deps.ts 中引进,如下:

import { init, MongoClient } from '../pathT( O ^  _ S - o/deps.ts';

假如需求升级的话,咱们能够直接9 _ o A D 9 Hdeps.ts 里边的 mongo 地址中的 0.6.0 改成 0.7.0 就行了。

别的,有一点和 npm 相似的是,假如没@ 0 f 5有指定版别号,即长途地址中没有指定版别,比方:

export * from 'https://deno.land/x/mongo/mod.ts'

就会默认装置最新版的依靠。

如何查找一些对我有用的 deno 库?

运用 node ,能够到 npm 上查找一些库。deno 也有相似的平台,现在分为两种库,一种是官方b a c 5 V规范的,别的一种是第三方的。规范库能够到这儿查找:Deno Standard Modules。第三方库能够到这儿查找: Deno Third Party Modules

实战: 运用 deno 开发一个具有增删查改的商城体系

O6 4 a [ C _ (K, 具有以上的知识6 _ K点,现在能够实战了j Q ? _ – D。首先,需求保证你的电脑装置了 deno 1.0 。别的,由于用到了 mongodb ,所以需求你的电脑也要装置 mongodb。

界面

先来看看咱们的商城的界面:

Deno + mongodb 实战踩坑记

麻雀虽小五脏俱全哈!具有增加产品、查询产( r 品、删去产品、修正产品的功用。这是典型的 REST API 风格的体系 。

项目结构

然后再来看看项目结构:w c t f & R ?

Deno + mongodb 实战踩坑记
  • .deno_plugins: 这是 mongo 模块所下载的动态链接库,不必重视它。
  • congig/db.ts: 这是连接 mongodb 的相关配置文件。现在I / x %写死的端口号是 27017 , 假如你的 mongodb 端口不是这个,能够在这个文件里边修正。
  • controllers/goods.ts: 这是完成增删查改的逻辑代码
  • public/index.html: 这是q 5 k } K . 1前端静态页面,跟 deno 无关的,咱们g 8 c 6只需求用 deno 来服务该目录就行。
  • deps.ts: 用来办理长途依靠库,然后 Re-export 出去给其他文件运用。
  • server.ts9 f J 9 A 进口文件,跟咱们用 epress 或 koa 时的进口 文? 0 N m件 app.js 相似。

依靠模块的挑选

由于该项目触及到了前后端,假如运用 node 的话,一般会挑选 express 或 koa。同样的,咱们运用 deno 也要挑选对应的框架 ,否则的话,http服务以及路由跳转等都不是那么简单处理的。deno 上的这类框架,比较多人 staC / @r 的是 oak 和 ab_ 5 . X H 8 c,这f ^ a儿咱, p l n =们挑选运用 abc。

别的,由于运用 mongodb , 所以还需求引进 mongo

结束语

好啦,对于 deno 初体验就写到这啦, 具体的代码这& } a 0 2 } F儿不打算贴出来了,有兴趣的能够前往 githubj # m F 查看:

  • deno-supermarket

有问题的能够一同交流学习哈~