學得動的Deno
Deno是一種新型的構建在Google V8引擎之上的TypeScript安全執行時,最近已經發布到了0.1.8版本。
這個執行時是為了解決NodeJS帶來的一系列問題:
不再有package.json,不再有經常變化的依賴;
取而代之的是,儲存檔案到你的專案中,或者通過http資源下載他們,之後他們便可以永久地被快取下來;
同時,不再採用GYP(Generate Your Projects,是一個Google開源的構建系統,最開始用於Chromium專案,下載一些其他的開源專案也開始使用GYP,如V8、Node.js、WebRTC等),替代他的是GN(GN是一個生成Ninja構建檔案的元構建系統,以便可以用Ninja構建Chromium,GN檔案比GYP檔案更具可讀性和可維護性,GN比GYP快20倍);
通過flatbuffers(FlatBuffers是一個開源的、跨平臺的、高效的、提供了C++/Java介面的序列化工具庫)訊息傳遞取代直接呼叫系統方法;
此外還帶有開箱即用的TypeScript語法支援,不再需要Babel之類的工具將TypeScript編譯成JavaScript。
本文不會告訴你Deno究竟有多強大,僅是一篇快速入門的教程讓你瞭解這個新執行時,作者後續也會關注Deno的發展動向,如果有新收穫也會同步給大家。
安裝
二進位制檔案可以從Deno的GitHub倉庫獲取,你可以閱讀倉庫的Readme檔案,自己嘗試去編譯它。編譯的過程十分佔系統資源,因此確保你的機器RAM至少在4GB以上,並且是SSD硬碟,否則你將花費大量的時間等待編譯的完成。
我們就通過Python的方式下載安裝deno吧,畢竟mac上預設安裝有Python。
curl -sSf https://raw.githubusercontent.com/denoland/deno_install/master/install.py | python
然後將Deno將入到環境變數中
echo export PATH="/Users/cuitianze/.deno/bin":\$PATH >> $HOME/.bash_profile
OK,大功告成!
執行指令碼
在Deno中,你既可以執行JavaScript檔案,也可以執行TypeScript檔案。通過Deno命令將檔名作為引數執行你的程式碼。你可以在倉庫的tests資料夾中看到大量的Deno指令碼示例。
控制檯輸出
和其他任何語言或者框架一樣,你可以做的第一件事就是在控制檯裡輸出一個訊息。你可以簡單地寫如下程式碼打印出“Hello World!”。
console.log("Hello World!")
檔案系統訪問
Deno提供了基礎的檔案系統同步訪問的能力,如readFileSync和writeFileSync函式。
readFileSync以檔案的路徑作為引數(可以是相對於當前工作目錄的相對路徑,也可以是絕對路徑),呼叫後會返回檔案內容。
首先建立一個包含“黑馬大前端”字串的檔案,
echo 黑馬大前端 >> hi.txt
然後通過以下的程式碼來讀取這個檔案,建立hi.ts:
import { readFileSync } from "deno"; const data = readFileSync("hi.txt"); console.log(data);複製程式碼
我們看看會打印出什麼?
我們通過readFileSync打印出了無符號8位整型陣列形式的資料。如果我們想將它轉換成字串形式,需要使用“TextDecoder”,以下程式碼會生成正確的輸出:
import { readFileSync } from "deno"; const decoder = new TextDecoder("utf-8"); const data = readFileSync("hello.txt"); console.log(decoder.decode(data));複製程式碼
Perfect!“黑馬大前端”被成功地打印出來了。
檔案寫入
既然我們已經讀取並且解碼了一個文字檔案,那麼接下來我們要演示的就是寫入一個檔案。我們通過writeFileSync函式來實現。這個函式需要傳遞兩個引數,一個是檔案路徑,一個是待寫入的內容。我們建立hello.ts寫入如下程式碼:
import { writeFileSync } from "deno"; const encoder = new TextEncoder("utf-8"); const data = encoder.encode("你好,黑馬大前端"); writeFileSync("hello.txt", data);複製程式碼
然而,事與願違,檔案寫入並不像檔案讀取那樣輕鬆。
這是因為Deno預設禁止寫的許可權,需要特別授權檔案寫的許可權以讓writeFileSync生效。
deno --allow-write hello.ts
Cool!成功寫入檔案了。
但是我們怎麼可能僅僅滿足於這樣的“一刀切”方式的檔案許可權控制。
我們在實際專案中,應該是對第三方引入的檔案存在不信任,此時應該有更細粒度的檔案訪問和網路訪問的許可權控制,我也向Deno的核心成員提出了我的疑慮,值得慶幸的是,更細粒度的許可權控制已經在規劃中了。
檔案資訊讀取
statSync函式會返回一個檔案的資訊。
import { statSync } from "deno"; const fileInfo = deno.statSync("hi.txt"); console.log(fileInfo.isFile()); console.log(fileInfo.isSymlink()); console.log(fileInfo.isDirectory()); console.log(fileInfo.len); // File Size console.log(fileInfo.modified); // Last modification date console.log(fileInfo.accessed); // Last access date console.log(fileInfo.created); // Creation date複製程式碼
得到的檔案資訊如下:
定時器
定時器支援setTimeout, clearTimeout, setInterval和clearInterval,
正如JavaScript的用法一樣,這裡就不詳細概述了。
setTimeout(function() { console.log("---黑馬來了---");}, 3000);複製程式碼
自己跑一遍就有感知了,執行結果如下:
還有一個Feature不得不提,deno可以直接執行網路檔案。
贊:+1:期待Deno發展得越來越好。
本文作者:黑馬大前端 崔天澤