精讀《Deno 2020 官方回顧及 2021 展望》

image.png

隨着 API 的穩定化改造、若干大型基礎架構的重構,以及諸多備受關注的功能開放,Deno 1.0 版本正式發佈。2020 年,Deno 迎來了衆多的挑戰和變化。javascript

請填寫這份 Deno 調查問卷來向咱們反饋以讓 Deno 在 2021 年變得更好。html

下文是 Deno 的 2020 年度回顧。前端

一月:再見 libdeno,你好 rusty_v8

libdeno 是一個 C++ 庫,能夠方便地橋接 Deno 中的 V8 引擎和 Rust 代碼。此庫難以理解,也難以在其上開發額外的功能。基於這種狀況,最終致使了 rusty_v8 於 2019 年秋季誕生。rusty_v8 是一個爲 V8 引擎提供相關 API 的 Rust crate。同年 12 月,rusty_v8 已具有全部必需的 binding 條件來替換 libdeno。這項工做始於 2019 年年末,當時先使用 rusty_v8 重寫了 libdeno 的一部分。因爲 Deno 代碼庫中測試覆蓋率的不斷提升,咱們頗有信心地繼續推動,並在兩週內完成了這項工做。libdeno 最終在 0.29.0 版本中被徹底替換刪除,此後 rusty_v8 也經歷了綁定類型安全性相關的重要重構。java

本月發佈的版本:0.28.00.28.10.29.00.30.00.31.0git

精讀筆記:github

  • libdeno:由 C++ 編寫,早期是用來鏈接 TS/JS 和 V8 的通道。
  • rusty_v8:libdeno 的替代品,2019 年年末開始開發,爲 V8 的 C++ API 提供更高質量的 Rust 綁定。
  • V8:Google 的一個開源 JavaScript 引擎。其一個很是大的項目(超過 600,000 行 C++),一般須要 30 分鐘才能編譯。此外,V8 依靠 Chromium 的定製構建系統(gn + ninja),在 Chromium 以外不容易使用。
  • Rust:Rust 語言快且內存效率高,沒有運行時和垃圾收集器。Rust 的豐富類型系統和全部權模型保證了內存安全性和線程安全性,可以在編譯時消除許多類的錯誤。

參考資料:web

二月:deno fmt 現由 dprint 構建、deno test 子命令

本月咱們完全地重構了 deno fmt。與此以前,deno fmt 是一個簡單的子命令,其在背後只是最終指向 prettier 的「deno run」的一個別名。這意味着在首次運行 deno fmt 以及每次 prettier 升級後,用戶都必須下載 prettier 的最新版本。這和 Deno 承諾的內置工具開箱即用的原則很不契合。同時,prettier 真的很慢,其性能也有不少問題。正則表達式

咱們被推薦了 David Sherretdprint 庫——一個基於 Kang Dong Yun 的 SWC JavaScript 解析器、並由 Rust 編寫的代碼格式化工具。dprint 能夠和 prettier 庫同樣的工做,但速度卻要快上好幾個數量級。通過了一些初步測算後,咱們決定在 deno fmt 中使用 dprintchrome

deno test 也有在首次運行該命令時從標準庫中下載模塊的問題。這致使添加了新的 Deno.test() API,而且 deno test CLI 子命令也讓測試成爲了 Deno 的一等公民。typescript

本月發佈的版本:0.32.00.33.00.34.00.35.0

精讀筆記:

  • deno fmt:Deno 內置工具之一,用來格式化 TypeScript/JavaScript 代碼。早期依賴 prettier,如今由基於 Rust 語言的 dprint 提供支持,速度和性能都有所提升。
  • deno test:deno 內置工具之一,開箱即用提供測試基本功能。
  • prettier:Node 下知名的可配置式代碼格式化工具,能夠在編輯器、預提交或 CI 等諸多環境中來格式化多種語言(TS/JS/CSS/HTML/GraphQL/YAML/Markdown 等),更多的語言能夠經過社區插件支持。
  • dprint:支持定義插件和配置的代碼編輯器,由 Rust 語言構建。速度很快,插件支持 URL 或文件導入(WebAssembly)。支持格式化 TS/JS/JSON/C#/VB/Markdown 等文件,同時也有 Prettier 的插件。目前處於早期積極開發中。
  • SWC:是一個基於 Rust 的JavaScript/TypeScript 解析器,性能極好。JavaScript 的解析器包括的實施規範起始於 ESTree 項目,常見的基於 JS 開發的 JavaScript 解析器包括 uglify-jsEsprimaacorn@babel/parser(babylon)espreeTypeScript;常見的基於其餘語言開發的 JavaScript 解析器包括 sucraseswcesbuild;其它 AST 工具包括:recastjscodeshiftASTExplorer 等。

參考資料:

三月:V8 調試器、deno doc、deno upgrade

阻礙 Deno 1.0 發佈正式版的主要緣由是缺乏 Chrome Devtools 的支持。所以,咱們花了不少精力來增長對 V8 調試器的支持以及提升使用 Chrome Devtools 鏈接到 Deno 進程的能力。

CLI 中也添加了兩個新的命令:deno docdeno upgrade

咱們同時經歷了構建過程的巨大改進。與此以前,Deno 中的每一次構建都會致使 V8 從源碼級別進行從新構建。V8 是一個龐大的 C++ 項目,經常須要花費 30 多分鐘來對其進行構建。儘管有大量的構建緩存和更多技巧,咱們也一直難以克服得更好。如今,咱們增長了 rusty_v8 在 Github 發行版上生成和下載預構建過的靜態庫的能力,從而容許 Deno 構建過程徹底繞過 V8 的構建。這簡化並加快了 CI 的構建,同時更重要的是,這讓貢獻者變得能夠更輕鬆地構建 Deno。

本月發佈的版本:0.36.00.37.00.37.10.38.0

精讀筆記:

  • deno doc:內置工具之一,來從源碼中生成相關的 JSDoc 文檔。--json 標誌能夠生成 JSON 格式,也能夠用來生成模塊文檔。
  • deno upgrade:內置命令,能夠直接經過此命令開自升級 Deno 版本。
  • Chrome DevTools:Chrome DevTools 是輔助開發者進行 Web 開發的重要調試工具,DevTools 是 Chromium 的一部分,能夠做爲獨立項目被 Electron 等容器集成。DevTools 主要分爲四部分:調試器前端(默認由 Chromium 內核層集成)、調試器後端(Chromium/V8/Node.js)、調試協議、消息通道(Embedder、Web Socket、Chrome Extensions、USB/ADB Chaeeml)。

參考資料:

四月:破壞全部的 API 來構造重要的穩定性

本月爲 1.0 的正式發佈作準備,重點關注在審閱 Deno global 全局中的 API。這致使了諸多破壞性地改動。對此咱們很謹慎:咱們將不肯定的全部 API 都須要被移到 --unstable 標誌以後。

這也是 1.0 版本的重要承諾;在 2.0 發佈以前,標記爲穩定的 Deno API 將不會有破壞性的更改。

本月是 Deno 版本以 0.x.y 命名的最後階段。

本月發佈的版本:0.39.00.40.00.41.00.42.0

精讀筆記:

  • 內置標準庫的 stable API:doc.deno.land/builtin/sta…
  • 內置標準庫的 unstable API:doc.deno.land/builtin/uns…
  • Deno 0.x.y 版本的大體歷程:從 2018-08-18 的 v0.0.1 版本開始,到 2020-04-30 的 v0.42.0,621 天迭代了 82 個版本。其中從 73 個版本 v0.34.0 開始,每一個版本同時會更新標準庫的版本。

五月:Deno 1.0 正式發佈

本月初標記刪除了以下功能:

  • JSON imports
  • WASM imports
  • window.location API
  • Rust API for deno crate

刪除的緣由是,咱們不想由於 JSON/WASM imports 缺乏底層規範支持、或者 deno crate 下有 Rust API 額外維護負擔的狀況下提供相關 API。

終於在 5 月 13 日——Ryan 最初發表 Deno 演講的整整兩年後,咱們正式發佈了 1.0。

在社交媒體上,這個版本很是受歡迎。咱們的相關博客被廣爲傳播。咱們也收穫了大量的新用戶和新貢獻者。

發佈後咱們緊張地回到了有關運行時重要組件的工做中:TypeScript 宿主中的依賴關係分析是使用 SWC 重寫的。此次的改動標誌着咱們開始着手用 Rust 來重寫 TypeScript 基礎架構的一些部分。

本月發佈的版本:1.0.0-rc11.0.0-rc21.0.0-rc31.0.01.0.11.0.21.0.3

精讀筆記:

  • Deno JSON imports:1.0 發佈以前因缺少標準被刪除掉,想要導入一個 .json 文件能夠在有 --allow-read 的狀況下編寫 Deno.readTextFileDeno.readTextFileSync 來實現。此提議於 2018 年 10 月 21 日提出並討論 (#1048)。
  • WASM imports:1.0 發佈以前因缺少標準被刪除掉。此提議在 (#2552) (#5609) 等中討論。WebAssembly 的 esm 集成標準提案進程。當時去掉了 import './foo.wasm' 的支持,但依然能夠經過 WebAssembly API 來使用。

六月:增量類型檢查以及 deno lint

1.0 發佈後,從社區中收到最多的反饋之一就是 TypeScript 的編譯和類型檢查很是得慢。此後咱們着眼於改進 TSC 集成來支持增量類型檢查。通過幾回反覆試驗的 PR,咱們可以使功能正常工做,而且顯著地改進了開發效率。儘管咱們經過利用 TSC 的增量 API 設法提升了類型檢查的速度,但咱們仍然須要依靠它來 emit 已轉義的源。TypeScript 的偉大設計原則之一是它只是一個具備附加語法的 JavaScript,所以剝離類型信息(轉換爲 JavaScript)是相對容易的操做。因此咱們設定了可以在 Rust 中使用 SWC 進行轉移的同時,繼續使用 TSC 進行類型檢查的目標。

通過幾個月的開發,在一個單獨的倉庫中,咱們添加了新的 deno lint 子命令。這是另外一個創建在 SWC JavaScript 解析器之上的項目。

本月發佈的版本:1.0.41.0.51.1.01.1.01.1.2

精讀筆記:

  • TSC:代指 TypeScript 編譯器模塊,同時 TypeScript 提供 tsc 命令來在命令行進行編譯。
  • deno_lint:是全新的倉庫,創建在由 Rust 開發的 SWC 解析器上。和 Deno 內置的 TSC 協同工做。

七月:將內部運行時代碼從 TypeScript 轉換爲 JavaScript

這個月,咱們作出了一個艱難的決定:將內部運行時代碼從 TypeScript 轉換爲 JavaScript。有幾個因素致使了咱們作出這個決定:Deno 內部運行時代碼的每一個構建過程當中,類型檢查、快照前綁定,都是複雜而緩慢的構建步驟。咱們有兩個獨立的 TypeScript 編譯器宿主。一個是 deno_typescript crate 只用於構建過程,另外一個被包含在 Deno 二進制文件中。此外,整個過程對構建時間有顯著影響:2 分鐘的增量重建!經過使用普通的 JavaScript,咱們可以極大地簡化內部構建依賴關係和整體複雜性。由於實際的 JavaScript 代碼是由 TypeScript 編譯器做爲單個文件包生成的,因此咱們幾乎沒法控制輸出代碼的類型。ES 模塊被轉換爲使用 bundle 的 SystemJS 加載程序,這爲最終 bundle 添加了大量代碼。

本月發佈的版本:1.1.31.2.01.2.11.2.2

精讀筆記:

JavaScript 規範包括許多內置功能,從數學函數到全功能正則表達式引擎。每一個新建立的 V8 上下文從一開始就有這些可用的函數。要使其工做,必須在建立上下文時設置全局對象(例如,瀏覽器中的 window 對象)和全部內置功能,並將其初始化到 V8 的堆中。從頭開始作這件事須要至關長的時間。

幸運的是,V8 使用了一種快捷方式來加快速度:就像解凍速食披薩同樣,咱們將預先準備好的快照直接反序列化到堆中,以得到初始化的上下文。在普通臺式計算機上,這能夠將建立上下文的時間從 40 毫秒減小到不到 2 毫秒。在普通移動電話上,這可能意味着 270 毫秒和 10 毫秒之間的差別。

八月:新的鏡像源網站發佈

原始文章: deno.land/posts/regis…

八月三日,咱們發佈了一個全新的 deno.land/x 鏡像源,能夠用來經過使用 WebHooks 與 Github 集成。每當一個模塊被更新,咱們的系統會下載並永遠保存其源代碼,這樣咱們就能夠依賴不可變的源代碼連接。

因爲在使用 Deno 基礎設施時進行了一些非公開工做,咱們開始努力將 Deno 系統分解成更小的「op crates」,能夠混合和匹配以生成定製的 V8 運行時。8 月份,咱們朝着這個目標邁出了第一步,發佈了 deno_web crate,它提供了一些基本的 Web API,好比 EventTextUncoderTextDecoder

這個月,基準系統使用 Rust 重寫,這標誌着減小 Deno 項目的構建依賴性的單調工做的開始。

本月發佈的版本:1.2.31.3.01.3.11.3.2

精讀筆記:

  • Deno 鏡像源:其中註冊的項目的每一個版本會被永久保存,來提供信任的 URL 資源。國內鏡像源加速服務可使用 x.deno.js.cn
  • Deno 基準系統:做爲 Deno 持續集成和測試管道的一部分,來度量運行時某些關鍵的性能。運行時指標包括執行時間、線程計數、系統調用計數、最大內存使用量;TypeScript 性能指標包括類型檢查、I/O、HTTP 延遲、HTTP 代理吞吐量、吞吐量;大小指標包括文件大小、捆綁包大小、Cargo 依賴數。可視化數據長久訪問地址:deno.land/benchmarks。

九月:WebSocket API、終端下的 CSS 樣式、文件監聽、測試覆蓋

本月,咱們發佈了自 1.0 以來最大的功能版本。更多細節請參見 1.4.0 發佈說明文檔。

另外一個重要變化是關於項目的版本維護部分。發佈時間表正式改變:從每個月發佈一次改成每六週發佈一次新的版本,以與 Rust 和 Chrome 項目相匹配。

本月發佈的版本:1.3.31.4.01.4.11.4.2

精讀筆記:

  • WebSocket:是一種計算機通用協議,經過單個 TCP 鏈接提供全雙工通訊信道。WebSocket 協議在 2011 年被 IETF 標準化爲 rfc6455。WebSocket 不一樣於 HTTP。
  • 終端下的 CSS 樣式:大多數現代瀏覽器都支持控制檯中 console.log 的樣式化輸出,Deno 的目標是儘量地與 Web 兼容,如今正在努力更好地在終端下支持 CSS 樣式化。目前支持的 CSS 屬性包括 colorbackground-colorfont-weightfont-styletext-decoration-colortext-decoration-line 等,具體須要根據開發者終端的 ANSI 支持度來決定。
  • 文件監聽:1.4 版本熱更新時自動重啓服務,須要使用 deno run --watch
  • 測試覆蓋:1.4 版本支持得到測試覆蓋報告,須要使用 deno test --coverage

十月:REPL 翻新、捆綁改進、默認 isolatedModules

1.5.0 發佈說明

本月發生的最大變化是在 TypeScript 編譯器宿主中默認啓用 isolatedModules 選項。此設置更改了 TypeScript 的行爲,以確保每一個文件均可以由 TSC 之外的工具(如 SWC 和 Babel)隔離編譯(而無需知道其類型或其它模塊)。這一變化對模塊生態系統產生了重大影響,一度使得一些流行的模塊沒法使用,直到維護人員調整代碼以支持 isolatedModules

這個月咱們還在 SWC 中採用了新的 bundle 特性,這是對原始 TypeScript 編譯器轉向使用 Rust 方向的又一步邁進。

本月發佈的版本:1.4.31.4.41.4.51.4.61.5.01.5.1

精讀筆記:

  • isolatedModules:用來執行其餘檢查以確保單獨編譯(例如 transpileModule 或 @babel/plugin transform typescript)是安全的。若是設置了 isolatedModules,則全部實現文件都必須是模塊(這意味着它具備某種形式的導入/導出)。若是任何文件不是模塊,則會發生錯誤:'index.ts' cannot be compiled under '--isolatedModules' because it is considered a global script file. Add an import, export, or an empty 'export {}' statement to make it a module

十一月:大改 TSC 編譯器基礎架構

本月咱們看到了 Kitson Kelly 長達數週重寫編譯管道(compilation pipeline)的總結。它進一步地提升了 TypeScript 的編譯速度,更最重要的是減輕了大量的技術債務。

deno_crypto op crate 也被添加。

本月發佈的版本: 1.5.二、1.5.三、1.5.4。

精讀筆記:

十二月:自包含的二進制文件以及 LSP

1.6.0 發佈說明

在 12 月,咱們發佈了 1.6 版本,包含了兩個里程碑特性:自包含的二進制文件和語言服務器。deno compile 是 deno 的 bug 追蹤器中受期待的特點之一。

經過提供的內置語言服務器提升了全部可以使用 LSP 協議的編輯器的良好開發體驗。它致使了對 vscode_deno 的第三次翻新,此項工做目前還在進行中。

本月發佈的版本:1.6.01.6.11.6.21.6.3

精讀筆記:

  • 自包含二進制文件:自包含的單個二進制文件可讓用戶無需關注內核源碼,封裝即用。
  • LSP 語言服務器協議:由紅帽、微軟和 Codenvy 聯合推出,是編輯器/IDE 與語言服務器之間的協議,可讓不一樣的編輯器/IDE 嵌入各類程序語言,容許開發人員來提供相應。
  • vscode_deno:通過了三次以上的大翻新。如今支持 TypeScript 類型檢查、快速修復、懸停卡、IntelliSense 等等,其和 Deno 內置的 TypeScript 進行溝通;與 deno-lint 集成,帶有內聯診斷;也爲 deno fmt 代碼格式化提供支持。

2021 展望

到 2020 年,咱們在項目和社區中看到了許多的增加。這讓咱們對 Deno 進入 2021 年背後的支持倍感信心。請繼續關注即將推出的激動人心的公告!

若是你有興趣爲 Deno 作貢獻,或者只是想了解咱們的進展,請查看如下內容:

精讀筆記:

  • Deno 問卷調查重點問題包括:你使用 Deno 多久/多頻繁/用了哪些、阻礙你使用 Deno 的緣由有什麼、最吸引你的優點/內置工具是什麼、你在下個項目使用 Deno 的可能性多大、URL 導入以爲好嗎以及你有多願意推薦 Deno 給你周圍的人?
  • Deno 2021 Q1 路線圖包括但不止於:1 月 19 日發佈 1.7.0(已如期發佈)、3 月 2 日發佈 1.8.0、URL 導入支持 data:、重構運行時編譯器 API、支持遠程模塊的訪問令牌、IIFE budles、支持 React 17 jsx、rusty_v8 的 ICU、使用 WPT 測試內置 Web API、標準化運行時權限 API、結構化 worker 的 clone API、WebGPU 支持、bundles 的類型定義支持、ops 下的 V8 Fast API、URL 導入支持 blob: 等。
  • Web 測試套件:在 #8990 中 添加了 WPT runner,支持運行 Web 平臺測試,目前還在提升可測試經過的範圍。

譯者結語

全文譯完,並在每一個章節作了簡單的精讀筆記。本次翻譯不同凡響的地方在於,專業技術難度提升了一個數量級。本文中涉及了不少專業術語甚至要懂 Deno 特性發展歷程才能翻譯到位的地方,在精讀過程當中也都一一解決。翻譯過程當中產生了「Deno 詞彙表」的想法,已同步到 deno-tutorial 倉庫中。

Deno 鑽研之術》的精讀系列將重點圍繞官方博客展開,同時每翻譯完一篇文章,也會爭取 PR 合併到目前的 Deno 中文官網上。歡迎對 deno-tutorial 倉庫進行 star 或關注公衆號 (@ningowood) 來及時接收消息,攜手助力 Deno 在 2021 變得更好!

相關文章
相關標籤/搜索