他来了来了,他带着成吨的知识走来了javascript
Deno
的1.0版本出来之后能够预见一大波的:css
Deno
的xx
实现原理PHP
最牛逼......html
Deno
的缘由 Deno
是 Ryan Dahl
在2017年创立的。这位巨佬同时也是 Node.js
的创始人,从2007年一直到2012年,他后来把 Node.js
移交给了其余开发者以后,就跑去搞研究人工智能了。可是相传他不是很喜欢 Python
,因此时间久了就想搞一个 JavaScript
的人工智能开发框架。等到他再回过头捡起 Node.js
,发现这个项目已经背离了他的初衷,有一些没法忽视的问题。前端
巨佬的说法是:java
But why!? Isn't this exactly what Node does? JavaScript & the web have changed significantly since Node was designed in 2009:node
- Promises. async functions
Async iterators/generatoswebpack
ES Modulesgit
Typed Arrays Node has problems:github
Problems with its module system. with centralized distributionweb
Lots of legacy APIs that must be supported
No security model
An explosion of tooling (grunt, gulp, webpack, babel, parcel, typescript, is-node, ...)
简单来讲ES6
标准引入了大量新的语法特性。其中,影响最大的语法有两个:Promise
接口(以及 async
函数)和 ES
模块。Node.js
对这两个新语法的支持,都不理想。因为历史缘由,Node.js
必须支持回调函数(callback)
,致使异步接口会有 Promise
和回调函数两种写法;同时,Node.js
本身的模块格式 CommonJS
与 ES
模块不兼容,致使迟迟没法彻底支持 ES
模块。
其次就是众所周知的npm
问题:)
再次,Node.js
的功能也不完整,致使外部工具层出不穷,初始化一个项目先来一吨依赖:webpack
,babel
,typescript
、eslint
、prettier
......
因为上面这些缘由,巨佬决定放弃 Node.js
,从头写一个替代品,完全解决这些问题。deno
这个名字就是来自 Node
的字母从新组合,表示"拆除 Node.js
"(de = destroy, no = Node.js)
。
##### 根据[官网](https://deno.land/)的说明:
复制代码
Deno
是使用V8
并内置于Rust
的JavaScript
和TypeScript
的简单,现代且安全的运行时。
TypeScript
。(deno info)
和代码格式化程序(deno fmt)
。 Deno
与Node.js
不一样的是Deno
只有一个可执行文件,全部操做都经过这个文件完成,同时也是跨平台的。因此能够直接在GitHub release
上下载对系统的二进制文件或利用官方提供的脚本进行下载安装:
使用 PowerShell
:
iwr https://deno.land/x/install/install.ps1 -useb | iex
复制代码
使用 Chocolatey
:
choco install deno
复制代码
使用 Scoop
:
scoop install deno
复制代码
注意
Deno
具备安全控制,默认状况下脚本不具备读写权限。若是脚本未受权,就读写文件系统或网络,会报错。必须使用参数,显式打开权限才能够。
Deno
只支持 ES 模块,跟浏览器的模块加载规则一致。没有 npm
,没有 npm_modules
目录,没有require()
命令(即不支持 CommonJS
模块),也不须要package.json
文件。
全部模块经过 URL 加载,好比import { bar } from "https://foo.com/bar.ts"
(绝对 URL)或import { bar } from './foo/bar.ts'
(相对 URL)。所以,Deno
不须要一个中心化的模块储存系统,能够从任何地方加载模块。
可是,Deno
下载模块之后,依然会有一个总的目录,在本地缓存模块,所以能够离线使用。
首先能够尝试官方的Hello world
:
deno run https://deno.land/std/examples/welcome.ts
复制代码
会输出:Welcome to Deno 🦕
尝试建立一个简单的http server
:
新建hello world.ts
,写入内容:
import { serve } from "https://deno.land/std@0.50.0/http/server.ts";
const s = serve({ port: 1927 });
console.log("http://localhost:1927/");
for await (const req of s) {
req.respond({ body: "Hello World\n" });
}
复制代码
若是直接像node
同样去执行:
deno run .\welcome.ts
复制代码
那么会获得一个错误:
error: Uncaught PermissionDenied: network access to "0.0.0.0:1927", run again with the --allow-net flag
at unwrapResponse ($deno$/ops/dispatch_json.ts:43:11)
at Object.sendSync ($deno$/ops/dispatch_json.ts:72:10)
at Object.listen ($deno$/ops/net.ts:51:10)
at listen ($deno$/net.ts:152:22)
at serve (https://deno.land/std@0.50.0/http/server.ts:261:20)
at file:jiu bu gei ni kan
复制代码
由于 Deno
的安全限制这里须要加上参数--allow-net
容许脚本联网:
deno run --allow-net .\welcome.ts
复制代码
打开http://localhost:1927/你会看到熟悉的Hello World!
Deno
实现上亿的Ai
算法 我知道你进来就是馋个人算法,之后靠这个融到资了别忘了请我喝冰阔落。
index.html
做为展现用内容:
<dl></dl>
<textarea id="msg" rows="10"></textarea>
<button>发送</button>
复制代码
加上点样式是我对UI
最后的倔强:
textarea,
dl {
width: 300px;
}
dl {
height: 400px;
border: 1px solid #000;
overflow: hidden auto;
}
dd {
margin-inline-start: 50%;
background-color: #9eea6a;
border: 1px solid #9eea6a;
}
dt {
width: 50%;
border: 1px solid #e7e7e7;
}
dd,
dt {
margin-top: 10px;
margin-bottom: 10px;
border-radius: 2px;
padding: 0 3px;
}
复制代码
实现简单的逻辑:
点击发送与炒鸡AI进行对话
const msgDom = document.querySelector("#msg");
const dl = document.querySelector("dl");
document.querySelector("button").addEventListener("click", () => {
const { value } = msgDom;
const dd = document.createElement("dd");
dd.innerText = value;
dl.appendChild(dd);
msgDom.value = "";
fetch("http://localhost:1927/ask", {
method: "post",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ msg: value }),
})
.then((res) => res.json())
.then((data) => {
const dt = document.createElement("dt");
dt.innerText = data.msg;
dl.appendChild(dt);
});
});
复制代码
server.ts
做为后端:引入server
和router
import { Application, Router } from "https://deno.land/x/oak/mod.ts";
复制代码
设置编码格式:
const decoder = new TextDecoder("utf-8");
复制代码
读取index.html
做为模板:
const body = decoder.decode(await Deno.readFile("./index.html"));
复制代码
在这能够看到
Deno
异步返回的都是Promise
,而且容许在async
外使用await
。
新建服务:
const app = new Application();
const router = new Router();
复制代码
对于不一样路由进行处理:
首页直接加载index.html
router
.get("/", ({ response }) => {
response.body = body;
})
复制代码
实现价值上亿的天然语言处理:
post("/ask", async ({ response, request }) => {
const { value } = await request.body();
response.body = JSON.stringify({
msg: value.msg.replace(/(吗|我|?|\?)/gi, (str: string) => {
if (/(吗|么)/.test(str)) {
return "";
} else if (/(?|\?)/.test(str)) {
return "!";
} else if (str === "我") {
return "你";
}
}),
});
});
复制代码
应用路由并:
app.use(router.routes());
await app.listen(`localhost:1927`);
复制代码
启动脚本:
在这注意,由于用到了读取文件的功能,因此须要显示的指定容许
Deno
读物文件,添加启动参数--allow-read
# 容许网络以及文件读取权限
deno run --allow-net --allow-read .\server.ts
复制代码
在页面中打开http://localhost:1927/查看效果:
相对Node.js
来说做为前端使用起来没有太大区别,至于该不应使用Ryan Dahl
已经把主要的优缺点都讲了。其实最主要的问题就是生态可不能够创建起来,若是社区的生态创建出来了到时候不用也得用了。
Deno
自己是Ryan Dahl
想替代Python
而制做的,但愿JavaScript
能够蚕食Python
在AI
的份额,切图仔摇身一变变成调参仔,想到本身之后有可能成为一名 人工智能开发工程师 真是吹牛逼都有劲了:)。