來源:Alibaba F2E公衆号
作者:寒雁Talk
7月20日正式釋出的Chrome 92,帶來了哪些有意思的新特性呢?
背景
十多年來,Web技術突飛猛進,其中Chrome功不可沒,了解Chrome可以幫助我們了解整個行業的發展趨勢。
TL;TR
- Chrome 92最大的亮點是什麼?說實話,Chrome92并沒有什麼特别大的亮點,不過Array.prototype.at()還是挺實用的
- Chrome 92是哪天釋出的?2021-07-20
- Chrome 92更新了多少個特性?14個,具體有哪些特性可以檢視Chrome Platform Status
- Chrome 92将使用哪個版本的V8引擎?9.2
- 我感興趣的新特性依次有哪些?
Array.prototype.at()
crypto.randomUUID()
Canvas color management
Web Bluetooth manufacturer data filter
詳細解讀
想必大家都寫過這樣的代碼,使用數組長度減1來擷取過數組的最後一個元素:
const A = [1,2,3,4];
console.log(A[A.length - 1]);
作為一個有代碼潔癖的人,這樣的寫法冗長而奇怪。
現在好了,Chrome 92支援Array.prototype.at()了:
const A = [1,2,3,4];
console.log(A.at(-1));
代碼少了5個字元,可讀性也提高了很多,一舉兩得!
另外,除了Array,String與TypedArray也支援了at方法。
at方法對應的ECMAScript提案proposal-relative-indexing-method已經處于stage 3,目測最快明年将會納入ECMAScript規範。
日常開發中,我們經常會需要生成唯一ID,例如給每個使用者生成唯一ID。
npm包uuid的周下載下傳量高達4000萬+,我在自己的代碼裡也搜到了uuid子產品:

Chrome 92新增了crypto.randomUUID()方法,用于生成符合RFC 4122 version 4規範的唯一ID。
可惜的是,由于Firefox、Safari等其他浏覽器沒有支援,是以前端項目中将依然需要使用uuid子產品。
不過,Node.js 14.17.0已經支援了crypto.randomUUID()方法,而生成唯一ID通常是在後端進行,是以目測uuid子產品的使用量将會有所降低。使用官方提供的API更加安全,且性能更好。
要保證随機生成的UUID的唯一性和安全性,是一個看起來簡單,但實際非常複雜的問題。圖靈獎得主Donald Knuth在他的鴻篇巨制《The Art of Computer Programming》中花了一個章節來讨論随機數:
It is not easy to invent a foolproof source of random numbers.
我們所熟悉的Math.random()其實名不副實,并不随機,它是一個僞随機數生成器(Pseudo Random Number Generator,簡稱PRNG),當我們指定同一個random_seed啟動時,它生成的随機數序列是一樣的!
// 示例代碼來源:[V8 Deep Dives] Random Thoughts on Math.random(),https://dev.to/puzpuzpuz/v8-deep-dives-random-thoughts-on-math-random-2ci4
node --random_seed=42
Welcome to Node.js v14.17.3.
Type ".help" for more information.
> Math.random()
0.5254990606499601
> Math.random()
0.963056226312738
node --random_seed=42
Welcome to Node.js v14.17.3.
Type ".help" for more information.
> Math.random()
0.5254990606499601
> Math.random()
0.963056226312738
也就是說,隻要黑客擷取了random_seed,就能預測Math.random()所傳回的"随機序列",是不是有點可怕?
當然,擷取random_seed并不是一件簡單的事情,不過并非沒有可能,因為random_seed不是随機的,而是依賴于一些内部狀态,比如浏覽器的啟動時間、某個變量的虛拟記憶體位址,這些内部狀态是有規律可循的。2014年,Andriod版的Firefox就曾被人破解過Math.random()。
是以,在對安全性要求比較高的場景中,不要使用Math.random()。CVE中有多個安全漏洞是與Math.random()相關。
為了滿足大家對于更加安全的加密API的需求,社群提供了很多解決方案,其中最出名的為CryptoJS。但是,對于加密這種CPU密集型應用,純JavaScript的方案存在比較嚴重的性能問題,且不夠安全。
是以,2017年,W3C釋出了Web Cryptography API,提供更加安全、性能更好的加密API。其中,crypto.getRandomValues()可以用于生成更加安全的随機數,它是密碼學安全僞随機數生成器(Cryptographically Secure Pseudo Random Number Generator,簡稱CSPRNG)。其實,CSPRNG也不能生成真正的随機數,隻是它可以通過一些嚴格的密碼學測試,可以認為是安全的。
crypto.randomUUID()是基于CSPRNG的,是以也可以認為是安全的。
crypto.randomUUID()雖然放在cypto對象中,但是它還并未被納入Web Cryptography API,是以還不是W3C标準。
目前,2D canvas僅支援陳舊的sRGB色域,但是現在的螢幕和相機早就支援更大的色域了。
色域是什麼呢?它的英文名是Color Gamut或者Color Space,是裝置(顯示器、投影儀、列印機)可以表達的顔色範圍。人眼可見的顔色範圍是有限的,而裝置能表達的顔色範圍是人眼可見的顔色範圍的子集,而不同色域标準比如sRGB和Display P3能表達的顔色範圍也不一樣。
Chrome 92支援在建立2D canvas時,使用Display P3色域,這将增強2D canvas的顔色還原能力。
canvas.getContext('2d', { colorSpace: "display-p3"} );
Display P3的色域比sRGB的色域大25%,當我們對比兩者時,會發現Display P3要比sRGB明亮很多,差別非常明顯:
圖檔來源:Get Started with Display P3
對于圖像、視訊、設計、遊戲、地圖、外賣、電商等應用,準确還原顔色的重要性不言而喻。
大多數情況下,買家秀和賣家秀的明顯差異是由于賣家過度PS導緻的,但是也有可能是顔色沒有得到準确還原導緻的。
早在6年前,Chrome就開始開發Web Bluetooth了,不過直到今天,Web Bluetooth也沒有成為W3C标準,Safari和Firefox也沒有支援Web Bluetooth,這就有點尴尬了。
Chrome以一己之力推動了衆多Web技術标準的進步,但是從Web Bluetooth也可以看出,其過程還是比較艱辛的,需要時間和耐心。
不過,為了讓Web可以獲得原生應用一樣的能力,Chrome也不會放棄Web Bluetooth。
使用Web Bluetooth,Web應用也可以連接配接并控制各種藍牙裝置,比如彩燈、玩具車、LED、無人機,還是很有意思的:
視訊來源:WebBluetooth demos for Bluetooth.rocks
Chrome 92為Web Bluetooth新增了按照藍牙裝置的制造商來過濾藍牙裝置的能力。這樣,對于一些針對特定産商的Web應用,就可以隻給使用者展示對應産商的藍牙裝置。
總結
堅持更新這個系列的部落格還是挺難的,一方面工作太忙了,另一方面Chrome 92可以寫的内容确實不多,我也不是很熟悉,需要很多時間挖掘。但是,不管怎樣,我還是會堅持寫下去,因為每次都能學到一些新的東西。
寫部落格的過程中,我會閱讀大量的參考資料,并且記錄閱讀筆記,是以我閱讀的時間是遠遠大于寫作的時間的。如果不是為了寫作,我并不會對某一個知識點進行深究,這也是寫作最大的好處,通過輸入倒逼輸出,倒逼自己進行深度學習。
對于比較權威,内容很有啟發的參考資料,我都會列到文章後面。這樣既是對作者版權的尊重,也是友善自己和讀者去閱讀相關資料。某個知識點真正優質的内容是非常稀缺的,要找到這些資料是需要一些Google技巧的:準确變換不同的搜尋關鍵詞,不斷遞歸地挖掘最原始、最權威的第一手資料。
參考資料
- Chrome 89開啟Web應用的物聯網時代
- Chrome 90将預設使用HTTPS,Web更安全了
- Chrome 91支援WebAssembly SIMD,加Web在AI等領域的應用
- Chrome 92: Web Apps as File Handlers, New JavaScript Features, and More
- V8 release v9.2
- at method for relative indexing
- crypto.randomUUID is three times faster uuid.v4
- Overtaking Firefox Profiles: Vulnerabilities in Firefox for Android
- TIFU by using Math.random()
- A Brief History of Random Numbers
- [V8 Deep Dives] Random Thoughts on Math.random()
- 《Art of Computer Programming, Volume 2: Seminumerical Algorithms, 3rd Edition》Chapter 3: Random Numbers
- Securing JavaScript applications with the Web Cryptography API
- Update on Web Cryptography
- Get Started with Display P3
- Improving Color on the Web
- Pixar in a Box: Color science
- An Introduction To WebBluetooth
- WebBluetooth demos for Bluetooth.rocks