Firefox 72 — 我们 2020 年的第一首歌曲

2020 年已经到来,朋友们。我们希望所有阅读本文的人新年快乐,无论你在哪里。当你迈出新年的第一步,弄清楚你的下一步行动是什么时,你可能会发现尝试一个新的 Firefox 版本会让你感到欣慰!

确切地说,是 72 版。

我们最自豪的亮点之一是,现在需要用户操作才能使用许多依赖于权限的方法,例如 Notification.requestPermission()。用户研究通常将权限提示垃圾邮件列为用户最讨厌的事情之一,因此我们决定做点什么。此更改减少了权限垃圾邮件,并增强了用户对其在线体验的控制。

此版本带来了许多其他新功能,包括 DevTool 改进,例如断点、WebSocket 检查器改进和资源下载时间;对 CSS 功能的支持,例如阴影部分、运动路径和变换属性;以及 JS/API 功能,例如基于事件的表单参与和空值合并运算符。

继续阅读以了解更多亮点。要查看完整的新增功能列表,请查看以下 MDN 文章

现在我们已经转向 4 周的浏览器发布周期,你会发现每个单独版本中的新功能更少,但功能会更频繁地添加到 Firefox 中。这使您能够更快地访问新功能和错误修复。您可以在 将 Firefox 切换到更快的 4 周发布周期 中阅读我们对更改的完整理由。

DevTools 改进

首先,我们将更详细地介绍 Firefox 72 DevTools 的改进。

在访问或更改变量时暂停

断点是一种新型的断点,它可以在对象属性被读取或设置时暂停执行。您可以从作用域面板中列出的任何对象的上下文菜单中设置断点。

setting watchpoints in the debugger, using options in the context menu of objects in the scopes panel

此功能在 MDN 上的 使用断点 文章以及 Hacks 上的 在 Firefox 72 中使用断点调试变量 中有更详细的说明。

仅限 Firefox DevEdition:控制台中的异步堆栈

控制台堆栈捕获 <a href="https://mdn.org.cn/en-US/docs/Web/API/console/trace">console.trace()</a><a href="https://mdn.org.cn/en-US/docs/Web/API/console/error">console.error()</a> 的完整异步执行流程。这使您可以了解定时器、事件、Promise、生成器等的调度方式,而这些方式在其他情况下将是不可见的。

an asynchronous callstack being shown in the javascript console

目前,它们仅在 Firefox Developer Edition 中启用。我们正在努力在提高性能后,将此功能提供给所有用户。异步堆栈也将推广到更多类型的日志,当然还有调试器。

用于 WebSockets 的 SignalR 格式化以及下载/上传大小

在发布新的 71 中的 WebSocket 检查器 之前,我们已经在 Firefox DevEdition 中提供它,并征求您的意见。我们不仅得到了很多很棒的想法,一些人甚至参与了代码贡献。非常感谢你们,并且 继续努力

现在,以 ASP.NET 的 Core SignalR 格式发送的消息将被解析,以显示格式良好的元数据。该 错误 是由于 ASP.NET 社区的反馈 而提交的,然后由贡献者 Bryan Kok 处理。

类似地,社区 要求 提供下载和上传的总传输大小。这现在已成为现实,这要归功于 贡献者 Hayden Huang,他将 该错误 作为他们的第一个 Firefox 修补程序。

网络资源的开始和结束时间

计时 选项卡 网络监控器 现在显示每个下载资源的计时信息,这使得依赖性分析变得更加容易。

  • 排队 — 资源排队等待下载的时间。
  • 开始 — 资源开始下载的时间。
  • 下载 — 资源完成下载的时间。

一如既往,更快更可靠

以下仅是我们对性能和质量投资的几个亮点。

  • 检查器 中,编辑 CSS 不再受 CSP 规则的阻止。
  • 检查器 用于 自定义元素 的徽章现在可以正确地打开源映射的原始脚本。
  • 检查器 现在可以在重新加载时正确地保留选定的元素,以用于 <a href="https://mdn.org.cn/en-US/docs/Web/HTML/Element/iframe"><iframes></a>
  • 当打开许多选项卡时,调试器 现在可以更快地加载,方法是首先优先加载可见的选项卡。

CSS 添加

现在让我们继续讨论 Firefox 72 中最有趣的新 CSS 功能。

阴影部分

对包含在 Shadow DOM 中的元素进行样式设置的一个问题是,您不能只对应用于主文档的 CSS 进行样式设置。为了使这成为可能,我们实现了阴影部分,它允许阴影宿主有选择地将阴影树中选择的元素暴露给外部页面,以便进行样式设置。

阴影部分需要两个新功能。part 属性将阴影树中的元素暴露给外部页面。

<custom-element>
  <p part="example">A paragraph</p>
</custom-element>

然后,::part() 伪元素用于选择具有特定 part 属性值的元素。

custom-element::part(example) {
  border: solid 1px black;
  border-radius: 5px;
  padding: 5px;
}

CSS 运动路径

运动路径 是一个有趣的新规范,适用于所有动画师。这里的意思是,您可以定义路径形状,然后沿着该路径对 DOM 节点进行动画处理。该规范提出了一种替代方案,无需对 transform: translate()topright 等位置属性进行动画处理,也不需要使用其他通常不太理想的属性,这可能会导致非常复杂的关键帧集。

使用运动路径,您可以使用 offset-path 定义路径的形状。

offset-path: path('M20,20 C20,100 200,0 200,100');

定义一个动画,以将元素在 offset-distance 属性的不同值之间进行动画处理,该属性定义您希望元素显示在定义路径上的位置。

@keyframes move {
  0% {
    offset-distance: 0%;
  }

  100% {
    offset-distance: 100%;
  }
}

然后,使用这些关键帧对元素进行动画处理。

animation: move 3000ms infinite alternate ease-in-out;

这是一个简单的示例。还有其他可用的属性,例如 offset-rotateoffset-anchor。使用 offset-rotate,您可以指定您希望对正在进行动画处理的元素旋转多少度。使用 offset-anchor 指定动画元素的哪个背景位置固定在路径上。

单个变换属性

在此版本中,以下单个变换属性默认情况下已启用:scalerotatetranslate。这些可用于对元素设置变换,如下所示。

scale: 2;
rotate: 90deg;
translate: 100px 200px;

这些可用于代替

transform: scale(2);
transform: rotate(90deg);
transform: translate(100px 200px);

或者甚至

transform: scale(2) rotate(90deg) translate(100px 200px);

这些属性比等效的单个变换更容易编写,与典型的用户界面使用情况映射得更好,并且让您不必记住在 transform 属性中指定多个变换函数的精确顺序。

JavaScript 和 WebAPI 更新

如果您更喜欢 JavaScript,那么这一部分适合您。72 包含以下更新。

许多依赖于权限的方法需要用户操作

通知权限提示始终在研究中显示为网络最令人讨厌的事情之一,因此我们决定做点什么。为了提高安全性并避免不必要的和令人讨厌的权限提示,一些方法已被更改,以便它们只能在响应用户操作(例如单击事件)时调用。这些方法是 Notification.requestPermission()PushManager.subscribe()MediaDevices.getDisplayMedia()

通过要求在显示权限提示之前进行用户操作,Firefox 大大减少了权限垃圾邮件,从而增强了用户对其在线体验的控制。

因此,例如,在初始页面加载时提示获取通知权限已不再可能。您现在需要像这样:

btn.addEventListener('click', function() {
  Notification.requestPermission();
  // Handle other notification permission stuff in here
});

有关通知权限的关联编码最佳实践的更多详细信息,请阅读 使用通知 API

空值合并运算符

空值合并运算符 ?? 在其左侧操作数为 null 或 undefined 时返回其右侧操作数。否则,它返回其左侧操作数。

这在许多方面都是一个有用的省时方法,它在您只将 null 和 undefined 视为不需要的值时也很有用,而不是其他假值,例如 0' '

例如,如果您想检查是否已设置某个值,并且如果没有,则返回默认值,您可能会执行以下操作:

let value;

if(!value) {
  value = 'default';
}

这有点长,所以您可能会改为使用此常见模式:

let value;
let value = value || 'default';

这也能正常工作,但如果您想接受 0' ' 的值,则会返回意外的结果。

使用 ??,您可以改为执行以下操作,这简明扼要地解决了上面描述的问题。

let value;
value = value ?? 'default';

基于事件的表单参与

基于事件的表单参与现在默认启用。这涉及到使用新的 FormData 事件,该事件在表单提交时触发,但也可以通过调用FormData()构造函数触发。这允许在 FormData 事件触发时快速获取FormData对象,而不是需要自己创建它 - 例如,当你想要通过 XHR 提交表单时,这很有用。

以下是此功能的实际应用示例。

formElem.addEventListener('submit', (e) => {
  // on form submission, prevent default
  e.preventDefault();

  // construct a FormData object, which fires the formdata event
  new FormData(formElem);
});

formElem.addEventListener('formdata', (e) => {
  console.log('formdata fired');

  // Get the form data from the event object
  let data = e.formData;

  // submit the data via XHR
  let request = new XMLHttpRequest();
  request.open("POST", "/formHandler");
  request.send(data);
});

视频画中画功能现已在 macOS 和 Linux 上可用

之前的发布文章中,我们宣布了画中画功能已在 Firefox 71 中启用,尽管当时仅限于 Windows 系统。然而,今天我们很高兴地宣布,这项广受欢迎的功能现在也适用于 macOS 和 Linux 系统!

picture in picture on mac os; a video being played in a separate overlay form the page where it is actually embedded

关于 Chris Mills

Chris Mills 是 Mozilla 的高级技术作家,他撰写有关开放式 Web 应用程序、HTML/CSS/JavaScript、A11y、WebAssembly 等方面的文档和演示文稿。他热衷于探索 Web 技术,并会在会议和大学定期发表技术演讲。他曾就职于 Opera 和 W3C,爱好敲击重金属鼓和品尝精酿啤酒。他居住在英国曼彻斯特附近,与妻子和三个可爱的子女生活在一起。

更多 Chris Mills 的文章...


14 条评论

  1. paola

    我确信这不会像 Chrome 79 一样在我的电脑上崩溃,因为 Chrome 79 由于 Symantec Endpoint Protection 版本过旧而一直崩溃。每次打开它都会出现“哎呀,出错了”,唯一的方法是在安全模式下打开它,然后我才能访问我的网站https://www.u-pulll-it.com/,但即使这样也存在问题,因为插件无法加载,现在我只能使用 Firefox,一切都很棒。

    2020 年 1 月 7 日 下午 2:19

  2. Chris

    为什么你们要强迫数百万个网站(包括我)突然拥有一个黑色滚动条?我不想要这个。我的网站是浅色主题,黑色的滚动条看起来很糟糕。你们什么时候改回来?

    2020 年 1 月 8 日 下午 3:47

    1. Chris Mills

      我没有看到任何网站上有黑色滚动条,看起来很糟糕。您使用的是哪个操作系统?

      2020 年 1 月 8 日 下午 11:53

      1. Chris

        Win 10(在 Windows 8 上也是一样)
        Firefox 72.0.1(64 位)

        示例
        https://www.deallivery.at/

        有没有办法禁用它?或者是什么决定了滚动条的颜色?在这个例子中,似乎是页脚颜色导致了问题。但我还看到一些页面的页脚(或页眉)是黑色的,但滚动条却是浅色的。

        2020 年 1 月 12 日 下午 1:16

        1. Bill

          我访问了您提供的网站,没有看到您所说的黑色滚动条。

          2020 年 1 月 13 日 下午 3:30

          1. Chris Mills

            我也没有。也许可以在https://bugzilla.mozilla.org上提交一个错误报告,以便工程师调查并尝试重现这个问题?

            2020 年 1 月 14 日 上午 0:21

        2. Shawn

          我也在您的网站上看到了黑色滚动条,但我在访问的其他所有页面上都是浅色滚动条。不知道怎么帮您,只是想告诉您,您不是唯一遇到这个问题的人。

          2020 年 1 月 15 日 上午 8:11

          1. Shubham Shah

            我也看到了黑色滚动条。这是因为 Firefox 的其中一次更新,它根据主体背景色更改了滚动条。该网站为主体设置了深色背景颜色规则,导致在白色界面上出现黑色滚动条。

            2020 年 1 月 30 日 上午 4:30

  3. Alexandre Leduc

    画中画功能太棒了!

    2020 年 1 月 8 日 下午 7:41

    1. Roman

      确实,但我无法每天都使用它,因为除了暂停之外,它没有其他基本控制。

      2020 年 1 月 9 日 上午 6:22

  4. Scott

    很高兴看到空值合并运算符现在正在浏览器中实现。

    2020 年 1 月 9 日 下午 1:52

  5. Ana Costa

    您好
    有谁知道为什么组合框选项不再渲染 Web 字体?
    还有其他人注意到这个问题吗?

    2020 年 1 月 14 日 上午 5:00

  6. Ian Dickinson

    我喜欢这些详细但清晰的 FF 新功能分解,感谢您的撰写。

    不过我有一个请求:您能否在 `h3` 元素中添加 `id` 属性,以便我们可以在与同事分享时或在 Twitter 上分享时,使用深层链接指向特定的功能说明?

    2020 年 1 月 20 日 上午 5:48

    1. Chris Mills

      很高兴您喜欢它们!

      我同意在标题中添加 ID 会很有用。我会将您的反馈意见传递给相关团队。

      2020 年 1 月 20 日 上午 5:53

本文的评论已关闭。