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