Deno上手教程,作一个简单的聊天服务

Deno1.0

他来了来了,他带着成吨的知识走来了javascript

Deno

Deno的1.0版本出来之后能够预见一大波的:css

  • 学不动了
  • 再不学就被淘汰了
  • Denoxx实现原理
  • 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问题:)npm

​ 再次,Node.js 的功能也不完整,致使外部工具层出不穷,初始化一个项目先来一吨依赖:webpackbabeltypescripteslintprettier......

​ 因为上面这些缘由,巨佬决定放弃 Node.js,从头写一个替代品,完全解决这些问题。deno 这个名字就是来自 Node 的字母从新组合,表示"拆除 Node.js"(de = destroy, no = Node.js)

##### 根据[官网](https://deno.land/)的说明:
复制代码

Deno是使用V8并内置于RustJavaScriptTypeScript的简单,现代且安全的运行时。

  1. 默认为安全。除非明确启用,不然没有文件,网络或环境访问权限。
  2. 开箱即用地支持TypeScript
  3. 仅发送一个可执行文件。
  4. 具备内置的实用程序,例如依赖项检查器(deno info)和代码格式化程序(deno fmt)
  5. 拥有一组保证能与Deno一块儿使用的通过审查(审核)的标准模块:deno.land/std

安装

DenoNode.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算法

​ 我知道你进来就是馋个人算法,之后靠这个融到资了别忘了请我喝冰阔落。

  1. 首先新建一个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);
    });
});
复制代码
  1. 新建server.ts做为后端:

引入serverrouter

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能够蚕食PythonAI的份额,切图仔摇身一变变成调参仔,想到本身之后有可能成为一名 人工智能开发工程师 真是吹牛逼都有劲了:)。

原文连接

相关文章
相关标签/搜索