最近被deno頻繁刷屏,issue的是是否否每個人自有一套看法。蹭個熱點,寫篇博客。這篇文章主要是對面向前端開發人員,對node有一些了解,想要繼續學習deno的一個參考。
什么是deno?
項目傳送帶
deno是ry大神(node.js主要作者)的最新作品,目前還在孵化中。實現的目標是A secure TypeScript runtime on V8。底層依舊是v8,專為TypeScript提供,目前不兼容node。
簡單翻譯一下官網的介紹:
A secure TypeScript runtime on V8
基于V8的TypeScript安全運行環境
Supports TypeScript 2.8 out of the box. Uses V8 6.8.275.3. That is, it's very modern JavaScript.
使用V8版本6.8.275.3,支持TypeScript(一個現代的JavaScript語言)2.8開箱急用。No package.json, no npm. Not explicitly compatible with Node.
沒有package.json,沒有npm。和Node沒有明確的兼容關系。-
Imports reference source code URLs only.
僅通過url的方式導入依賴的源碼。import { test } from "https://unpkg.com/deno_testing@0.0.5/testing.ts" import { log } from "./util.ts"
Remote code is fetched and cached on first execution, and never updated until the code is run with the
--reload
flag. (So this will still work on an airplane. See~/.deno/src
for details on the cache.)
通過url導入的代碼會在本地~/.deno/src下面有緩存,如果需要重新獲取,使用參數--reload
File system and network access can be controlled in order to run sandboxed code. Defaults to read-only file system access and no network access. Access between V8 (unprivileged) and Golang (privileged) is only done via serialized messages defined in this protobuf, this makes it easy to audit. To enable write access explicitly use
--allow-write
and--allow-net
for network access.
文件訪問和網絡訪問被控制在沙盒里面。默認只有可讀的文件系統操作權限,沒有網絡操作權限,通過--allow-write
和--allow-net
可以開啟權限。在V8和Golang之間的相互交互只能通過序列化數據格式protobuf,這樣會更加便于審查。-
Single executable:
單文件執行(可將多個依賴打包為一個可執行文件)> ls -lh deno -rwxrwxr-x 1 ryan ryan 55M May 28 23:46 deno > ldd deno linux-vdso.so.1 => (0x00007ffc6797a000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f104fa47000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f104f6c5000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f104f3bc000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f104f1a6000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f104eddc000) /lib64/ld-linux-x86-64.so.2 (0x00007f104fc64000)
Always dies on uncaught errors.
未捕獲異常會使程序中斷。Supports top-level await.
語言層面支持await操作。Aims to be browser compatible.
瀏覽器兼容。Can be used as a library to easily build your own JavaScript
runtime. https://github.com/ry/deno/blob/master/cmd/main.go
可作為依賴庫構建自己的JavaScript運行時。
可能需要提前了解的概念
- Golang。俗稱go,deno的(主要)開發語言。特點是提供協程,在語言底層支持并發。
- protobuf。google開源的數據交換格式。特點是快,使用便捷。
- V8。js執行引擎。編deno需要編V8。
環境準備
基于mac的環境搭建。如果使用Linux和windows應該會有一些不同
- Golang 環境準備
- yarn
- protobuf
brew install protobuf
go get -u github.com/golang/protobuf/protoc-gen-go
go get -u github.com/jteeuwen/go-bindata/...
代碼編譯
- v8worker2。ry另一個開源的項目,鏈接golang和v8的中間件。
go get -u github.com/ry/v8worker2
這里使用了depot_tools 和 v8,是通過submodule方式管理的。
執行一下命令,獲取子模塊:
git submodule update --init
下載完成之后,執行編譯腳本:
./build.py
我在這一步是通過下載depot_tools和v8源碼然后在本地編譯的,需要翻墻才可以。是因為自己開始對git 子模塊管理不太了解,還要不斷學習啊。
- deno
終于到了deno這一塊了。
下載deno代碼到本地
go get -u github.com/ry/deno/...
編譯代碼:
cd $GOPATH/src/github.com/ry/deno
make
測試是否成功:
./deno testdata/001_hello.js # Output: Hello World
顯示Hello World就成功了