【學不動了系列】之 Deno 入門

deno

但願你們不要被標題嚇到,純屬爲了吸引眼球😢。。根據筆者這兩天的學習感覺,Deno 比 Node 更容易入門,若是你有 Node 的基礎那更簡單了,不少東西都是能夠類比的,學起來豪不費力。我的認爲如今正是入門 Deno 的最好時機,隨着 v1.0 的發佈 Deno 的 API 已趨於穩定,但整個生態圈的繁榮纔剛剛開始,因此趁 Deno 仍是個寶寶咱們能夠陪它一塊兒成長。前端

什麼是Deno

Deno是新一代的 JavaScript 和 TypeScript 運行時(runtime),使用 Rusttokio 實現,和 Node 同樣內部也使用 V8 引擎,並且Deno 和 Node 的做者是同一我的:Ryan Dahl。他創造Deno的初衷是爲了彌補 Node 的某些設計缺陷,但鑑於目前 Node 的生態已經如此繁榮,Deno 暫時還沒法徹底取代 Node,Node 應該還將長期穩定存在。node

Deno的主要特色有:git

  • 安全性:默認沒有文件、網絡、系統的訪問權限,除非明確啓用。與之相比,Node 是不安全的
  • 天生支持 TypeScript
  • 實現了部分的標準Web APIs,好比:fetchconsole
  • 官方提供包含不少經常使用功能的標準庫,擺脫對一些第三方庫的依賴
  • 使用ES6的模塊系統(Node 使用的是 CommonJS)
  • 依賴可經過遠程獲取,無需安裝到本地

Deno目前還處於早期發展階段,因此一些功能和API可能還會有變更,同時生態也不完善,社區提供的工具或多或少會有bug,可是這些都是正常的,並不妨礙咱們去提早學習和了解這個更優秀的 Node.js 替代品。github

安裝Deno

Shell (Mac, Linux) - 指定版本(推薦):web

curl -fsSL https://deno.land/x/install/install.sh | sh -s v1.2.1

PowerShell (Windows) - 指定版本(推薦):npm

$v="1.2.1"; iwr https://deno.land/x/install/install.ps1 -useb | iex

Homebrew (Mac) :編程

brew install deno

Chocolatey (Windows) :json

choco install deno
注意:安裝完成後需根據命令行中的提示配置環境變量!

在命令行裏面輸入 deno 命令能夠進入編程模式:緩存

deno command

使用 deno --version 查看 Deno 的版本:安全

deno version

運行js、ts文件

可使用 deno run <filename.js> 命令運行一個本地 js 文件。

run js

或者,一個 ts 文件:

run ts

第一次運行 ts 文件會進行編譯,第二次就不用編譯了,除非 ts 文件有修改。

Deno 也能夠運行一個遠程的 ts 文件:

remote ts

上圖文件路徑: http://lc-3Cv4Lgro.cn-n1.lcfi...

能夠看到,deno會先下載遠程ts文件,再編譯、運行。若是該遠程文件已經被下載編譯過了,再次運行就會從緩存中讀取:

remote

若是想從新下載、編譯則可使用 -r--reload 參數,進行從新加載:

reload

Deno運行時(Runtime)

Deno 的運行時由標準的 Web APIs + Deno global 這兩部分組成。

實現 Web APIs 主要是爲了遵循已有的 web 標準,提供你們都熟悉的接口,以下降學習和使用成本,也讓咱們前端同窗更容易上手,好比常見的 consolefetchsetTimeout 等方法在Deno中仍能夠正常使用。Web APIs 的做用域爲全局,便可以直接使用或者經過 window.***globalThis.*** 調用。Deno 實現的全部 Web APIs 可參考 Github Repo

除了 Web APIs,Deno 自有的 API 都放在 Deno 這個命名空間下,好比文件操做、網絡鏈接、進程管理等。

Web APIs

接下來以 fetch API 爲例展現 Deno中 Web APIs 的使用。

Fetch API

好比獲取一個遠程資源:

fetch.ts:

const res = await fetch('https://jsonplaceholder.typicode.com/posts/1');
const data = await res.json();

console.log(data);
若是使用VSCode進行開發,推薦安裝 Deno 插件。

運行:

deno run --allow-net fetch.ts
注意:進行網絡訪問須要單獨受權,使用 --allow-net flag。

結果:

fetch

咱們也能夠給 --allow-net 指定可訪問的域名,則訪問未指定的域名就會報錯。好比,將上面的命令改成:

deno run --allow-net=github.com fetch.ts

結果將獲取不到指定資源:

fetch other domain

Deno Global

和 Node 同樣,Deno 也能操做文件系統,接下來咱們以此爲例展現 Deno global API 的使用。

讀文件

好比,讀取一個txt文件:

doc.txt

This is my first deno app.

read.ts

const decoder = new TextDecoder('utf-8');

const data = await Deno.readFile('doc.txt');

console.log(decoder.decode(data));

和 Node 不一樣,Deno 默認是沒有操做文件權限的,若是使用 deno run read.ts 運行就會報錯:

read err

由於咱們須要手動賦予讀取文件的權限,使用 --allow-read flag:

read

寫文件

與讀文件對應的,寫文件的操做以下:

write.ts:

const encoder = new TextEncoder();

const txt = 'Deno is awesome!';

await Deno.writeFile('doc.txt', encoder.encode(txt));

一樣的,咱們須要手動賦予寫文件的權限:

deno run --allow-write  write.ts

重命名文件

rename.ts:

await Deno.rename('doc.txt','readme.txt');

重命名文件須要同時賦予讀和寫的權限:

deno run --allow-read --allow-write rename.ts

刪除文件

delete.ts:

await Deno.remove('doc.txt');

刪除文件須要寫的權限:

deno run --allow-write delete.ts

Deno標準庫

除了 Web APIs 和 Deno global,Deno官方團隊還提供了一個標準庫,即一組高質量的工具集。這個標準庫不包含任何第三方依賴,並且代碼都會由Deno核心團隊審查,所以能保證高質量和穩定性。

標準庫地址: https://deno.land/std

接下來,咱們以幾個經常使用的模塊爲例展現標準庫的用法。

fs(文件系統)

標準庫中的 fs 至關於對 Deno 自帶文件操做的擴展,好比增長了對JSON文件的讀寫:

fs.ts:

import { readJson } from 'https://deno.land/std@0.62.0/fs/mod.ts';

const posts = await readJson('./posts.json');

console.log(posts);
標準庫的版本Deno的版本暫時不統一,使用標準庫時應該指定穩定的版本號,如本例中的 0.62.0 ,以免意外的更新和重大更改致使程序不可用。

運行:

deno run --allow-read --unstable fs.ts
由於涉及到一些不穩定API的調用,因此要加上 --unstable flag 以啓用這些API

結果:

fs

fs模塊地址: https://deno.land/std/fs

http(網絡模塊)

和 Node 相似,Deno 的 http 模塊也能用於建立一個 web 服務器:

http.ts:

import { serve } from 'https://deno.land/std@0.62.0/http/mod.ts';

const server = serve({
  port: 3000
});

console.log('listening on port 3000');

for await (const req of server) {
  req.respond({
    body: `<h1>Hello, Deno!</h1>`
  });
}

運行:

deno run --allow-net http.ts

結果:

http

http模塊地址: https://deno.land/std/http

uuid(通用惟一識別碼)

uuid 的做用是生成一個128位的全局惟一的ID。

uuid.ts:

import { v4 } from "https://deno.land/std@0.62.0/uuid/mod.ts";

const myUUID = v4.generate();

console.log(myUUID);

運行:

deno run uuid.ts

結果:

uuid

uuid模塊地址: https://deno.land/std/uuid

第三方模塊

雖然誕生不久但勤勞的同行們已經爲Deno生態作出了很多貢獻,現有的第三方模塊在 這裏 能夠找到。

下面列舉幾個比較有用的模塊:

  • oak:Deno 版的 koa,面向 http 服務的中間件框架
  • abc:另外一個好用的 web 應用框架
  • denon:Deno 版的 nodemon,用於開發時監聽文件變化自動重啓程序
  • denoify:將 Node 應用轉爲 Deno 應用

還有一些本來的 npm 包在 Deno 裏面仍是能夠用的,好比:lodash

好了,今天的Deno入門就給你們介紹到這裏,若是對你有幫助的話給個贊和關注吧 😊。

本文Demo地址:https://github.com/MudOnTire/...

相關文章
相關標籤/搜索