<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          2021 年 JavaScript 大事記

          共 11386字,需瀏覽 23分鐘

           ·

          2021-12-28 14:21

          文末送一本《了不起的程序員2022》

          大家好,我是 桃翁,不知不覺中,2021 年已經(jīng)接近尾聲了,不知道在 2021 這一年,你收獲了什么?又失去了什么呢?

          又到了開始做年終總結(jié)的時候了,今天,我來給 JavaScript 做個年終總結(jié),大家來跟我一起回顧一下,這魔幻的一年中,JavaScript 發(fā)生了哪些大事件。

          2021.1.6 Snowpack 3.0 發(fā)布

          Snowpack 是一個 JavaScript 構(gòu)建工具,它利用了瀏覽器對 ESM 的支持,讓我們可以構(gòu)建單個文件并將其發(fā)送到瀏覽器中。每一個被構(gòu)建的文件都會被緩存,在我們每修改一個文件時,只有這一個文件會被 Snowpack 重新構(gòu)建。

          Snowpack 3.0 于 2021 年 1 月 6 日發(fā)布,這是它迄今以來最大的一次版本更新,包括很多非常重要的新特性,比如

          • experiments.source:按需加載 npm 導入的新方法,可以完全跳過前端的 npm install 步驟。
          • experiments.optimize:內(nèi)置打包、預加載和資產(chǎn)最小化能力。
          • experiments.routes:用于 HTML 回退和 API 代理的高級配置。
          • import 'snowpack':用于 Snowpack 集成的全新 JavaScript API。

          2021.1.9 React 創(chuàng)始人離職

          React 的創(chuàng)始人 jordwalke 離開了 Facebook,去追逐新的夢想,在 Facebook 的十年中,他曾創(chuàng)建了 ReactReasonML。

          2021.2.2 npm 7.0 正式可用

          npm 7.0 在 2020 年就發(fā)布了,直到2021年2月,才打上 latest 標簽,這意味著大家可以在正式環(huán)境中使用了,此次更新也帶來了非常多的變化

          • 性能優(yōu)化:npm 本身的依賴數(shù)量降低46%(npm6 有 123 個依賴 npm7 只有67個),提升了 17% 的代碼覆蓋率,在各種基準測試中有顯著的性能改進。
          • 自動安裝 peerDependencies:在 npm7 之前,開發(fā)人員需要自己管理和安裝 peerDependencies
          • yarn.lock 支持:npm7 (package-lock v2) 可以使用 yarn.lock 來記錄當前狀態(tài)下實際安裝的各個 npm package 的具體來源和版本號,還會保持更新。
          • workspace:支持從單個頂級軟件包中管理多個子包。

          2021.2.17 Vite 2.0 發(fā)布

          Vite 1.0 雖然之前進入了 RC 階段,但在發(fā)布之前,Vite 團隊決定進行一次徹底的重構(gòu)來解決一些設(shè)計缺陷,所以 Vite 2.0 其實是 Vite 的第一個穩(wěn)定版本,帶來了大量的改進:

          • 多框架支持:Vite 提供官方的 Vue、React、Preact、Lit Element 項目模版,而 Svelte 社區(qū)也在開發(fā) Vite 整合方案。
          • 全新插件機制和 API:采用了基于 Rollup 插件 API 的設(shè)計,可以在使用 Rollup 插件鉤子之外使用一些額外的 Vite 特有的 API 來處理一些打包中不存在的需求。
          • 基于 esbuild 的依賴預打包:使用 esbuild 來減少模塊/請求數(shù)量、支持 CommonJS 依賴。
          • 更好的 CSS 支持:支持CSS 代碼分割、強化路徑解析、自動 URL 改寫。
          • 其他:服務端渲染支持、舊瀏覽器支持 ...

          尤雨溪年初曾在一個回答里預言 2021 會有很多人從 Webpack 轉(zhuǎn)向 vite,如今來看,預言實現(xiàn):

          如今的 Vite ,已經(jīng)有了非常完善的生態(tài):

          2021.3.4 V8 宣布加速發(fā)布周期

          為了更快地向用戶提供新功能和錯誤修復,Chrome 加快了其發(fā)布周期。

          為了配合 Chrome 的新發(fā)布節(jié)奏,V8 將開始每 4 周(之前是 6 周)標記一個主要發(fā)布分支。

          2021.3.6 jQuery 3.6.0 發(fā)布

          距離2020年5月發(fā)布的 jQuery 3.5.1 版本,jQuery 在2021年3月終于又發(fā)布了 3.6.0 版本,這個版本并沒有新功能,也不包括安全修復、主要是對 JSONP、Ajax 等 API 的問題修復。

          jQuery 的一大優(yōu)勢是升級不會帶來任何問題(因為升級主要是在修復問題),評論區(qū)還是有很多堅定的支持者:

          2021.3.9 ECMAScript 2021 候選版本發(fā)布

          其中包括一些我比較感興趣的新特性:

          • 數(shù)字分隔符(_):為了提高可讀性,新的 JavaScript 語言啟用了下劃線作為數(shù)字文字中的分隔符,例如:1_000_000_000_000。
          • Promise.anyPromise.any 方法和 Promise.race 類似,只要給定的數(shù)組中的有一個 promise 成功,就采用第一個 promise 的值作為它的返回值,但與 Promise.race 的不同之處在于它會等到所有 promise 都失敗之后才返回失敗的值。
          const?promises?=?[
          ??fetch('/endpoint-a').then(()?=>?'a'),
          ??fetch('/endpoint-b').then(()?=>?'b'),
          ??fetch('/endpoint-c').then(()?=>?'c'),
          ];
          try?{
          ??const?first?=?await?Promise.any(promises);
          ??//?任何一個?Promise?為?fulfilled?狀態(tài)
          ??console.log(first);
          ??//?→???'b'
          }?catch?(error)?{
          ??//?所有?Promise?都被?rejected?了
          ??console.assert(error?instanceof?AggregateError);
          ??//?reject?結(jié)果數(shù)組
          ??console.log(error.errors);
          }
          • 弱引用:在以前,WeakMapWeakSet 是JS中創(chuàng)建弱引用對象的唯一方法,WeakRef 是一個更高級的 API,可以用來指定目標對象不脫離垃圾收集保留它的對象。如果未通過垃圾回收回收目標對象,則 WeakRefs 可以取消引用以允許訪問目標對象。另外還新增了 FinalizationRegistry 對象,可以在垃圾回收對象時請求回調(diào)。
          const?ref?=?new?WeakRef(targetObject)
          const?obj?=?ref.deref()

          const?registry?=?new?FinalizationRegistry([callback])
          registry.register(target,?heldValue,?[unregisterToken])
          • String.prototype.replaceAll:提供了一種簡便的方式來替換子字符串的所有匹配,而不再需要創(chuàng)建全局 RegExp 。

          看下面的例子,以前你要把 queryString 中所有的 + 替換掉,需要創(chuàng)建一個全局的正則:

          const?queryString?=?'q=query+string+parameters';
          queryString.replace(/\+/g,?'?');

          現(xiàn)在你只需要使用 replaceAll 方法:

          queryString.replaceAll('+',?'?');
          • 邏輯賦值運算符(&&=,||=,??=):是一種新的復合賦值運算符,他可以把邏輯操作 &&,||?? 與賦操作結(jié)合成一條命令。
          x?&&=?y;
          //?等同于?x?&&?(x?=?y)
          x?||=?y;
          //?等同于?x?||?(x?=?y)
          x???=?y;
          //?等同于?x????(x?=?y)

          2021.3.17 Node.js 的下一個 10 年

          Node.js 在它的前 10 年非常成功,這個項目正在努力使下一個 10 年變得更好,Node.js 官方發(fā)布了對 Node.js 未來十年的展望,并且啟動了 Next-10 工作:

          2021.3.17 V8 9.0 發(fā)布

          V8 9.0V8 的一個主要版本,和 Chrome 90 Stable 一起發(fā)布,包括下面這些主要亮點:

          • 正則匹配索引:從 v9.0 開始,開發(fā)者可以獲取正則表達式匹配中匹配的捕獲組的開始和結(jié)束位置的數(shù)組。當正則表達式帶有 /d 標志時,這個數(shù)組可以通過匹配對象上的 .indices 屬性獲得。
          • 更快的 super 屬性訪問:通過使用 V8 的內(nèi)聯(lián)緩存系統(tǒng)和 TurboFan 中優(yōu)化的代碼生成,對 super 屬性(例如 super.x )的訪問進行了優(yōu)化。
          • 更快的 JS-to-Wasm 調(diào)用。
          • 禁用 for ( async of 寫法。

          詳情可以看文章:V8 9.0 版本都有哪些新東西?

          2021.3.29 Deno 公司成立

          Node.js 作者 Ryan Dahl 在博客中闡述了對 Deno 的未來愿景,以及 Deno 對于 Web 開發(fā)的意義。他們相信 JavaScript 將在未來很長一段時間內(nèi)存在于互聯(lián)網(wǎng),并且會是速度最快、最受歡迎且唯一具有工業(yè)標準化流程的語言。

          他還提到了曾創(chuàng)建的 Node.js 項目,并表示它雖然取得了一定成功,但是服務器端 JavaScript 發(fā)展得如此的支離破碎,基礎(chǔ)設(shè)施也十分不完善,甚至未能跟上瀏覽器平臺的發(fā)展,所以服務器端 JavaScript 一直停滯不前。

          為了積極推行這些想法,Ryan DahlBert Belder 成立了 Deno 公司,并籌集到 490 萬美元的種子資金。他們會先用這筆投資組建專職的工程師團隊,以改進 Deno。

          2021.4.13 中國首個 JavaScript 語言提案在 ECMA 進入 Stage 3

          該提案是阿里巴巴前端標準化小組與淘系技術(shù)部門近期在 TC39 技術(shù)委員會上提出的《Error Cause》,將開始在 JavaScript 引擎中開始實現(xiàn),并在瀏覽器、Node.js 實驗性實施。

          async?function?doJob()?{
          ??const?rawResource?=?await?fetch('//domain/resource-a')
          ????.catch(err?=>?{
          ??????//?How?to?wrap?the?error?properly?
          ??????//?1.?throw?new?Error('Download?raw?resource?failed:?'?+?err.message);
          ??????//?2.?const?wrapErr?=?new?Error('Download?raw?resource?failed');
          ??????//????wrapErr.cause?=?err;
          ??????//????throw?wrapErr;
          ??????//?3.?class?CustomError?extends?Error?{
          ??????//??????constructor(msg,?cause)?{
          ??????//????????super(msg);
          ??????//????????this.cause?=?cause;
          ??????//??????}
          ??????//????}
          ??????//????throw?new?CustomError('Download?raw?resource?failed',?err);
          ????})
          ??const?jobResult?=?doComputationalHeavyJob(rawResource);
          ??await?fetch('//domain/upload',?{?method:?'POST',?body:?jobResult?});
          }

          await?doJob();?//?=>?TypeError:?Failed?to?fetch

          Error Cause 2021.4.13 進入 Stage 3,也是我國首個進入在 ECMA 進入 Stage 3 的 JavaScript 語言提案。

          2021.10.26 該提案已進入 Stage 4

          2021.4.21 Node.js16 發(fā)布

          Node.js 16 替代 Node.js 15 成為當前的主要發(fā)布版本,同時 Node.js 10 在這個月底止維護。

          帶來以下主要更新:

          • Timers Promises API:提供了另一組返回 Promise 對象的定時器函數(shù),不再需要使用 util.promisify()。
          • AbortController:基于 AbortController Web API 的穩(wěn)定實現(xiàn)
          • 標準 Web Crypto API 試驗性實現(xiàn)
          • Stable Source Maps v3
          • Node.js v16 中的 npm 版本升至 v7.10.0
          • V8 更新至 V8 9.0

          2021.5.28 React 18 alpha 發(fā)布

          React 團隊在5月份宣布了 React 18 的發(fā)布計劃,并且發(fā)布了 React 18alpha 版本(在11月份進入 beta 版本,后面就不寫了)。這個版本主要是增強了 React 應用的 并發(fā)渲染 能力。

          你可以在 React 18 中嘗試體驗以下幾個新特性:

          • 新的 ReactDOM.createRoot() API(替換 ReactDOM.render()

          • 新的 startTransition API(主要用于非緊急狀態(tài)更新)

          • 渲染的自動批處理優(yōu)化(主要解決異步回調(diào)中無法批處理的問題)

          • 支持 React.lazy 的 全新 SSR 架構(gòu)(支持 組件)

          • 詳細可以看:【第一批吃螃蟹】試用 React 18 !

          • 另外我還寫了一篇文章介紹 React 幾個主要階段的重點工作內(nèi)容:React 框架運行時優(yōu)化方案的演進

          2021.6.17 Undici4 發(fā)布

          在以前,request 是在 Node.js 中發(fā)送一個 HTTP 請求的首要選擇,但是這個包在 2020 年 2 月 11 日已經(jīng)標記為棄用。

          現(xiàn)在, Node.js 官方推薦 Undici4 作為在 Node.js 中發(fā)送 HTTP 請求的推薦選擇,它更快速、可靠且符合規(guī)范,下面是一個小 Demo:

          import?{?request?}?from?'undici'

          const?{
          ??statusCode,
          ??headers,
          ??trailers,
          ??body
          }?=?await?request('http://localhost:3000/code秘密花園')

          console.log('response?received',?statusCode)
          console.log('headers',?headers)

          for?await?(const?data?of?body)?{
          ??console.log('data',?data)
          }

          console.log('trailers',?trailers)

          Undici4 使用 WASM 構(gòu)建 llhttp,性能得到飛速提升。

          2021.7.20 Node-RED 2.0 發(fā)布

          Node-RED 是一個基于 Node.js 的低代碼編程工具,可以用新穎有趣的方式將硬件設(shè)備,API和在線服務連接在一起。

          它提供了一個基于瀏覽器的編輯器,使得我們可以輕松地使用編輯面板中的各種節(jié)點將流連接在一起,只需單擊即可將其部署到其運行時。

          現(xiàn)在,Node-RED 發(fā)布了 2.0 版本,這需要 Node.js 12.17.x 或更高版本,另外也帶來了非常多的新特性。

          2021.8.3 Vue.js 被選作維基百科的前端框架

          維基媒體基金會 (Wikimedia Foundation) 宣布正式采用 Vue.js 作為未來的 JavaScript 框架 —— 用于維基百科的底層引擎 MediaWiki。

          2021.8.5 Vue 3.2 發(fā)布

          8 月 5 日,Vue.js 作者尤雨溪在博客上宣布 Vue.js 3.2 版本正式發(fā)布。

          以下為更新的主要內(nèi)容: