为什么选择Deno
对我来说以下两点很吸引我
默认支持ts、tsx
默认安全,对权限的把控
文档传送门:
安装
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(基本介绍)
主要由四部分组成
开发环境
依赖(缓存)
源码
测试
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类型,因为这是第三方模块,第三方模块会指定类型,指定方式如下)
///
export const foo = "foo";
复制代码
如果我们导入的是js文件,那么d.ts文件如下引入用注释的方式引入,如下
// @deno-types="./foo.d.ts"
import * as foo from "./foo.js";
复制代码
(这个看起来很傻瓜,但是好处是清晰和稳定)
好了,我们写好了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文件等还是由区别的。
好了 ,一切很完美,但是这时候我们转回其他项目,会发现,到处都是红色的报错,因为ts、js等文件被deno插件给解析,我们需要只有在deno项目才启动它,于是可以在其他项目禁用deno。
禁用方法如下, 然后重启即可
其他一些:
下载出错
鉴于国内原因以及dns污染,依赖不能被很好的下载,如下
“那个”挂全局也不行,这时候我们需要修改host文件,在host文件添加
199.232.68.133 raw.githubusercontent.com
复制代码
调试允许出错
原因是开启了--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遵守浏览器规范,支持setTimeout、Blob、Worker、FormData等,请求可以用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函数,是不是很熟悉呢。
获取插件
比如
--完--