摘要:長(zhǎng)文預(yù)警字,圖。開(kāi)發(fā)并不是因?yàn)?,也不是為了取代。不知道從官方介紹來(lái)看,可以認(rèn)為它是下一代是如何腦補(bǔ)出來(lái)的。只是一個(gè)原型或?qū)嶒?yàn)性產(chǎn)品。所以,不是要取代,也不是下一代,也不是要放棄重建生態(tài)。的目前是要擁抱瀏覽器生態(tài)。
這幾天前端圈最火的事件莫過(guò)于 ry(Ryan Dahl) 的新項(xiàng)目 deno 了,很多 IT 新聞和媒體都用了標(biāo)題:“下一代 Node.js”。這周末讀了一遍 deno 的源碼,特意寫(xiě)了這篇文章。長(zhǎng)文預(yù)警(5000字,11圖)。
0. 為什么開(kāi)發(fā) Deno?這是我上周做的一張圖,介紹了 JavaScript 的發(fā)展簡(jiǎn)史。剛才修改了一下,添加了對(duì) Node.js 和 Deno 發(fā)布時(shí)間的標(biāo)注。
Node.js 和 Deno 分別是 Ryan Dahl 在 2009 年和 2018 年,基于當(dāng)年最新的前端技術(shù)開(kāi)發(fā)的非瀏覽器 JavaScript 運(yùn)行時(shí)。
Ryan Dahl 開(kāi)發(fā) deno 并不是因?yàn)?“just for fun”,也不是為了取代 node。下面慢慢解釋。
1. 目前 deno 只是一個(gè) demo這兩天花時(shí)間看了 deno 的源碼(好在是初級(jí)階段,源碼很少,也很容易理解),順帶看了所有的 issue 和 pr。不知道“從官方介紹來(lái)看,可以認(rèn)為它是下一代 Node”是如何腦補(bǔ)出來(lái)的。
既然是 Node.js 之父的新作,在討論中自然離不開(kāi) Node.js。而作者很皮的回復(fù)到:
The main difference is that Node works and Deno does not work : )最大的區(qū)別就是:Node 可以工作,而 Deno 不行 : )
目前 Deno 只是一個(gè) Demo,甚至連二進(jìn)制發(fā)行版都沒(méi)有。好在從源碼編譯比較簡(jiǎn)單(如果你使用的不是 Windows 系統(tǒng))。
在 high-level 層面,Deno 提供了一個(gè)盡可能簡(jiǎn)單的 V8 到系統(tǒng) API 的綁定。為什么使用 Golang 替代 C++ 呢,因?yàn)橄啾?Node 而言,Golang 讓我們更加容易的添加新特性,比如 http2 等。
至于為什么不選擇 Rust,作者沒(méi)有回答。
我們?cè)賹?duì)比一下兩者的啟動(dòng)性能。分別運(yùn)行:
console.log("Hello world")
我之前寫(xiě)過(guò)一篇文章:Node.js 新計(jì)劃:使用 V8 snapshot 將啟動(dòng)速度提升 8 倍,那如果我們使用 --without-snapshot 參數(shù)編譯 Node.js 呢?
依然是相差懸殊,畢竟 deno 需要加載一個(gè) TypeScript 編譯器。畢竟是一個(gè) demo 版本,希望以后用力優(yōu)化。
對(duì)于性能提升還有一個(gè)思路就是,可以使用 LLVM 作為后端編譯器把 TypeScript 代碼編譯為 WebAssembly 然后在 V8 里面運(yùn)行,甚至可以直接把源碼編譯成二進(jìn)制代碼運(yùn)行。Ryan Dahl 表示 deno 只需要一個(gè)編譯器,那就是 TS。但是既然 deno 要兼容瀏覽器,那么 WebAssembly 應(yīng)該也會(huì)被支持。
Deno 可以對(duì) ts 的編譯結(jié)果進(jìn)行緩存(~/.deno/cache),所以目前關(guān)注的就是啟動(dòng)速度和初次編譯速度。
要么就是在發(fā)布前先行編譯,如此一來(lái) deno 就脫離了開(kāi)發(fā)的初衷了。deno 是一個(gè) ts 的運(yùn)行時(shí),那么就應(yīng)該可以直接運(yùn)行 ts 代碼,如果提前把 ts 編譯成 js,那么 deno 就回退到 js 運(yùn)行時(shí)了。
2. 初學(xué)者應(yīng)該學(xué)習(xí) Node.js 還是 Deno?對(duì)于這個(gè)問(wèn)題,Ryan Dahl 的回答干凈利落:
Use Node. Deno is a prototype / experiment.使用 Node。Deno 只是一個(gè)原型或?qū)嶒?yàn)性產(chǎn)品。
從介紹可以看到,Deno 的目標(biāo)是不兼容 Node,而是兼容瀏覽器。
所以,Deno 不是要取代 Node.js,也不是下一代 Node.js,也不是要放棄 npm 重建 Node 生態(tài)。deno 的目前是要擁抱瀏覽器生態(tài)。
不得不說(shuō)這個(gè)目標(biāo)真?zhèn)ゴ蟆yan Dahl 開(kāi)發(fā)了 Node.js,社區(qū)構(gòu)建出了整個(gè) npm 生態(tài)。我在另一個(gè)回答 justjavac:純前端開(kāi)發(fā)眼里nodejs到底是什么? 里面寫(xiě)到“Node.js 是前端工程化的重要支柱之一”。
雖然后來(lái) Ryan Dahl 離開(kāi) Node.js 去了 Golang 社區(qū),但是現(xiàn)在 Ryan Dahl 又回來(lái)了,為 JavaScript 社區(qū)帶來(lái)了 Golang,開(kāi)發(fā)出了 Deno,然后擁抱瀏覽器生態(tài)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/107951.html
摘要:里面有一句描述,可以看到的目標(biāo)是兼容瀏覽器。那么這里的兼容瀏覽器到底如何是什么意思呢我簡(jiǎn)單談?wù)勎业睦斫獍伞:芏嗳诉€有誤解以為兼容瀏覽器指的是會(huì)提供類(lèi)似里的寫(xiě)法。 Deno 里面有一句描述:Aims to be browser compatible,可以看到 Deno 的目標(biāo)是兼容瀏覽器。那么這里的兼容瀏覽器到底如何是什么意思呢? 我簡(jiǎn)單談?wù)勎业睦斫獍伞?首先這里的兼容性肯定不是 Den...
摘要:自發(fā)布以來(lái)就備受關(guān)注,也有很多媒體和開(kāi)發(fā)者稱(chēng)為下一代。所以在寫(xiě)這個(gè)插件之前,我又為寫(xiě)了一個(gè)插件。插件提供了開(kāi)箱即用的支持,開(kāi)發(fā)者不需要任何配置,但是有一個(gè)前提是開(kāi)發(fā)者需要使用內(nèi)置的。 這幾天為 Deno 開(kāi)發(fā)了一個(gè) VS Code 插件:Deno support for VSCode,GitHub 地址:https://github.com/justjavac/...。 自 Deno ...
摘要:之父在中的設(shè)計(jì)錯(cuò)誤演講中表示不允許將任意本地函數(shù)綁定至當(dāng)中。所有系統(tǒng)調(diào)用都將通過(guò)消息傳遞完成序列化。兩項(xiàng)原生函數(shù)與。這既簡(jiǎn)化了設(shè)計(jì)流程,又使得系統(tǒng)更易于審計(jì)。 Node之父ry:在Node中的設(shè)計(jì)錯(cuò)誤演講中表示: 不允許將任意本地函數(shù)綁定至 V8 當(dāng)中。 所有系統(tǒng)調(diào)用都將通過(guò)消息傳遞完成(protobuf 序列化)。 兩項(xiàng)原生函數(shù):send 與 recv。 這既簡(jiǎn)化了設(shè)計(jì)流程,又使得...
摘要:既然這樣,怎么理解中的單線程再捋一捋和的關(guān)系。在線程上,不會(huì)等待操作完成,繼續(xù)執(zhí)行后續(xù)的代碼。這就是單線程異步。在中除了代碼,一切都是并行的由于中主任務(wù)的執(zhí)行是以單線程的方式進(jìn)行,如果程序出錯(cuò)導(dǎo)致崩潰,就會(huì)終止整個(gè)流程。 node是什么 Node.js 是一個(gè)基于 Chrome V8 引擎的 JavaScript 運(yùn)行環(huán)境。 Node.js 使用了一個(gè)事件驅(qū)動(dòng)、非阻塞式 I/O 的模...
摘要:介紹是一個(gè)基于和的的安全運(yùn)行時(shí)。文件中主要是的代碼,是功能的具體實(shí)現(xiàn)。圖來(lái)自于官網(wǎng),圖的架構(gòu)圖預(yù)告接下來(lái)還會(huì)有兩篇文章分析的內(nèi)部原理 deno介紹 deno是一個(gè)基于v8、rust和Tokio的Javascript/Typescript的安全運(yùn)行時(shí)。它在內(nèi)部嵌入了一個(gè)typescript的編譯器??梢詫ypescript編譯成js然后運(yùn)行在v8上,并通過(guò)c++ libdeno實(shí)現(xiàn)js...
閱讀 1635·2021-09-08 10:42
閱讀 3618·2021-08-11 10:23
閱讀 3994·2019-08-30 14:10
閱讀 2745·2019-08-29 17:29
閱讀 3103·2019-08-29 12:50
閱讀 654·2019-08-26 13:36
閱讀 3469·2019-08-26 11:59
閱讀 1503·2019-08-23 16:23