- 原文地址:Deno in 2020
- 原文做者:Bartek Iwańczuk, Ryan Dahl
- 譯者:@hylerrix
- 原文發佈時間/翻譯時間:20210115/20210122
- 本文屬於《Deno 鑽研之術》系列,原文翻譯內容會同步更新到 Deno 中文官網中。
隨着 API 的穩定化改造、若干大型基礎架構的重構,以及諸多備受關注的功能開放,Deno 1.0 版本正式發佈。2020 年,Deno 迎來了衆多的挑戰和變化。javascript
請填寫這份 Deno 調查問卷來向咱們反饋以讓 Deno 在 2021 年變得更好。html
下文是 Deno 的 2020 年度回顧。前端
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.0、0.28.1、0.29.0、0.30.0、0.31.0。git
精讀筆記:github
參考資料:web
本月咱們完全地重構了 deno fmt
。與此以前,deno fmt
是一個簡單的子命令,其在背後只是最終指向 prettier
的「deno run」的一個別名。這意味着在首次運行 deno fmt
以及每次 prettier
升級後,用戶都必須下載 prettier
的最新版本。這和 Deno 承諾的內置工具開箱即用的原則很不契合。同時,prettier
真的很慢,其性能也有不少問題。正則表達式
咱們被推薦了 David Sherret 的 dprint 庫——一個基於 Kang Dong Yun 的 SWC JavaScript 解析器、並由 Rust 編寫的代碼格式化工具。dprint
能夠和 prettier
庫同樣的工做,但速度卻要快上好幾個數量級。通過了一些初步測算後,咱們決定在 deno fmt
中使用 dprint
。chrome
deno test
也有在首次運行該命令時從標準庫中下載模塊的問題。這致使添加了新的 Deno.test()
API,而且 deno test
CLI 子命令也讓測試成爲了 Deno 的一等公民。typescript
本月發佈的版本:0.32.0、0.33.0、0.34.0、0.35.0。
精讀筆記:
deno fmt
:Deno 內置工具之一,用來格式化 TypeScript/JavaScript 代碼。早期依賴 prettier
,如今由基於 Rust 語言的 dprint 提供支持,速度和性能都有所提升。deno test
:deno 內置工具之一,開箱即用提供測試基本功能。參考資料:
阻礙 Deno 1.0 發佈正式版的主要緣由是缺乏 Chrome Devtools 的支持。所以,咱們花了不少精力來增長對 V8 調試器的支持以及提升使用 Chrome Devtools 鏈接到 Deno 進程的能力。
CLI 中也添加了兩個新的命令:deno doc
和 deno upgrade
。
咱們同時經歷了構建過程的巨大改進。與此以前,Deno 中的每一次構建都會致使 V8 從源碼級別進行從新構建。V8 是一個龐大的 C++ 項目,經常須要花費 30 多分鐘來對其進行構建。儘管有大量的構建緩存和更多技巧,咱們也一直難以克服得更好。如今,咱們增長了 rusty_v8 在 Github 發行版上生成和下載預構建過的靜態庫的能力,從而容許 Deno 構建過程徹底繞過 V8 的構建。這簡化並加快了 CI 的構建,同時更重要的是,這讓貢獻者變得能夠更輕鬆地構建 Deno。
本月發佈的版本:0.36.0、0.37.0、0.37.1、0.38.0
精讀筆記:
deno doc
:內置工具之一,來從源碼中生成相關的 JSDoc 文檔。--json
標誌能夠生成 JSON 格式,也能夠用來生成模塊文檔。deno upgrade
:內置命令,能夠直接經過此命令開自升級 Deno 版本。參考資料:
本月爲 1.0 的正式發佈作準備,重點關注在審閱 Deno
global 全局中的 API。這致使了諸多破壞性地改動。對此咱們很謹慎:咱們將不肯定的全部 API 都須要被移到 --unstable
標誌以後。
這也是 1.0 版本的重要承諾;在 2.0 發佈以前,標記爲穩定的 Deno API 將不會有破壞性的更改。
本月是 Deno 版本以 0.x.y 命名的最後階段。
本月發佈的版本:0.39.0、0.40.0、0.41.0、0.42.0。
精讀筆記:
本月初標記刪除了以下功能:
window.location
API刪除的緣由是,咱們不想由於 JSON/WASM imports 缺乏底層規範支持、或者 deno crate 下有 Rust API 額外維護負擔的狀況下提供相關 API。
終於在 5 月 13 日——Ryan 最初發表 Deno 演講的整整兩年後,咱們正式發佈了 1.0。
在社交媒體上,這個版本很是受歡迎。咱們的相關博客被廣爲傳播。咱們也收穫了大量的新用戶和新貢獻者。
發佈後咱們緊張地回到了有關運行時重要組件的工做中:TypeScript 宿主中的依賴關係分析是使用 SWC 重寫的。此次的改動標誌着咱們開始着手用 Rust 來重寫 TypeScript 基礎架構的一些部分。
本月發佈的版本:1.0.0-rc1、1.0.0-rc2、1.0.0-rc3、1.0.0、1.0.1、1.0.2、1.0.3。
精讀筆記:
.json
文件能夠在有 --allow-read
的狀況下編寫 Deno.readTextFile
或 Deno.readTextFileSync
來實現。此提議於 2018 年 10 月 21 日提出並討論 (#1048)。import './foo.wasm'
的支持,但依然能夠經過 WebAssembly API 來使用。1.0 發佈後,從社區中收到最多的反饋之一就是 TypeScript 的編譯和類型檢查很是得慢。此後咱們着眼於改進 TSC 集成來支持增量類型檢查。通過幾回反覆試驗的 PR,咱們可以使功能正常工做,而且顯著地改進了開發效率。儘管咱們經過利用 TSC 的增量 API 設法提升了類型檢查的速度,但咱們仍然須要依靠它來 emit 已轉義的源。TypeScript 的偉大設計原則之一是它只是一個具備附加語法的 JavaScript,所以剝離類型信息(轉換爲 JavaScript)是相對容易的操做。因此咱們設定了可以在 Rust 中使用 SWC 進行轉移的同時,繼續使用 TSC 進行類型檢查的目標。
通過幾個月的開發,在一個單獨的倉庫中,咱們添加了新的 deno lint
子命令。這是另外一個創建在 SWC JavaScript 解析器之上的項目。
本月發佈的版本:1.0.4、1.0.5、1.1.0、1.1.0、1.1.2。
精讀筆記:
這個月,咱們作出了一個艱難的決定:將內部運行時代碼從 TypeScript 轉換爲 JavaScript。有幾個因素致使了咱們作出這個決定:Deno 內部運行時代碼的每一個構建過程當中,類型檢查、快照前綁定,都是複雜而緩慢的構建步驟。咱們有兩個獨立的 TypeScript 編譯器宿主。一個是 deno_typescript
crate 只用於構建過程,另外一個被包含在 Deno
二進制文件中。此外,整個過程對構建時間有顯著影響:2 分鐘的增量重建!經過使用普通的 JavaScript,咱們可以極大地簡化內部構建依賴關係和整體複雜性。由於實際的 JavaScript 代碼是由 TypeScript 編譯器做爲單個文件包生成的,因此咱們幾乎沒法控制輸出代碼的類型。ES 模塊被轉換爲使用 bundle 的 SystemJS 加載程序,這爲最終 bundle 添加了大量代碼。
本月發佈的版本:1.1.3、1.2.0、1.2.1、1.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,好比 Event
、TextUncoder
和 TextDecoder
。
這個月,基準系統使用 Rust 重寫,這標誌着減小 Deno 項目的構建依賴性的單調工做的開始。
本月發佈的版本:1.2.3、1.3.0、1.3.1、1.3.2。
精讀筆記:
本月,咱們發佈了自 1.0 以來最大的功能版本。更多細節請參見 1.4.0 發佈說明文檔。
另外一個重要變化是關於項目的版本維護部分。發佈時間表正式改變:從每個月發佈一次改成每六週發佈一次新的版本,以與 Rust 和 Chrome 項目相匹配。
本月發佈的版本:1.3.3、1.4.0、1.4.1、1.4.2。
精讀筆記:
console.log
的樣式化輸出,Deno 的目標是儘量地與 Web 兼容,如今正在努力更好地在終端下支持 CSS 樣式化。目前支持的 CSS 屬性包括 color
、background-color
、font-weight
、font-style
、text-decoration-color
和 text-decoration-line
等,具體須要根據開發者終端的 ANSI 支持度來決定。deno run --watch
。deno test --coverage
。本月發生的最大變化是在 TypeScript 編譯器宿主中默認啓用 isolatedModules
選項。此設置更改了 TypeScript 的行爲,以確保每一個文件均可以由 TSC 之外的工具(如 SWC 和 Babel)隔離編譯(而無需知道其類型或其它模塊)。這一變化對模塊生態系統產生了重大影響,一度使得一些流行的模塊沒法使用,直到維護人員調整代碼以支持 isolatedModules
。
這個月咱們還在 SWC 中採用了新的 bundle 特性,這是對原始 TypeScript 編譯器轉向使用 Rust 方向的又一步邁進。
本月發佈的版本:1.4.3、1.4.4、1.4.5、1.4.6、1.5.0、1.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
。本月咱們看到了 Kitson Kelly 長達數週重寫編譯管道(compilation pipeline)的總結。它進一步地提升了 TypeScript 的編譯速度,更最重要的是減輕了大量的技術債務。
deno_crypto op crate 也被添加。
本月發佈的版本: 1.5.二、1.5.三、1.5.4。
精讀筆記:
在 12 月,咱們發佈了 1.6 版本,包含了兩個里程碑特性:自包含的二進制文件和語言服務器。deno compile
是 deno 的 bug 追蹤器中受期待的特點之一。
經過提供的內置語言服務器提升了全部可以使用 LSP 協議的編輯器的良好開發體驗。它致使了對 vscode_deno 的第三次翻新,此項工做目前還在進行中。
本月發佈的版本:1.6.0、1.6.1、1.6.2、1.6.3。
精讀筆記:
到 2020 年,咱們在項目和社區中看到了許多的增加。這讓咱們對 Deno 進入 2021 年背後的支持倍感信心。請繼續關注即將推出的激動人心的公告!
若是你有興趣爲 Deno 作貢獻,或者只是想了解咱們的進展,請查看如下內容:
精讀筆記:
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:
等。全文譯完,並在每一個章節作了簡單的精讀筆記。本次翻譯不同凡響的地方在於,專業技術難度提升了一個數量級。本文中涉及了不少專業術語甚至要懂 Deno 特性發展歷程才能翻譯到位的地方,在精讀過程當中也都一一解決。翻譯過程當中產生了「Deno 詞彙表」的想法,已同步到 deno-tutorial 倉庫中。
《Deno 鑽研之術》的精讀系列將重點圍繞官方博客展開,同時每翻譯完一篇文章,也會爭取 PR 合併到目前的 Deno 中文官網上。歡迎對 deno-tutorial 倉庫進行 star 或關注公衆號 (@ningowood) 來及時接收消息,攜手助力 Deno 在 2021 變得更好!