這個(gè)頁面包含一些示例,您可以從中學(xué)到 Deno 的基本概念。 我們假設(shè)您已經(jīng)對 JavaScript 有過預(yù)先的了解,特別是 async/await。如果您沒有了解過 JavaScript,您可能需要先閱讀這個(gè)指南:JavaScript.
Deno 是一個(gè) JavaScript 和 TypeScript 的運(yùn)行時(shí),并嘗試與瀏覽器兼容并使用現(xiàn)代的功能 (features)。
由于 Deno 具有瀏覽器兼容性,Hello World 程序與瀏覽器里的沒有區(qū)別。
console.log("Welcome to Deno ????");
嘗試一下:
deno run https://deno.land/std/examples/welcome.ts
發(fā)出一個(gè) HTTP 請求 通過 HTTP 請求從服務(wù)器獲取數(shù)據(jù)是一件很常見的事。讓我們編寫一個(gè)簡單的程序來獲取文件并打印到終端。 就像瀏覽器一樣,您可以使用 web 標(biāo)準(zhǔn)的 fetch API 來發(fā)出請求。 const url = Deno.args[0]; const res = await fetch(url);
const body = new Uint8Array(await res.arrayBuffer()); await Deno.stdout.write(body);
讓我們看看它做了什么:
我們?nèi)〉昧说谝粋€(gè)命令行參數(shù),存儲到變量 url。
我們向指定的地址發(fā)出請求,等待響應(yīng),然后存儲到變量 res。
我們把響應(yīng)體解析為一個(gè) ArrayBuffer,等待接收完畢,將其轉(zhuǎn)換為 Uint8Array,最后存儲到變量 body。
我們把 body 的內(nèi)容寫入標(biāo)準(zhǔn)輸出流 stdout。
嘗試一下:
deno run https://deno.land/std/examples/curl.ts https://example.com
這個(gè)程序?qū)祷匾粋€(gè)關(guān)于網(wǎng)絡(luò)權(quán)限的錯(cuò)誤,我們做錯(cuò)了什么?您可能會想起來,Deno 默認(rèn)用安全環(huán)境
執(zhí)行代碼。這意味著您需要顯式賦予程序權(quán)限,允許它進(jìn)行一些特權(quán)操作,比如網(wǎng)絡(luò)訪問。
用正確的權(quán)限選項(xiàng)再試一次:
deno run --allow-net=example.com https://deno.land/std/examples/curl.ts https://example.com
讀取一個(gè)文件
Deno 也提供內(nèi)置的 API,它們都位于全局變量 Deno 中。您可以在此找到相關(guān)文檔:
doc.deno.land。
文件系統(tǒng) API 沒有 web 標(biāo)準(zhǔn)形式,所以 Deno 提供了內(nèi)置的 API。
示例:Unix cat
在這個(gè)程序中,每個(gè)命令行參數(shù)都是一個(gè)文件名,參數(shù)對應(yīng)的文件將被依次打開,打印到標(biāo)準(zhǔn)輸出流。
const filenames = Deno.args;
for (const filename of filenames) {
const file = await Deno.open(filename);
await Deno.copy(file, Deno.stdout);
file.close(); }
除了內(nèi)核到用戶空間再到內(nèi)核的必要拷貝,這里的 copy() 函數(shù)不會產(chǎn)生額外的昂貴操作,從文件中讀 到的數(shù)據(jù)會原樣寫入標(biāo)準(zhǔn)輸出流。這反映了 Deno I/O 流的通用設(shè)計(jì)目標(biāo)。
嘗試一下:
deno run --allow-read https://deno.land/std/examples/cat.ts /etc/passwd
TCP 服務(wù)
示例:TCP echo
這個(gè)示例是一個(gè) TCP echo 服務(wù),接收 8080 端口的連接,把接收到的任何數(shù)據(jù)返回給客戶端。
const hostname = "0.0.0.0";
const port = 8080;
const listener = Deno.listen({ hostname, port });
console.log(Listening on ${hostname}:${port}
);
for await (const conn of listener) {
Deno.copy(conn, conn);
}
當(dāng)這個(gè)程序啟動時(shí),它會拋出一個(gè)沒有網(wǎng)絡(luò)權(quán)限的錯(cuò)誤。
$ deno run https://deno.land/std/examples/echo_server.ts
error: Uncaught PermissionDenied: network access to "0.0.0.0:8080", run again with the --allow-net flag
? $deno$/dispatch_json.ts:40:11 at DenoError ($deno$/errors.ts:20:5)
...
為了安全,Deno 不允許程序訪問網(wǎng)絡(luò),除非顯式賦予權(quán)限。使用一個(gè)命令行選項(xiàng)來允許程序訪問網(wǎng)絡(luò):
deno run --allow-net https://deno.land/std/examples/echo_server.ts
嘗試用 netcat 向它發(fā)送數(shù)據(jù)。
$ nc localhost 8080
hello world
hello world
像示例 cat.ts 一樣,copy() 函數(shù)不會產(chǎn)生不必要的內(nèi)存拷貝。它從內(nèi)核接收數(shù)據(jù)包,然后發(fā)送回 去,就這么簡單。
更多示例
您可以在 示例 一章找到更多示例。
更多建議: