Deno入门教程 (看不懂打死我)

3,958 阅读4分钟

为什么选择Deno

对我来说以下两点很吸引我

  • 默认支持ts、tsx
  • 默认安全,对权限的把控

文档传送门:

deno官网
deno中文教程

安装

Shell (Mac, Linux):

curl -fsSL https://deno.land/x/install/install.sh | sh

PowerShell (Windows):

iwr https://deno.land/x/install/install.ps1 -useb | iex

Homebrew (Mac):

brew install deno

Chocolatey (Windows):

choco install deno

Scoop (Windows):

scoop install deno

Build and install from source using Cargo

cargo install deno

网速比较慢的可以用中文镜像来安装

curl -fsSL https://x.deno.js.cn/install.sh | sh

入门

import { serve } from "https://deno.land/std@0.59.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" });
}

这里用的是std, std是标准模块,能用std就不能第三方的。std传送门

但是,我太推荐用server,oak就很不错,它是模仿koa的一个库。oak传送门

在编写前,我们先看下风格指南deno风格指南传送门 比如

  • mod.ts代替index.ts, 把index改成mod
  • 在文件名中使用下划线,而不是破折号
  • 顶级函数不应使用箭头语法(这个应该在非deno也适用,因为如果是具名函数,编辑器可以自动导入,不用手动找路径)

于是使用oak之前,我们先弄好基础目录结构(仅供参考)

--.vscode
---- launch.json (编辑器配置,vscode示例)
--modules
---- oak (缓存目录,不是属于源码,但是应该加入git)
--src (源码位置)
----deps.ts (第三方依赖主入口)
----mod.ts (代码主入口)
--test (测试代码位置) deno测试文档传送门
----**test.ts
----**test.tsx
--readme.md (基本介绍)

主要由四部分组成

  • 开发环境
  • 依赖(缓存)
  • 源码
  • 测试

vscode配置或者其他配置见开发调试传送门

vscode参考配置, 添加 launch.json文件,文件内容如下

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug Deno (Allow All)",
            "type": "node",
            "request": "launch",
            "cwd": "${workspaceFolder}",
            "runtimeExecutable": "deno",
            "runtimeArgs": [
                "run",
                "--inspect-brk",
                "-A",
                "src/mod.ts",
                "test/mod.ts",
            ],
            "port": 9229,
            "console": "integratedTerminal"
        }
    ]
}

配置好了,就可以写源码了,先在deps.ts添加oak和mysql依赖

export { Application, Router } from "https://deno.land/x/oak/mod.ts";
export { Client } from "https://deno.land/x/mysql/mod.ts";

(考虑到deno官方访问限制,我的传送门能是github尽量是GitHub,deno_mysql传送门

关于ts类型小谈

(这里我们还会发现一个问题,怎么没导入ts类型,因为这是第三方模块,第三方模块会指定类型,指定方式如下)

/// <reference types="./foo.d.ts" />
export const foo = "foo";

如果我们导入的是js文件,那么d.ts文件如下引入用注释的方式引入,如下

// @deno-types="./foo.d.ts"
import * as foo from "./foo.js";

(这个看起来很傻瓜,但是好处是清晰和稳定)

详细见deno ts类型

好了,我们写好了deps.ts,那么在mod.ts中引入使用吧。

import {  Application, Router, Client } from "./deps.ts"
const client = await new Client().connect({
    hostname: ip地址,
    username: "root",
    db: "",
    poolSize: 3, // connection limit
    password: "",
});

const pcRouter = new Router()
const app = new Application()
pcRouter
    .prefix('/pc')
    .use(async (context, next) => {
        // 这里可以设置token拦截等,比如 if(没登陆) return context.response.body = JSON.stringify({msg: ''})
        return next()
    })
    .get("/banner/list", async (context) => {
        const list = await client.query(`select * from banner ORDER BY position DESC`)
        context.response.body = JSON.stringify(list)
    })
app.use((context, next) => {
    context.response.headers.set('Access-Control-Allow-Origin', '*')
    context.response.headers.set('Access-Control-Allow-Headers', '*')
    context.response.headers.set('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS')
    if(context.request.method == 'OPTIONS'){
        context.response.status = 200
    }
    return next()
})
app.use(pcRouter.routes())

console.log("http://localhost:10086")
await app.listen({ port: 10086 })

写好代码,运行下

在运行前,我们需要先设置缓存目录位置,如果是windows,那么可以在ps(ps怎么打开?windows键+R,输入powershell回车 )里面设置

$Env:DENO_DIR = "F:\deno\<项目>\modules" 

完成后执行缓存

deno cache -r --lock=lock.json src/deps.ts

最后在根目录下执行

deno run  --allow-net  .\src\mod.ts
(这里又有一个问题,为啥要执行 --allow-net ,因为deno默认是安全的,所以需要允许网络之类的,不然文件,网络等操作无法被执行)) [deno权限传送门](https://denolang.cn/manual/getting_started/permissions.html)

这时候访问 http://localhost:10086/pc/banner/list, 就可以拿到轮播列表啦。

好,入门成功。

使用编辑器调试

上面的launch.json设置后,我们在vscode按下f5就可以自动启动啊,权限也是最高得,如果要修改可以编辑json文件。 (如果无法启动,很可能端口被你修改了,端口不要修改)

然后就可以愉快得玩耍了,如图打断点

对了,还有一个很重要得事情,那就是怎么实现deno,因为deno和ts文件js文件,tsx文件等还是由区别的。

这时候我们可以安装下插件 点我安装vscode deno插件

更多编辑器deno开发插件

好了 ,一切很完美,但是这时候我们转回其他项目,会发现,到处都是红色的报错,因为ts、js等文件被deno插件给解析,我们需要只有在deno项目才启动它,于是可以在其他项目禁用deno。

禁用方法如下, 然后重启即可

其他一些:

下载出错

鉴于国内原因以及dns污染,依赖不能被很好的下载,如下 “那个”挂全局也不行,这时候我们需要修改host文件,在host文件添加

199.232.68.133 	raw.githubusercontent.com

不知道如何修改host文件,见:windows如何修改host文件

调试允许出错

原因是开启了--inspect-brk,但是端口对不上,可以修改成默认值9229

db

db也不是只有denomysql,还有denodb这个优秀的库,但是由于denomysql是国人写的于是支持下~~
DenoDB支持PostgreSQL, MySQL, MariaDB, SQLite and MongoDB, DenoDB传送门
但是deno_mysql体积会更小一点,更专注mysql

mysql的语法文档 mysql菜鸟教程

oak

除了oak,还有abc(也是国人写的),传送门

请求

deno遵守浏览器规范,支持setTimeoutBlobWorkerFormData等,请求可以用Fetch, 文档可以直接看MDN上的,Fetch传送门

使用npm包

deno还支持node,node下面有一个module模块,就支持创建一个require函数,如下

import { createRequire } from "https://deno.land/std/node/module.ts";
const require = createRequire(import.meta.url);

这里我们就获取到了require函数,是不是很熟悉呢。

获取插件

获取插件可以在这里搜索 deno.land/x/

比如

--完--