自从 deno 1.0 发布以来,有关 deno 的文章不少,大多数都是在讨论怎么安装 deno 、deno 有哪些特色 、deno 和 node 有哪些异同、deno是否是 node 的替代品等。我们今天不讨论这些,毕竟 Talk is cheap. Show me the code! 亲自体验一把 deno 开发带来的快感、用 deno 搞一个“企业级”应用:deno-supermarket,难道不香吗?html
在实战以前,仍是先来介绍几个我在刚接触 deno 时遇到的小坑。前端
咱们都知道, deno 默认是安全的,就是致使了默认状况下是不容许访问网络、读写文件等。好比有个名为 index.ts 的文件内容以下:node
import { serve } from "https://deno.land/std@0.50.0/http/server.ts"; const s = serve({ port: 8000 }); console.log("http://localhost:8000/"); for await (const req of s) { req.respond({ body: "Hello World\n" }); }
若是直接执行 deno run index.ts
, 会报错:git
error: Uncaught PermissionDenied: network access to "0.0.0.0:8000", run again with the --allow-net flag
因此咱们很天然的就会在启动命令的最后加上 --allow-net
,以下:github
deno run index.ts --allow-net
可是,这样仍然会报错。查了资料才知道 ,--allow-net
、--allow-read
之类的标志是不能够放到文件名后面的,必须紧跟在 deno run
后面,好比,以下才是正确的:mongodb
deno run --alow-net index.ts
为何调换了位置就不行呢? issue 上的回答是,若是 --allow-net
跟在文件名后面,是传给 js 脚本的,而不是传给 deno 的。想了解更多的,能够看这个 confused by order of cli option flags。反正,记住一点就行:权限标志必定要跟在 deno run
后面!express
由于咱们前端同窗大多数平时不多写后台,不太清楚安全的重要性,为了不遇到各类权限问题,我建议平时在写一些练手项目时,直接用 deno run -A
来启用所有的权限。(这只是方便调试,在生产环境中必定要慎用!)npm
由于实战过程当中使用了 mongodb , 因此须要引入 Deno 的第三方模块 mongo,然而在启动项目会报错:json
error: TS2339 [ERROR]: Property 'openPlugin' does not exist on type 'typeof Deno'.
查了一下,发现是由于 openPlugin
这个方法目前还不稳定。默认状况下,deno 只会提供稳定的 api。若是须要开启不稳定 api,能够添加 --stable
标志。好比:后端
deno run -A --unstable index.ts
可能有人会问,-A
和 --unstable
的位置调换会不会有问题。这个亲测过不会有问题。只要标志符在文件名称以前就好了。
还有个问题,到底哪些是稳定 API,哪些是不稳定 API 呢?其实 deno 官方文档已经帮咱们分好类的了,入口地址分别是:
若是你怀疑 --unstable
的做用,可使用下面的方法打印出 Deno
上的全部成员:
console.log(Object.keys(Deno).length)
使用 deno run --unstable index.ts
输出的结果是 117,使用 deno run index.ts
输出的结果是 88 。说明稳定的 api 有 88 个,不稳定的有 29 个。
从 node 切换到 deno, 咱们的开发思惟也要随之转变。因此,咱们再来看看 deno 的一些和 node 不同的开发技巧。
刚开始我也很疑惑:没有了 package.json
, 那怎么控制各依赖的版本呀?好比,咱们有10个文件都依赖了 mongo@v0.0.6
, 那每一个文件都使用如下代码进行引入:
import { init, MongoClient } from 'https://deno.land/x/mongo@v0.6.0/mod.ts'
但是有一天,我忽然想把 0.6.0 升级到 0.7.0, 那怎么办呢?一个个文件的进行替换容易漏掉,固然也能够全局搜索批量替换 。可是这种效率都不是很高。
官方给出的推荐作法是,使用 deps.ts
文件来引入远程文件,并管理版本。(固然 ,文件名称不必定叫作 deps.ts
, 你也能够改为其余的名称)。具体作法就是,把全部用到的远程依赖,都在 deps.ts
中引入 ,而且经过 Re-export
手段导出各依赖,而后其余文件就能够从 deps.ts
中拿到所须要的依赖了。
回到刚才说10个文件都依赖到 mongo
的问题,若是改为 deps.ts
文件来统一管理是这样的:
export * from 'https://deno.land/x/mongo@v0.6.0/mod.ts'
而后那些须要用到 mongo 的文件,不要直接从远程引入,而是从 deps.ts
中引入,以下:
import { init, MongoClient } from '../pathTo/deps.ts';
若是须要升级的话,咱们能够直接把 deps.ts
里面的 mongo 地址中的 0.6.0
改为 0.7.0
就好了。
另外,有一点和 npm 相似的是,若是没有指定版本号,即远程地址中没有指定版本,好比:
export * from 'https://deno.land/x/mongo/mod.ts'
就会默认安装最新版的依赖。
使用 node ,能够到 npm 上查找一些库。deno 也有相似的平台,目前分为两种库,一种是官方标准的,另一种是第三方的。标准库能够到这里查找:Deno Standard Modules。第三方库能够到这里查找: Deno Third Party Modules
OK, 具有以上的知识点,如今能够实战了。首先,须要保证你的电脑安装了 deno 1.0 。另外,因为用到了 mongodb ,因此须要你的电脑也要安装 mongodb。
先来看看咱们的商城的界面:
麻雀虽小五脏俱全哈!具有添加商品、查询商品、删除商品、修改商品的功能。这是典型的 REST API 风格的系统 。
而后再来看看项目结构:
由于该项目涉及到了先后端,若是使用 node 的话,通常会选择 express 或 koa。一样的,咱们使用 deno 也要选择对应的框架 ,否则的话,http服务以及路由跳转等都不是那么容易处理的。deno 上的这类框架,比较多人 star 的是 oak 和 abc,这里咱们选择使用 abc。
另外,由于使用 mongodb , 因此还须要引入 mongo
好啦,对于 deno 初体验就写到这啦, 具体的代码这里不打算贴出来了,有兴趣的能够前往 github 查看:
有问题的能够一块儿交流学习哈~