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的份額,切圖仔搖身一變變成調參仔,想到本身之後有可能成爲一名 人工智能開發工程師 真是吹牛逼都有勁了:)。

原文連接

相關文章
相關標籤/搜索