Chrome 95有哪些有意思的新特性?
10月19日正式發(fā)布的Chrome 95,帶來(lái)了哪些新特性呢?
TL;TR
- Chrome 95最大的亮點(diǎn)是什么?WebAssembly終于支持異常處理了,這是WebAssembly所缺失的最重要的特性之一,將有利于壓縮體積并提升性能。
- Chrome 95是哪天發(fā)布的?2021-10-19
- Chrome 95更新了多少個(gè)特性?14個(gè),具體有哪些特性可以查看Chrome Platform Status
- Chrome 95將使用哪個(gè)版本的V8引擎?v9.5
- 我感興趣的正式特性有哪些?
- WebAssembly Exception Handling
- Secure payment confirmation
- EyeDropper API
- 我感興趣的試用(origin trial)特性有哪些?
- Reduce User Agent string information
詳細(xì)解讀
WebAssembly Exception Handling
WebAssembly Exception Handling于Chrome 90開(kāi)始試用,Chrome 95正式發(fā)布,為WebAssemly增加了異常處理語(yǔ)法,具體指令如下表所示:
ame |
Opcode |
Description |
try |
0x06 |
begins a block which can handle thrown exceptions |
catch |
0x07 |
begins the catch block of the try block |
catch_all |
0x19 |
begins the catch_all block of the try block |
delegate |
0x18 |
begins the delegate block of the try block |
throw |
0x08 |
Creates an exception defined by the tag and then throws it |
rethrow |
0x09 |
Pops the exnref on top of the stack and throws it |
WebAssembly/exception-handling提案由Google的開(kāi)發(fā)者負(fù)責(zé),當(dāng)前處于WebAssembly提案流程的Phase 3,并且得到了Firefox、Safari以及Edge的支持,因此預(yù)計(jì)將會(huì)成為正式標(biāo)準(zhǔn)。
WebAssembly自誕生以來(lái)就沒(méi)有異常處理語(yǔ)法,這是個(gè)挺大的問(wèn)題。在瀏覽器環(huán)境下,WebAssemly的異常是通過(guò)JavaScript的try/catch來(lái)"模擬"的,這繼承了Asm.js的處理方式。
基于JavaScript的WebAssembly異常處理方式如下圖所示:
- 左側(cè)為WebAssembly偽代碼,右側(cè)為JavaScript膠水代碼;
- 根據(jù)右側(cè)的JavaScript函數(shù)invoke_vi可知,WebAssembly模塊的調(diào)用放在了JavaScript的try/catch語(yǔ)句中;
- 根據(jù)右側(cè)的JavaScript函數(shù)___cxa_throw可知,WebAssmebly的throw語(yǔ)句實(shí)際上是使用JavaScript的throw語(yǔ)句來(lái)模擬;
- WebAssembly和JavaScript代碼互相來(lái)回調(diào)用,這樣生成的代碼量增加了很多,同時(shí)降低了執(zhí)行性能;
圖片來(lái)源:WebAssembly Exception Handling: A Toolchain's Perspective
根據(jù)初步的測(cè)試結(jié)果,基于WebAssembly原生的異常處理方式,代碼量降低了30%左右,同時(shí)性能提升了30%左右,這個(gè)結(jié)果可以說(shuō)非常理想了,用更少的代碼實(shí)現(xiàn)了更好的性能。從原理上來(lái)講,這個(gè)結(jié)果并不讓人意外。不過(guò),由于目前測(cè)試數(shù)據(jù)還非常少,因此WebAssembly Exception Handling的真實(shí)效果還有待于進(jìn)一步驗(yàn)證。
Secure payment confirmation
Secure payment confirmation于Chrome91開(kāi)始試用,Chrome 95正式發(fā)布,旨在為用戶提供更加安全、更加便捷的支付服務(wù)。
Secure Payment Confirmation為W3C提案,由Google的開(kāi)發(fā)者負(fù)責(zé),由于其他瀏覽器廠商并未表達(dá)是否支持,因此該提案何時(shí)能夠成為W3C標(biāo)準(zhǔn)并不好說(shuō)。
下圖非常直觀地展示了基于Secure Payment Confirmation的支付流程:發(fā)起支付、授權(quán)支付、驗(yàn)證支付。
圖片來(lái)源:Secure Payment Confirmation explained
Secure Payment Confirmation從2個(gè)方面優(yōu)化了支付服務(wù):
- 用戶無(wú)需離開(kāi)購(gòu)物站點(diǎn)(https://merchant.com),所有操作在對(duì)話框中完成,這樣提高了用戶體驗(yàn),也提高了轉(zhuǎn)化率;
- 用戶采用Web Authentication API進(jìn)行驗(yàn)證授權(quán),使用生物認(rèn)證(例如指紋)而非密碼進(jìn)行驗(yàn)證,更加安全,更加便捷;
這樣的體驗(yàn)類(lèi)似于在iOS應(yīng)用內(nèi)付費(fèi),無(wú)需離開(kāi)APP,刷臉即可,非常方便。
美國(guó)在線支付服務(wù)巨頭Stripe試用了Secure payment confirmation,為期3個(gè)月的實(shí)驗(yàn)結(jié)果表明,轉(zhuǎn)化率提升了8%(從84.7%提升到92.7%),授權(quán)速度提升了3倍(中位數(shù)從36s降低到了12s)。
中國(guó)的在線支付行業(yè)遠(yuǎn)遠(yuǎn)超越了歐美發(fā)達(dá)國(guó)家,這是時(shí)代發(fā)展的紅利,也是互聯(lián)網(wǎng)行業(yè)對(duì)于社會(huì)最大的貢獻(xiàn)之一。我想,大家只是習(xí)慣了這種只需要帶上手機(jī)的生活,沒(méi)有發(fā)現(xiàn)在線支付以及各種互聯(lián)網(wǎng)應(yīng)用是多么重要。
不過(guò),對(duì)于Web應(yīng)用來(lái)說(shuō),在線支付還存在一個(gè)不小的問(wèn)題,要么使用二維碼手機(jī)掃碼支付,要么需要跳轉(zhuǎn)到支付網(wǎng)站,整個(gè)支付體驗(yàn)并沒(méi)有達(dá)到最佳的狀態(tài)。要知道,用戶的每一次跳轉(zhuǎn)都有可能增加流失率。Secure payment confirmation可以減少用戶跳轉(zhuǎn)將可以有效提高體驗(yàn)以及轉(zhuǎn)化率,還是非常值得一試的。
EyeDropper API
Chrome 95正式發(fā)布了EyeDropper API,用于控制顏色選擇器,支持選擇瀏覽器窗口之外的顏色,目測(cè)可以用于Figma等設(shè)計(jì)類(lèi)工具。
EyeDropper API是WICG提案,由Microsoft的開(kāi)發(fā)者負(fù)責(zé)。
EyeDropper API的用法非常簡(jiǎn)單:
- const eyeDropper = new EyeDropper();
- try {
- const selectedColor = await eyeDropper.open();
- console.log(selectedColor); // 打印所選擇的顏色,例如:{ sRGBHex: '#ff0000' }
- } catch (err) {
- console.log("color selection cancelled"); // 用戶按ESC鍵關(guān)閉顏色選擇器
- }
創(chuàng)建一個(gè)EyeDropper實(shí)例之后,即可使用open方法打開(kāi)顏色選擇器,獲取用戶所選擇的顏色值:
圖片來(lái)源:EyeDropper API Explainer
從EyeDropper API也可以看出來(lái),Microsoft一直在積極參與瀏覽器標(biāo)準(zhǔn)制定和開(kāi)發(fā),由Edge瀏覽器主導(dǎo)或者積極參與的瀏覽器提案越來(lái)越多了,比如WebAssembly、WebCodecs、EyeDropper API、VirtualKeyboard API、Clipboard API: Svg。
誰(shuí)說(shuō)基于Chromium的瀏覽器就只能躺平?還是可以參與Web技術(shù)標(biāo)準(zhǔn)制定的。這對(duì)于國(guó)內(nèi)各大基于Chromium實(shí)現(xiàn)的瀏覽器還是有啟發(fā)意義的。。。
Microsoft曾經(jīng)通過(guò)非常手段將IE瀏覽器打造成為霸主,只是最后求仁得仁,IE瀏覽器不是依靠產(chǎn)品和技術(shù)取勝的,后來(lái)也輸在了產(chǎn)品和技術(shù)上。如下圖所示,Chrome發(fā)布之后,輕松把IE瀏覽器的份額幾乎全部搶走了
圖片來(lái)源:Timeline: The 30-Year History of the World Wide Web
IE瀏覽器終于被Microsoft徹底拋棄了,Edge換用Chromium作為瀏覽器內(nèi)核,但是Microsoft只是改變?yōu)g覽器的研發(fā)策略,而不是放棄瀏覽器。云計(jì)算(Azure、Office 365)業(yè)務(wù)的迅速增長(zhǎng)是Microsoft復(fù)興最核心的推動(dòng)力,瀏覽器作為云計(jì)算產(chǎn)品的入口,其重要性不言而喻。
Edge目前的市場(chǎng)占有率還非常低,但是Chrome不得不警惕這個(gè)強(qiáng)大的競(jìng)爭(zhēng)對(duì)手:不差錢(qián)、手握PC操作系統(tǒng)Windows、業(yè)績(jī)和市值全面復(fù)興、企業(yè)文化和公司戰(zhàn)略成功轉(zhuǎn)型。不過(guò),最近Edge似乎又想通過(guò)Windows壟斷地位強(qiáng)行推廣,這就有點(diǎn)不厚道了。
風(fēng)水輪流轉(zhuǎn),在瀏覽器創(chuàng)新上固步自封的現(xiàn)在變成了Safari。Chrome核心開(kāi)發(fā)者之一Alex Russell(今年跳槽去Edge了)寫(xiě)過(guò)一篇非常詳盡的檄文Progress Delayed Is Progress Denied,指責(zé)Safari及其瀏覽器引擎Webkit嚴(yán)重落后,App Store要求所有瀏覽器在iOS端必須使用Webkit引擎的政策嚴(yán)重制約了Web技術(shù)的發(fā)展,導(dǎo)致大量Web新技術(shù)無(wú)法即時(shí)應(yīng)用到iOS端。出于維護(hù)App Store的商業(yè)利益,Apple不太可能主導(dǎo)放棄對(duì)iOS端Web技術(shù)的刻意控制,競(jìng)爭(zhēng)對(duì)手只能付諸法律手段。
Reduce User Agent string information
Chrome 95開(kāi)始試用Reduce User Agent string information特性,顧名思義,旨在簡(jiǎn)化User-Agent字符串,減少其信息量,緩解利用User-Agent字符串作為用戶指紋,更好地保護(hù)用戶隱私。同時(shí),引導(dǎo)開(kāi)發(fā)者使用更加保護(hù)用戶隱私的User-Agent Client Hints來(lái)獲取瀏覽器信息,降低大家對(duì)User-Agent字符串的依賴。
Chrome計(jì)劃到Chrome 113徹底完成User Agent字符串的簡(jiǎn)化,不過(guò)從最終的結(jié)果來(lái)看,其實(shí)User-Agent的變化其實(shí)非常小。
以Chrome Windows用戶為例,舊的User-Agent字符串是這樣的:
Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.1234.56 Safari/537.36
簡(jiǎn)化之后最終的User-Agent字符串是這樣的:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.0.0 Safari/537.36
Windows NT 6.3變成了Windows NT 10.0,Chrome/93.0.1234.56變成了Chrome/93.0.0.0,僅此而已。Windows的版本號(hào)被固定在了10.0,即使用戶更新了操作系統(tǒng),也不再變化了;Chrome的版本號(hào)僅保留大版本號(hào),省略了小版本號(hào)。換句話說(shuō),我們依然可以通過(guò)User-Agent字符串獲取瀏覽器的名稱(chēng)及其大版本號(hào)、操作系統(tǒng)的名稱(chēng)、區(qū)分桌面端和移動(dòng)端。但是,我們無(wú)法通過(guò)User-Agent字符串獲取瀏覽器的小版本號(hào)以及操作系統(tǒng)的版本了。另外,對(duì)于安卓端,手機(jī)的品牌及型號(hào)也不再提供。
User-Agent字符串所能提供的瀏覽器信息更加模糊了,這樣有利于保護(hù)用戶隱私。
如果開(kāi)發(fā)者需要獲取更加精確的瀏覽器信息,則需要使用User-Agent Client Hints,該特性在Chrome 89已上線。User-Agent Client Hints對(duì)應(yīng)的HTTP請(qǐng)求Header字段如下表:
請(qǐng)求Header |
取值示例 |
Sec-CH-UA |
"Chromium";v="84", "Google Chrome";v="84" |
Sec-CH-UA-Mobile |
?1 |
Sec-CH-UA-Full-Version |
"84.0.4143.2" |
Sec-CH-UA-Platform |
"Android" |
Sec-CH-UA-Platform-Version |
"10" |
Sec-CH-UA-Arch |
"arm" |
Sec-CH-UA-Model |
"Pixel 3" |
Sec-CH-UA-Bitness |
"64" |
瀏覽器默認(rèn)僅發(fā)送Sec-CH-UA、Sec-CH-UA-Mobile、Sec-CH-UA-Platform,與User-Agent所提供的信息量一致,如果服務(wù)端需要獲取其他User-Agent Client Hints字段的話,則需要明確指定所需要的字段。這樣做的好處在于,瀏覽器默認(rèn)提供的用戶信息更少了,同時(shí)瀏覽器及Web應(yīng)用理論上能夠記錄、審計(jì)服務(wù)端所請(qǐng)求的信息量,能夠更加主動(dòng)地保護(hù)用戶隱私。
Web端的監(jiān)控服務(wù),例如ARMS、Fundebug、Sentry等,若需要獲取更加準(zhǔn)確的客戶端信息,則需要使用User-Agent Client Hints了。當(dāng)然,建議使用User-Agent Client Hints需要獲得用戶的授權(quán),插件以及應(yīng)用端不應(yīng)該幫用戶做決定,否則這個(gè)特性對(duì)用戶隱私的保護(hù)就沒(méi)有實(shí)際意義了。
總結(jié)
這篇博客我所介紹的Chrome特性較少,只有4個(gè),這是因?yàn)?strong>我并不打算介紹所有Chrome特性,沒(méi)有必要,也沒(méi)有這么多時(shí)間。對(duì)于《了不起的Chrome瀏覽器》的寫(xiě)作,我只關(guān)注以下4類(lèi)特性:
- 具有革命性的特性,例如:WebAssembly(SIMD、Exception Handling)、WebGPU、WebCodecs;
- 具有創(chuàng)新性的特性,例如:Web NFC、Web Bluetooth、WebOTP API;
- 存在兼容性風(fēng)險(xiǎn)的特性,例如:Reduce User Agent string information;
- 涉及到安全的特性,例如:Block HTTP port 554、Block ports 989 and 990、crypto.randomUUID();
對(duì)于其他特性感興趣的同學(xué),不妨直接查看Chrome Platform Status,這個(gè)站點(diǎn)介紹了Chrome的版本、特性以及發(fā)布日期。最近發(fā)現(xiàn)Chrome Platform Status會(huì)把Chrome每個(gè)版本的開(kāi)發(fā)特性、試用特性以及移除特性也列出來(lái),簡(jiǎn)直就是為了方便我寫(xiě)作,awesome!