2021 年 JavaScript 大事記
不知不覺中,2021 年已經(jīng)接近尾聲了,不知道在 2021 這一年,你收獲了什么?又失去了什么呢?
又到了開始做年終總結(jié)的時(shí)候了,今天,我來給 JavaScript 做個(gè)年終總結(jié),大家來跟我一起回顧一下,這魔幻的一年中,JavaScript 發(fā)生了哪些大事件。
2021.1.6 Snowpack 3.0 發(fā)布

Snowpack 是一個(gè) JavaScript 構(gòu)建工具,它利用了瀏覽器對(duì) ESM 的支持,讓我們可以構(gòu)建單個(gè)文件并將其發(fā)送到瀏覽器中。每一個(gè)被構(gòu)建的文件都會(huì)被緩存,在我們每修改一個(gè)文件時(shí),只有這一個(gè)文件會(huì)被 Snowpack 重新構(gòu)建。
Snowpack 3.0 于 2021 年 1 月 6 日發(fā)布,這是它迄今以來最大的一次版本更新,包括很多非常重要的新特性,比如
experiments.source:按需加載 npm 導(dǎo)入的新方法,可以完全跳過前端的 npm install 步驟。experiments.optimize:內(nèi)置打包、預(yù)加載和資產(chǎn)最小化能力。experiments.routes:用于 HTML 回退和 API 代理的高級(jí)配置。import 'snowpack':用于 Snowpack 集成的全新 JavaScript API。
2021.1.9 React 創(chuàng)始人離職

React 的創(chuàng)始人 jordwalke 離開了 Facebook,去追逐新的夢(mèng)想,在 Facebook 的十年中,他曾創(chuàng)建了 React 和 ReasonML。
2021.2.2 npm 7.0 正式可用

npm 7.0 在 2020 年就發(fā)布了,直到2021年2月,才打上 latest 標(biāo)簽,這意味著大家可以在正式環(huán)境中使用了,此次更新也帶來了非常多的變化
性能優(yōu)化:npm 本身的依賴數(shù)量降低 46%(npm6 有 123 個(gè)依賴 npm7 只有67個(gè)),提升了17%的代碼覆蓋率,在各種基準(zhǔn)測試中有顯著的性能改進(jìn)。自動(dòng)安裝 peerDependencies:在 npm7 之前,開發(fā)人員需要自己管理和安裝peerDependenciesyarn.lock支持:npm7 (package-lock v2) 可以使用yarn.lock來記錄當(dāng)前狀態(tài)下實(shí)際安裝的各個(gè)npm package的具體來源和版本號(hào),還會(huì)保持更新。workspace:支持從單個(gè)頂級(jí)軟件包中管理多個(gè)子包。
2021.2.17 Vite 2.0 發(fā)布

Vite 1.0 雖然之前進(jìn)入了 RC 階段,但在發(fā)布之前,Vite 團(tuán)隊(duì)決定進(jìn)行一次徹底的重構(gòu)來解決一些設(shè)計(jì)缺陷,所以 Vite 2.0 其實(shí)是 Vite 的第一個(gè)穩(wěn)定版本,帶來了大量的改進(jìn):
多框架支持: Vite提供官方的 Vue、React、Preact、Lit Element 項(xiàng)目模版,而 Svelte 社區(qū)也在開發(fā)Vite整合方案。全新插件機(jī)制和 API:采用了基于 Rollup插件 API 的設(shè)計(jì),可以在使用Rollup插件鉤子之外使用一些額外的Vite特有的 API 來處理一些打包中不存在的需求。基于 esbuild的依賴預(yù)打包:使用esbuild來減少模塊/請(qǐng)求數(shù)量、支持 CommonJS 依賴。更好的 CSS 支持:支持CSS 代碼分割、強(qiáng)化路徑解析、自動(dòng) URL 改寫。 其他:服務(wù)端渲染支持、舊瀏覽器支持 ...
尤雨溪年初曾在一個(gè)回答里預(yù)言 2021 會(huì)有很多人從 Webpack 轉(zhuǎn)向 vite,如今來看,預(yù)言實(shí)現(xiàn):

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

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

為了更快地向用戶提供新功能和錯(cuò)誤修復(fù),Chrome 加快了其發(fā)布周期。
為了配合 Chrome 的新發(fā)布節(jié)奏,V8 將開始每 4 周(之前是 6 周)標(biāo)記一個(gè)主要發(fā)布分支。
2021.3.6 jQuery 3.6.0 發(fā)布
距離2020年5月發(fā)布的 jQuery 3.5.1 版本,jQuery 在2021年3月終于又發(fā)布了 3.6.0 版本,這個(gè)版本并沒有新功能,也不包括安全修復(fù)、主要是對(duì) JSONP、Ajax 等 API 的問題修復(fù)。
jQuery 的一大優(yōu)勢(shì)是升級(jí)不會(huì)帶來任何問題(因?yàn)樯?jí)主要是在修復(fù)問題),評(píng)論區(qū)還是有很多堅(jiān)定的支持者:

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

其中包括一些我比較感興趣的新特性:
數(shù)字分隔符(_):為了提高可讀性,新的 JavaScript語言啟用了下劃線作為數(shù)字文字中的分隔符,例如:1_000_000_000_000。Promise.any:Promise.any方法和Promise.race類似,只要給定的數(shù)組中的有一個(gè)promise成功,就采用第一個(gè)promise的值作為它的返回值,但與Promise.race的不同之處在于它會(huì)等到所有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);
??//?任何一個(gè)?Promise?為?fulfilled?狀態(tài)
??console.log(first);
??//?→???'b'
}?catch?(error)?{
??//?所有?Promise?都被?rejected?了
??console.assert(error?instanceof?AggregateError);
??//?reject?結(jié)果數(shù)組
??console.log(error.errors);
}
弱引用:在以前, WeakMap和WeakSet是JS中創(chuàng)建弱引用對(duì)象的唯一方法,WeakRef是一個(gè)更高級(jí)的 API,可以用來指定目標(biāo)對(duì)象不脫離垃圾收集保留它的對(duì)象。如果未通過垃圾回收回收目標(biāo)對(duì)象,則WeakRefs可以取消引用以允許訪問目標(biāo)對(duì)象。另外還新增了FinalizationRegistry對(duì)象,可以在垃圾回收對(duì)象時(shí)請(qǐng)求回調(diào)。
const?ref?=?new?WeakRef(targetObject)
const?obj?=?ref.deref()
const?registry?=?new?FinalizationRegistry([callback])
registry.register(target,?heldValue,?[unregisterToken])
String.prototype.replaceAll:提供了一種簡便的方式來替換子字符串的所有匹配,而不再需要?jiǎng)?chuàng)建全局RegExp。
看下面的例子,以前你要把 queryString 中所有的 + 替換掉,需要?jiǎng)?chuàng)建一個(gè)全局的正則:
const?queryString?=?'q=query+string+parameters';
queryString.replace(/\+/g,?'?');
現(xiàn)在你只需要使用 replaceAll 方法:
queryString.replaceAll('+',?'?');
邏輯賦值運(yùn)算符( &&=,||=,??=):是一種新的復(fù)合賦值運(yùn)算符,他可以把邏輯操作&&,||或??與賦操作結(jié)合成一條命令。
x?&&=?y;
//?等同于?x?&&?(x?=?y)
x?||=?y;
//?等同于?x?||?(x?=?y)
x???=?y;
//?等同于?x????(x?=?y)
2021.3.17 Node.js 的下一個(gè) 10 年
Node.js 在它的前 10 年非常成功,這個(gè)項(xiàng)目正在努力使下一個(gè) 10 年變得更好,Node.js 官方發(fā)布了對(duì) Node.js 未來十年的展望,并且啟動(dòng)了 Next-10 工作:

2021.3.17 V8 9.0 發(fā)布
V8 9.0 是 V8 的一個(gè)主要版本,和 Chrome 90 Stable 一起發(fā)布,包括下面這些主要亮點(diǎn):
正則匹配索引:從 v9.0開始,開發(fā)者可以獲取正則表達(dá)式匹配中匹配的捕獲組的開始和結(jié)束位置的數(shù)組。當(dāng)正則表達(dá)式帶有/d標(biāo)志時(shí),這個(gè)數(shù)組可以通過匹配對(duì)象上的.indices屬性獲得。更快的 super 屬性訪問:通過使用 V8的內(nèi)聯(lián)緩存系統(tǒng)和TurboFan中優(yōu)化的代碼生成,對(duì)super屬性(例如super.x)的訪問進(jìn)行了優(yōu)化。

更快的 JS-to-Wasm調(diào)用。禁用 for ( async of寫法。
詳情可以看文章:V8 9.0 版本都有哪些新東西?
2021.3.29 Deno 公司成立
Node.js 作者 Ryan Dahl 在博客中闡述了對(duì) Deno 的未來愿景,以及 Deno 對(duì)于 Web 開發(fā)的意義。他們相信 JavaScript 將在未來很長一段時(shí)間內(nèi)存在于互聯(lián)網(wǎng),并且會(huì)是速度最快、最受歡迎且唯一具有工業(yè)標(biāo)準(zhǔn)化流程的語言。

他還提到了曾創(chuàng)建的 Node.js 項(xiàng)目,并表示它雖然取得了一定成功,但是服務(wù)器端 JavaScript 發(fā)展得如此的支離破碎,基礎(chǔ)設(shè)施也十分不完善,甚至未能跟上瀏覽器平臺(tái)的發(fā)展,所以服務(wù)器端 JavaScript 一直停滯不前。
為了積極推行這些想法,Ryan Dahl 和 Bert Belder 成立了 Deno 公司,并籌集到 490 萬美元的種子資金。他們會(huì)先用這筆投資組建專職的工程師團(tuán)隊(duì),以改進(jìn) Deno。
2021.4.13 中國首個(gè) JavaScript 語言提案在 ECMA 進(jìn)入 Stage 3
該提案是阿里巴巴前端標(biāo)準(zhǔn)化小組與淘系技術(shù)部門近期在 TC39 技術(shù)委員會(huì)上提出的《Error Cause》,將開始在 JavaScript 引擎中開始實(shí)現(xiàn),并在瀏覽器、Node.js 實(shí)驗(yàn)性實(shí)施。
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 進(jìn)入 Stage 3,也是我國首個(gè)進(jìn)入在 ECMA 進(jìn)入 Stage 3 的 JavaScript 語言提案。
2021.10.26 該提案已進(jìn)入
Stage 4
2021.4.21 Node.js16 發(fā)布
Node.js 16 替代 Node.js 15 成為當(dāng)前的主要發(fā)布版本,同時(shí) Node.js 10 在這個(gè)月底止維護(hù)。

帶來以下主要更新:
Timers Promises API:提供了另一組返回Promise對(duì)象的定時(shí)器函數(shù),不再需要使用util.promisify()。AbortController:基于AbortController Web API的穩(wěn)定實(shí)現(xiàn)標(biāo)準(zhǔn) Web Crypto API試驗(yàn)性實(shí)現(xiàn)Stable Source Maps v3Node.js v16中的npm版本升至v7.10.0V8更新至V8 9.0
2021.5.28 React 18 alpha 發(fā)布
React 團(tuán)隊(duì)在5月份宣布了 React 18 的發(fā)布計(jì)劃,并且發(fā)布了 React 18 的 alpha 版本(在11月份進(jìn)入 beta 版本,后面就不寫了)。這個(gè)版本主要是增強(qiáng)了 React 應(yīng)用的 并發(fā)渲染 能力。

你可以在 React 18 中嘗試體驗(yàn)以下幾個(gè)新特性:
新的
ReactDOM.createRoot() API(替換ReactDOM.render())新的
startTransition API(主要用于非緊急狀態(tài)更新)渲染的自動(dòng)批處理優(yōu)化(主要解決異步回調(diào)中無法批處理的問題)
支持
React.lazy的 全新SSR架構(gòu)(支持組件)詳細(xì)可以看:【第一批吃螃蟹】試用 React 18 !
另外我還寫了一篇文章介紹
React幾個(gè)主要階段的重點(diǎn)工作內(nèi)容:React 框架運(yùn)行時(shí)優(yōu)化方案的演進(jìn)
2021.6.17 Undici4 發(fā)布
在以前,request 是在 Node.js 中發(fā)送一個(gè) HTTP 請(qǐng)求的首要選擇,但是這個(gè)包在 2020 年 2 月 11 日已經(jīng)標(biāo)記為棄用。
現(xiàn)在, Node.js 官方推薦 Undici4 作為在 Node.js 中發(fā)送 HTTP 請(qǐng)求的推薦選擇,它更快速、可靠且符合規(guī)范,下面是一個(gè)小 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 是一個(gè)基于 Node.js 的低代碼編程工具,可以用新穎有趣的方式將硬件設(shè)備,API和在線服務(wù)連接在一起。
它提供了一個(gè)基于瀏覽器的編輯器,使得我們可以輕松地使用編輯面板中的各種節(jié)點(diǎn)將流連接在一起,只需單擊即可將其部署到其運(yùn)行時(shí)。

現(xiàn)在,Node-RED 發(fā)布了 2.0 版本,這需要 Node.js 12.17.x 或更高版本,另外也帶來了非常多的新特性。
2021.8.3 Vue.js 被選作維基百科的前端框架

維基媒體基金會(huì) (Wikimedia Foundation) 宣布正式采用 Vue.js 作為未來的 JavaScript 框架 —— 用于維基百科的底層引擎 MediaWiki。
2021.8.5 Vue 3.2 發(fā)布
8 月 5 日,Vue.js 作者尤雨溪在博客上宣布 Vue.js 3.2 版本正式發(fā)布。

以下為更新的主要內(nèi)容:
新的 SFC 功能 - 你懂的网址国产,欧美 | 精品人妻中文字幕 | 久就热精品视频在线 | 日韩18禁 | 国产青青操视频 |
