Chrome 92 新增 at 和 randomUUID 方法,Canvas 支持 Display P3 色域

简介: 7月20日正式发布的Chrome 92,带来了哪些有意思的新特性呢?
来源: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

详细解读

Array.prototype.at()

想必大家都写过这样的代码,使用数组长度减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规范。

crypto.randomUUID()

日常开发中,我们经常会需要生成唯一ID,例如给每个用户生成唯一ID。

npm包uuid的周下载量高达4000万+,我在自己的代码里也搜到了uuid模块:

image.png

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标准。

Canvas color management

目前,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明亮很多,区别非常明显:

image.png

图片来源:Get Started with Display P3

对于图像、视频、设计、游戏、地图、外卖、电商等应用,准确还原颜色的重要性不言而喻。

大多数情况下,买家秀和卖家秀的明显差异是由于卖家过度PS导致的,但是也有可能是颜色没有得到准确还原导致的。

Web Bluetooth manufacturer data filter

早在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

f441bb4cf20944bda66ddae869a2c488.png

相关文章
|
6月前
|
Web App开发 前端开发
Chrome 浏览器插件 V3 版本 Manifest.json 文件中 Action 的类型(Types)、方法(Methods)和事件(Events)的属性和参数解析
Chrome 浏览器插件 V3 版本 Manifest.json 文件中 Action 的类型(Types)、方法(Methods)和事件(Events)的属性和参数解析
231 0
|
Web App开发
Mac 技术篇-触控板双指前进后退手势设置方法,mac关闭chrome浏览器双指返回手势实例演示
Mac 技术篇-触控板双指前进后退手势设置方法,mac关闭chrome浏览器双指返回手势实例演示
2153 0
Mac 技术篇-触控板双指前进后退手势设置方法,mac关闭chrome浏览器双指返回手势实例演示
|
4月前
|
Web App开发 数据采集 移动开发
提升Selenium在Chrome上的HTML5视频捕获效果的五个方法
在Selenium中优化Chrome的HTML5视频捕获涉及更新Chrome和ChromeDriver、配置浏览器选项、使用代理IP、调整加载策略及确保安装了正确编解码器。例如,更新驱动程序,添加如`--autoplay-policy`和`--proxy-server`的命令行参数,使用代理以防止被封,设置页面加载策略为'eager',并安装必要的编解码器来确保视频播放。代码示例展示了如何集成这些优化措施。
165 2
提升Selenium在Chrome上的HTML5视频捕获效果的五个方法
|
Web App开发 存储
Python+selenium 自动化-操作已启用的chrome浏览器实例演示,chrome启用调试端口方法
Python+selenium 自动化-操作已启用的chrome浏览器实例演示,chrome启用调试端口方法
582 0
Python+selenium 自动化-操作已启用的chrome浏览器实例演示,chrome启用调试端口方法
|
4月前
|
Web App开发
软件开发常见流程之移动端调试方法,利用Chrome(谷歌浏览器)的模拟手机调试,搭建本地Web服务器,手机和服务器在一个局域网,通过手机访问服务器,使用服务器,利用ip实现域名访问
软件开发常见流程之移动端调试方法,利用Chrome(谷歌浏览器)的模拟手机调试,搭建本地Web服务器,手机和服务器在一个局域网,通过手机访问服务器,使用服务器,利用ip实现域名访问
|
6月前
|
Web App开发 定位技术
Chrome中实现使用迅雷一次性选中并下载网页内全部链接的方法
Chrome中实现使用迅雷一次性选中并下载网页内全部链接的方法
167 1
|
6月前
|
Web App开发 内存技术
chrome插件安装方法教程
chrome插件安装方法教程
|
6月前
|
Web App开发 移动开发 JavaScript
【Vue版】实现拖拽、排序效果(注意,这个方法在chrome谷歌浏览器上面不适用,dragend会情不自禁触发drag事件先执行,有点像浏览器的一个bug)
【Vue版】实现拖拽、排序效果(注意,这个方法在chrome谷歌浏览器上面不适用,dragend会情不自禁触发drag事件先执行,有点像浏览器的一个bug)
|
11月前
|
Web App开发
GOOGLE chrome浏览器 非插件截图方法
emm...不知道大家知不知道,反正不管怎么样,我就拿来水一下 打开chrome 哦~ 右键审查元素 or F12 or ctrl+shit+i or 你自己设置的快捷键... 然后再ctrl+shit+p
154 0
|
Web App开发 JavaScript 前端开发
JavaScript 技术篇-navigator.permissions读取chrome剪切板权限获取不生效原因:只有在https协议下使用有效。手动设置chrome页面剪切板读取权限方法
JavaScript 技术篇-navigator.permissions读取chrome剪切板权限获取不生效原因:只有在https协议下使用有效。手动设置chrome页面剪切板读取权限方法
1476 0
JavaScript 技术篇-navigator.permissions读取chrome剪切板权限获取不生效原因:只有在https协议下使用有效。手动设置chrome页面剪切板读取权限方法