摘要:之父在中的設計錯誤演講中表示不允許將任意本地函數綁定至當中。所有系統調用都將通過消息傳遞完成序列化。兩項原生函數與。這既簡化了設計流程,又使得系統更易于審計。
Node之父ry:在“Node中的設計錯誤”演講中表示:
不允許將任意本地函數綁定至 V8 當中。
所有系統調用都將通過消息傳遞完成(protobuf 序列化)。
兩項原生函數:send 與 recv。
這既簡化了設計流程,又使得系統更易于審計。
這幾點很大程度上體現出了node和deno在設計本質上的區別,同時這幾點體現了deno的安全性(利用 JavaScript 本身即為安全沙箱這一事實)
V8worker2是Go和V8連接的橋梁允許從GO程序執行JavaScript
只允許GO和V8之間的消息傳遞(傳統:暴露C++函數作為函數在JavaScript。)
維護一個安全的JS沙箱
JS中只允許綁定3個函數:$send() $recv() $print()
從圖中可以清晰的看出,V8worker2是v8和Go之間實現調用的核心組件
可以看出V8worker2 是通過binding C++ 模塊進行綁定V8,bingding暴露了基礎操作方法:$v8_init() 、$worker_load()、$worker_send_bytes()、$worker_dispose()...提供給GO 進行調用
//binding.h const char* worker_version(); void worker_set_flags(int* argc, char** argv); void v8_init(); worker* worker_new(int table_index); int worker_load(worker* w, char* name_s, char* source_s); const char* worker_last_exception(worker* w); int worker_send_bytes(worker* w, void* data, size_t len); void worker_dispose(worker* w); void worker_terminate_execution(worker* w);
通過Golang的GC提供的CGO模塊調用C語言暴露的方法,就可以實現GO和V8之間的通信了:
創建一個實例:v8worker2.New(ReceiveMessageCallback)
加載執行JS: worker.Load(scriptName,codeString)
// worker.go package v8worker2 import "C" ... func recvCb(buf unsafe.Pointer, buflen C.int, index workerTableIndex) C.buf { ... } func New(cb ReceiveMessageCallback) *Worker { ... initV8Once.Do(func() { C.v8_init() }) } func (w *Worker) Load(scriptName string, code string) error { ... r := C.worker_load(w.worker.cWorker, scriptName_s, code_s) ... } func (w *Worker) SendBytes(msg []byte) error { ... r := C.worker_send_bytes(w.worker.cWorker, msg_p, C.size_t(len(msg))) }案例演示
實現Js中的console.log() 方法
Js發送數據給Go
Go發送數據給Js
// hello.go package main import ( "fmt" "github.com/ry/v8worker2" ) func main() { worker := v8worker2.New(recv) // 實現JS的console.log 方法 err := worker.Load("hello.js", ` this["console"] = { log(...args) { V8Worker2.print(args) } }; console.log("Hello World"); `) if err != nil { fmt.Println(err) } // 發送數據給GO err = worker.Load("sendData.js", ` V8Worker2.send(new ArrayBuffer(5)) `) if err != nil { fmt.Println(err) } // 發送數據給JS err = worker.Load("recvData.js", ` V8Worker2.recv(function(msg) { const len =msg.byteLength; console.log("recv data from go,length: "+len); }); `) if err != nil { fmt.Println(err) } err = worker.SendBytes([]byte("abcd")) } func recv(buf []byte) []byte { fmt.Println("recv data from js,length:", len(buf)) return nil }
在控制臺運行: go run hello.go
需要運行測試代碼,可以直接訪問我的github :deno 案例源碼
參考資料
Ryan Dahl 對 v8worker 的演講PPT
justjavac: Deno 并不是下一代 Node.js
v8worker2 github
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107953.html
摘要:長文預警字,圖。開發并不是因為,也不是為了取代。不知道從官方介紹來看,可以認為它是下一代是如何腦補出來的。只是一個原型或實驗性產品。所以,不是要取代,也不是下一代,也不是要放棄重建生態。的目前是要擁抱瀏覽器生態。 這幾天前端圈最火的事件莫過于 ry(Ryan Dahl) 的新項目 deno 了,很多 IT 新聞和媒體都用了標題:下一代 Node.js。這周末讀了一遍 deno 的源碼,...
摘要:前端每周清單第期現狀分析與優化策略單元測試爬蟲作者王下邀月熊編輯徐川前端每周清單專注前端領域內容,以對外文資料的搜集為主,幫助開發者了解一周前端熱點分為新聞熱點開發教程工程實踐深度閱讀開源項目巔峰人生等欄目。 showImg(https://segmentfault.com/img/remote/1460000011008022); 前端每周清單第 29 期:Web 現狀分析與優化策略...
摘要:簡介的誕生學習一門技術之前,有必要了解該技術是如何誕生的是之父于年發布的。其在紐約羅切斯特大學數學系讀博,研究一些分型分類的研究。年月,把項目定義為同年月,向外界宣布這個項目年底,在柏林的大會上進行的演講,之后開始流行 nodejs簡介 1.nodejs的誕生 學習一門技術之前,有必要了解該技術是如何誕生的? nodejs是ryan dahl(nodejs 之父)于2009年發布的。 ...
Node.js從2009年誕生至今,已經發展了兩年有余,其成長的速度有目共睹。從在github的訪問量超過Rails,到去年底Node.jsS創始人Ryan Dalh加盟Joyent獲得企業資助,再到今年發布Windows移植版本,Node.js的前景獲得了技術社區的肯定。InfoQ一直在關注Node.js的發展,在今年的兩次Qcon大會(北京站和杭州站)都有專門的講座。為了更好地促進Node.j...
摘要:單線程使用單線程來運行,而不是向之類的其它服務器,每個請求將生產一個線程,這種方法避免了上下文切換和內存中的大量執行堆棧,這也是和其它服務器為解決上一個年,著名的并發連接問題而采用的方法。 showImg(https://segmentfault.com/img/remote/1460000019968794?w=1080&h=675);當我們學習一項新的事物的時候,我們首先要知道它來...
閱讀 1458·2021-11-24 09:39
閱讀 1774·2021-11-22 15:25
閱讀 3728·2021-11-19 09:40
閱讀 3283·2021-09-22 15:31
閱讀 1287·2021-07-29 13:49
閱讀 1192·2019-08-26 11:59
閱讀 1307·2019-08-26 11:39
閱讀 918·2019-08-26 11:00