Node替代者?
在deno诞生两周年之际,Deno1.0在20年5月13日正式发布 Deno肩负着Node替代者的角色所创作,作为一个新的运行时,用于在浏览器之外运行js,默认使用安全策略,通过Rust语言编写,底层基于V8。
基于Deno作者的名气以及好奇,翻看了部分Deno的介绍及API,初步用Deno实现了部分服务端的功能。接下来让我们来一步步看一下我都用Deno实现了那些功能吧。
实例
1.安装
我是windos 用的powershell ,其他安装方式官网有介绍 iwr deno.land/x/install/i… -useb | iex 更新 :deno upgrade 安装完成后通过 deno -V 或者 deno --help查看基础介绍
2.基础信息
console.log('hello!')
console.log(Deno)
console.log(Deno.cwd())
===========
deno run -A .\index.ts
hello!
D:\01project\22node\deno
复制代码deno run -A .\index.ts
deno默认开启安全验证需要指定允许权限,例如:--allow-env,--allow-read等。
大体了解其中功能后为了方便,可以直接
3.http请求
import { serve } from "https://deno.land/std/http/server.ts";
const s = serve({ port: 8089 });
console.log("http://localhost:8089/");
for await (const req of s) {
req.respond({ body: "Hello!" });
}
========================
deno run -A .\index.ts
复制代码当第一次运行时会发现,deno安装了很多依赖包,这也是区别余Node的一个地方。
Node通过npm统一管理工具包,通过npm install 把包安装到本地,通过node_modules 进行管理 这样的方式导致本地存储了很多npm包。
deno的引用采用线上CDN地址的方式,本地没有package.json 以及node_modules
在运行程序的时,首先会判断本地电脑上是否有对应的包,如果没有则从CDN上拉取对应包缓存到本地, 后面运行时不会再次下载。
如果要强制刷新可以通过--reload拉取 deno run -A --reload .\index.ts 如果想固定版本可以在url上指定版本 例如
import { serve } from "https://deno.land/std@0.54.0/http/server.ts";
4.Oak
Oak,是不是很眼熟,从名字上就可以看出来了Koa非常相似,而且不仅从名称上,使用方式和Koa也非常相似。Oak对于Deno和Koa对于Node的作用是一样的。
首先引入包:
import { Application, Router } from "https://deno.land/x/oak/mod.ts";
当我兴冲冲的打算一探究竟时发现报错了,当run的时候控制台报:
error: error sending request for url (https://raw.githubusercontent.com/pillarjs/path-to-regexp/v6.1.0/src/index.ts): error
trying to connect: dns error: 请求的名称有效,但是找不到请求的类型的数据。 (os error 11004)
Imported from "https://deno.land/x/oak/deps.ts:43"
复制代码从报错信息中可以看出多半d是DNS解析的问题,于是按照查找结果,不明所以的一顿操作,发现还是不行。最后从一篇博文中发现解决办法:
www.edoou.com/articles/15…
根据报错包的地址,查询其IP地址,然后配置HOST,重新run 后终于启动成功了
初始化项目
const PORT = 8088;
const HOST = "127.0.0.1";
const DB = "./oak/user.json";//json数据文件
const router = new Router();
const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());
console.log(`listen---- ${HOST} ${PORT}`);
interface UserProp {
id: number;
name: string;
}
router.get("/", (context) => {
context.response.body = "Hi Oak...";
});
......
......
await app.listen({ port: PORT });
复制代码第一个get请求
const decoder = new TextDecoder("utf-8");
router.get("/userList", async (context) => {
const file = await Deno.readFile(DB);
const userLst = JSON.parse(decoder.decode(file));
context.response.body = {
status: 200,
msg: "success",
data: userLst,
};
});
复制代码value 路由方式传参
router.get("/getUser/:id", async (context) => {
const file = await Deno.readFile(DB);
const userLst: UserProp[] = JSON.parse(decoder.decode(file));
let id: any = (context.params || {}).id;
const _user = userLst.find((item) => item.id === Number(id));
context.response.body = {
status: 200,
msg: "success",
data: _user || null,
};
});
复制代码key-value方式传参
let id: any = context.request.url.searchParams.get("id");
post请求,body传参
router.post("/addUser", async (context) => {
const { request, response } = context;
const params = await request.body();
const { value } = params;
const { name } = value;
const file = await Deno.readFile(DB);
const userLst: UserProp[] = JSON.parse(decoder.decode(file));
const id = userLst.map((item) => item.id).sort()[userLst.length - 1] + 1;
userLst.push({ id, name });
const encoder = new TextEncoder();
await Deno.writeFile(DB, encoder.encode(JSON.stringify(userLst)));
response.body = {
status: 200,
msg: "success",
data: { info: "添加成功", id },
};
});
复制代码REST Client 验证
给大家安利一个好用请求模拟工具,vscode搜索Rest Client 安装后就可以使用了。
使用方式非常方便,看一遍说明文档就可以了
一些新特型
1.原生支持 TS
2.原生支持 module export
3.内置async 可直接await
4.安全策略
5.去中心化的包管理方式
6.内置工具,例如: fmt,Linter
...
个人看法
1.根据看一些博文和介绍了解到Deno替代Node,至少从目前来说还是看不到希望的。这需要后续Deno生态的丰富以及大型项目的应用。Node虽然有他的弊端,但是毕竟经历了这么多年的考验,能力得到了认可, 生态也是非常丰富。Deno有一个好的开端,他的起点很好,有诸多大神坐镇,但是一个语言的兴起依赖的因素很多。
2.Deno原生支持很多功能(TS,async),提高了易用性,减少了开发者环境配置的时间。
3.Deno内置了很多工具,例如fmt Linter,方便了开发者,不需要像Node那样直接配置各种工具,但是Node的工具都是千挑万选经过打磨最终脱颖而出的,虽然配置麻烦,但是好用。Deno内置工具,我一方面担心易用性不如,另一方面担心他是否能够持续的集成市面上好用的工具。
4.Deno的路还很长,但是我们应该积极的去拥抱这些新鲜事物,即使他最后销声匿迹,研究他的过程对我们也是有帮助的。
参考:
官网:deno.land/
中文文档:nugine.github.io/deno-manual…
oak:www.ctolib.com/oakserver-o…
入门实战:juejin.im/post/5ec24d…