Firefox 52:引入 WebAssembly、CSS Grid 和 Grid 检查器

简介

随着新标准的采用、性能提升、更出色的设计功能以及新工具的出现,网络发展无疑正处于一个激动人心的时代。Firefox 52 代表了众多已开发数年功能的结晶。虽然其中许多功能将继续发展和改进,但今天发布的 Firefox 仍然有很多值得庆祝的地方。

在这篇文章中,开发者关系团队介绍了一些最具创新性的功能,包括 WebAssembly、CSS Grid、CSS Grid 检查器工具、改进的响应式设计模式以及 JavaScript 中的 Async 和 Await 支持。

WebAssembly 打破 Web 与原生之间的壁垒

Firefox 52 支持 WebAssembly,这是一种用于在 Web 上运行安全、可移植和高效二进制程序的新格式。作为 Mozilla、Google、Microsoft 和 Apple 开发的新兴开放标准,WebAssembly 最终将在 JavaScript 运行的任何地方运行:在每个主要浏览器中,以及在 Node.js 和 Electron 等浏览器衍生运行时中。WebAssembly 旨在无处不在。

像 Mozilla 的 Emscripten 这样的编译器可以针对 WebAssembly 虚拟架构,从而可以在 Web 上以接近原生的速度运行可移植的 C/C++ 代码。除了 C/C++ 之外,Rust 编程语言对 WebAssembly 具有 初步支持,并且 LLVM 本身包含一个实验性的 WebAssembly 后端。我们预计未来几年将会有更多其他语言添加对 WebAssembly 的支持。

通过 Emscripten,WebAssembly 可以轻松地将整个游戏和原生应用程序移植到 Web 上,但它还可以做更多的事情。由于其速度快且易于与 JavaScript 交互,因此以前对 Web 来说要求过高或不切实际的任务现在触手可及。

(您可以 点击此处播放完整的 Zen Garden 演示。需要 Firefox 52,目前仅限桌面版。)

JavaScript 函数可以调用 WebAssembly 函数,反之亦然。这使得可以在单个 Web 应用程序中混合使用高级 JavaScript 和低级 C/C++/Rust。开发人员可以重用 WebAssembly 模块,而无需了解其内部工作原理,就像他们今天使用压缩的 JavaScript 库一样。

在性能一致性至关重要的领域(游戏、音频/视频处理、数据分析、原始计算、编解码器等),WebAssembly 在大小和速度方面提供了明显的优势。因此,我们预计许多流行的库和框架最终将直接或间接地依赖于 WebAssembly。

在代码重用和软件架构方面,“原生”和 Web 之间的界限正在消失,而这仅仅是个开始。工具和调试将继续改进,互操作性、性能和原始功能也将得到提升。例如,多线程和 SIMD 已经在 WebAssembly 路线图上了。

开始使用 MDN 上的 WebAssembly,并在 WebAssembly.org 上找到来自 WebAssembly 创建者的最新信息。

CSS Grid 和 Grid 检查器

Firefox 52 包含对 CSS 网格布局模块级别 1 的支持,这是一个定义了 18 个新 CSS 属性的 CSS 规范。CSS Grid 是一个用于 Web 的二维布局系统,使许多我们多年来一直使用网格框架在浏览器中以原生方式解决的布局模式的编码变得更加容易。它也为图形设计开辟了一个全新的世界。无论您是专注于应用程序体验的用户界面,还是内容的编辑设计,这个新的工具集都为您提供了强大的功能。

CSS Grid 通过定义行和列并将项目放置在网格上的区域中来工作。可以为行和列指定特定大小(固定、流体或混合),或者可以定义为根据内容大小调整自身大小。可以显式地在 CSS 中放置网格上的项目,或者可以根据网格自动放置算法由浏览器放置。这些大小和放置选项使 CSS Grid 比任何现有的布局框架都更强大和灵活。此外,能够定义并在行中放置内容是一个全新的功能。

"variations on a grid" screenshot

我们还很自豪地宣布我们新的 Grid 检查器工具,它允许您直接在页面上查看网格线,从而更轻松地了解发生了什么。

请参阅 labs.jensimmons.com/2017/01-003.html 上此视频中的示例。并在 labs.jensimmons.com 上找到更多示例的游乐场。

有兴趣学习 Grid?我们有 MDN 上的深入指南

以下是关于 CSS Grid 的两个最常见问题的答案

我应该使用 Grid 还是 Flexbox?哪个更好?

您将同时使用两者,将 CSS Grid 与 Flexbox 和影响布局的其他 CSS 属性(浮动、边距、多列、书写模式、内联块等)混合使用。这不是只能选择一个的情况。当您想要控制二维的大小和对齐方式时,Grid 是正确的工具。当您只关心控制一个维度时,Flexbox 是正确的工具。大多数项目都会同时使用两者,每个项目在页面上的不同小部分使用。一旦您 了解两者之间的区别,就会清楚它们是如何完美地协同工作的。

为什么我现在应该对 CSS Grid 感到兴奋?在 Grid 在足够多的浏览器中得到支持之前,使用它还需要几年时间吗?

由于浏览器公司合作创建新 CSS 的方式发生了变化,因此 对 CSS Grid 的广泛支持 将以前所未有的速度到来。Mozilla 将首先在 3 月 7 日的 Firefox 52 中提供支持。Chrome 57 将在一周后的 3 月 14 日支持 Grid。Safari 10.1 将提供对 Grid 的支持;它目前处于测试阶段。Internet Explorer 10 和 11 已经支持规范的早期版本,但需要使用 -ms 前缀。(您可以利用它,也可以不利用它。在决定之前,请 了解详细信息。)MS Edge 也支持规范的原始草稿,未来将更新到当前规范。

您可以在今天发布使用 CSS Grid 的网站,即使并非所有用户都使用支持 CSS Grid 的浏览器,方法是仔细考虑代码结构并计划在所有浏览器中发生的情况。 功能查询 是确保所有用户在您的网站上获得良好体验的关键工具。

Async 函数和 await 关键字

Firefox 52 还包括来自 ES2017 的一项全新的 JavaScript 功能:异步函数及其配套的 await 运算符。Async 函数建立在 ES2015 Promises 的基础之上,允许作者以类似于编写同步等价物的方式编写异步代码。

以下示例使用一个异步请求的结果,并将其一部分用作第二个异步函数的参数。以下是使用传统的回调方法的示例

function loadProfile() {
  getUser(function (err, user) {
    if (err) {
      handleError(err);
    } else {
      getProfile(user.id, function (err, profile) {
        if (err) {
          handleError(err)
        } else {      
          displayProfile(profile);
        }
      });      
    }
  });
}

相对简单,但如果我们需要进行额外的处理和异步请求,嵌套级别或回调函数序列可能会变得难以管理。此外,对于更复杂的回调序列,确定代码流可能会变得困难,从而导致调试困难。
ES2015 中引入的 Promises 允许以更紧凑的方式表示相同的流程

function loadProfile() {
  getUser()
    .then(function (user) {
      return getProfile(user.id);
    })
    .then(displayProfile)
    .catch(handleError);
}

Promises 擅长简化这些顺序方法序列。在此示例中,函数不再将函数传递给 getUsergetProfile,而是返回一个 Promise,当函数的结果可用时,该 Promise 将被解析。但是,当需要进行额外的处理或条件调用时,嵌套仍然可能变得非常深,并且控制流可能再次难以跟踪。
Async 函数允许我们重写示例以类似于我们编写同步等价物的方式,而不会像同步代码那样阻塞线程!

async function loadProfile() {
  try {
    let user = await getUser();
    displayProfile(await getProfile(user.id));    
  } catch (err) {
    handleError(err);
  }
}

函数前面的 async 关键字告诉 JS 引擎以下函数可以被异步请求暂停,并且函数的结果将是一个 Promise。每次我们需要等待异步结果时,我们都使用 await 关键字。这将暂停函数的执行,而不会阻止其他函数运行。此外,getUsergetProfile 不需要像在 Promise 示例中那样进行更改。
Async 函数并不是解决复杂控制流的万能药,但对于许多情况,它们可以简化 async 代码的编写和维护,而无需导入代价高昂的库。要了解更多信息,请参阅 asyncawait MDN 文档。

响应式设计模式

除了上面描述的 Grid 检查器之外,Firefox 现在还包括一个改进的响应式设计模式 (RDM)。改进的 RDM 工具可以进行网络限流,模拟移动用户主要体验的各种连接速度。此外,还提供了各种屏幕尺寸和像素密度模拟,以供常见设备使用。许多功能在 介绍 RDM 的早期文章 中进行了描述。目前,仅当 e10s在浏览器中启用 时,此功能才会启用。请务必阅读 MDN 上有关 RDM 的完整 文档

更多 Firefox 52 的优势

这些是我们为 Firefox 52 中的浏览器带来的改变游戏规则的功能的一些亮点。要查看所有发布更改的详细列表,包括用于识别自动生成的空白的功能以及检测不安全密码字段的功能,请参阅 Firefox 52 发行说明

关于 Dan Callahan

Mozilla 开发者关系工程师,前 Mozilla Persona 开发人员。

更多 Dan Callahan 的文章…


22 条评论

  1. Luke

    这应该显示的内容不只是一个黑屏吗?Firefox 52.0b9

    2017 年 3 月 7 日 19:06

    1. Jason Weathersby

      您更新了 Firefox 吗?

      2017 年 3 月 9 日 12:50

  2. Ravi Kasireddy

    很棒的文章!确实如此!!

    2017 年 3 月 8 日 04:54

  3. Travis Doherty

    不错的版本!

    2017 年 3 月 8 日 07:51

  4. chathuranga

    很棒的文章..谢谢

    2017 年 3 月 8 日 09:05

  5. Igor Cavour Oliveira

    Firefox 52 中的错误(史诗级禅意花园演示)
    Ubuntu 14.04(Live CD)

    初始内存大小:320MB(MIN_MEMORY:32MB,IDEAL_MEMORY:320MB,MAX_MEMORY:2047.9375MB,RESERVE_MAX:true,heuristicIs64Bit:true)EpicZenGarden.html:105:3

    [编者注:我复制了您的错误报告的详细信息,并将其转发以供进一步调查。谢谢!]

    2017 年 3 月 8 日 20:50

  6. Steve McWilliam

    刚刚尝试了禅意花园演示,它说 WebGl 不受支持,请尝试使用 Firefox 52 - 我目前正在运行 52.0(32 位) - 为什么它不起作用???

    2017 年 3 月 9 日 08:34

  7. Paweł P.

    “SyntaxError: illegal character” - 禅意花园中的一些错误。
    为未来而做的很棒的工作 - 就像我常说的 - Web 浏览器是“所有”事物相遇的地方 :)

    Paweł Pałczyński


    互动代理商 – DTL.PL

    2017年3月9日 下午1:02

  8. Dan kokot

    酷!

    2017年3月9日 下午2:42

  9. Michal Hantl

    Web Assembly!!!!

    2017年3月9日 下午11:02

  10. Adam

    WebAssembly 非常有趣。
    我的理解正确吗?使用 WebAssembly 可以编写更复杂的离线应用程序,但使用基于 Web 技术的 UI?
    或者我需要担心网站在未经通知的情况下调用 Windows API DLL 吗?

    2017年3月9日 下午11:48

    1. Dan Callahan

      是的,如果将 WebAssembly 与 Service Workers 等技术结合使用,您可以创建完全离线工作的复杂应用程序,并使用 HTML/CSS/JavaScript 构建 UI。

      至于安全性,WebAssembly 通常在每个浏览器的现有 JavaScript VM(Firefox 的 Spidermonkey,Chrome 的 V8 等)中实现,并与 JavaScript 具有相同的沙盒和限制。因此,WebAssembly 独有的漏洞数量应该不会很多。

      2017年3月10日 上午7:37

  11. giorgos

    尝试运行 webassembly 演示

    您的浏览器不支持 WebAssembly。请尝试使用 Firefox 52 或更高版本。
    当前用户代理:Mozilla/5.0 (Windows NT 5.1; rv:52.0) Gecko/20100101 Firefox/52.0

    2017年3月12日 上午7:43

  12. Joshua Cogliati

    嗯,我从 EpicZenGarden 得到的只是下载了一会儿,然后我得到:“QuotaExceededError TypeError: eventHandler.target is null”(这是在 Firefox 52.0 上)

    2017年3月12日 上午7:49

  13. Akash

    谢谢!嗨,我有一个关于这个问题的疑问,这是 CSS3 语法吗?如果我理解正确,为什么我的浏览器没有显示正确的网格?

    2017年3月12日 上午10:39

  14. Gary H

    我真的很讨厌 Firefox 52!!!
    放弃对 Java 的支持就像自断其足。
    企业已经开发了供客户使用的程序,这些程序需要浏览器中的 Java 运行时支持。
    Mozilla 放弃对 Java 的支持意味着用户必须找到其他浏览器。
    企业需要很长时间才能用其他东西替换现有的基于 Java 的程序。在此期间,可以使用 Firefox 51 或 Firefox 52-ESR,
    但它们的使用寿命已经开始倒计时了。

    关于这个 WebAssembly 的东西,这是否意味着每次用户启动应用程序时,它都会在执行之前重新编译?
    如果是这样,那里的稳定性在哪里?最终用户每天都面临着不稳定的环境。啊!!!

    2017年3月13日 上午8:45

    1. Johnny Walker

      没有必要对 FireFox 感到恼火,这是整个行业持续的趋势。Oracle 本身正在淘汰插件。

      2017年3月14日 上午6:44

  15. Eliah

    是否会有一个 API 可以使用 WebAssembly 而不是 JS 来开发 Web 扩展程序。

    2017年3月13日 上午9:04

  16. Johnny Walker

    Zen Garden 演示向我展示了以下内容:http://imgur.com/a/SnaHy

    2017年3月14日 上午6:46

  17. Albert

    向团队致敬!我希望 Edge 也会很快从其早期的实用测试版本中获得 CSS Grid 的更新。一旦 Safari 和 Opera 更新,它就几乎可以开始使用了 :)

    ZenGarden 示例在我的 52(和 54)中也失败了。控制台中有很多错误,以“UnknownError”、“Failed to openIndexedDB, proceeding without reading or storing contents to IndexedDB! Error:”、“Failed to read file wasmModule from IndexedDB, error: IndexedDB not available!”等开头……

    它在 Nightly 55 中运行良好且流畅。

    2017年3月17日 上午5:42

  18. Jhons

    嗨,关于 web assemly 和 css 网格的不错功能,因为我正在寻找开发 Firefox 扩展程序,并且我在 https://www.packagor.com/create-firefox-extension/ 上阅读了这篇文章,但仍然无法理解……请指导我

    2017年3月28日 下午4:11

    1. Dan Callahan

      addons.mozilla.org/developers/ 上的 Firefox 官方插件文档是一个很好的起点

      2017年3月31日 下午2:28

本文的评论已关闭。