Deno 第一步

2020-06-24 17:04 更新

第一步

這個(gè)頁面包含一些示例,您可以從中學(xué)到 Deno 的基本概念。 我們假設(shè)您已經(jīng)對 JavaScript 有過預(yù)先的了解,特別是 async/await。如果您沒有了解過 JavaScript,您可能需要先閱讀這個(gè)指南:JavaScript.

Hello World

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ā)送回 去,就這么簡單。

更多示例

您可以在 示例 一章找到更多示例。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號