天天看點

Chrome 92 新增 at 和 randomUUID 方法,Canvas 支援 Display P3 色域背景詳細解讀總結參考資料

來源: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 新增 at 和 randomUUID 方法,Canvas 支援 Display P3 色域背景詳細解讀總結參考資料

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明亮很多,差別非常明顯:

Chrome 92 新增 at 和 randomUUID 方法,Canvas 支援 Display P3 色域背景詳細解讀總結參考資料

圖檔來源: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
Chrome 92 新增 at 和 randomUUID 方法,Canvas 支援 Display P3 色域背景詳細解讀總結參考資料

繼續閱讀