使用 polyfills 的简易方法

本文作者为 Andrew BettsRobert Nyman。Andrew 是金融时报(Financial Times)实验室主任,该实验室旨在金融时报开发并推广实践性的 Web 技术。Robert 是 Mozilla Hacks 技术传道师及编辑。曾就 HTML5,JavaScript 以及 Open Web 发表过多次谈话与博文。Robert 坚定地看好 HTML5 与 Open Web,自1995年就开始在 Front End 开发部门研究 Web 技术。

本文系 OneAPM 工程师 编译呈现,以下为正文。

Polyfills是一种保证使用现代代码的绝佳办法,同时还能支持旧版浏览器。但是目前polyfills使用起来很困难,因此我们开发了一种全新的服务以便简化其使用方法。在此,邀请读者使用改进它。

挑战

下面是我们正在尝试解决的一些问题:

  • 开发者对哪些特性需要使用polyfill不是很清楚。例如你在某个旧版本的IE浏览器(因为你有很大数量的用户还在使用它)中载入网站,发现网站不工作,你不得不慢慢调试来搞清楚到底是哪个特性导致了这个问题。有时候问题很清楚,但大多时候并非如此,尤其是旧版浏览器往往缺少好的开发者工具的时候。
  • 针对每个特性都有很多polyfill可供选择。很难确定哪一个能最忠实地模拟缺少的特性。
  • 有一些大的polyfill捆绑着很多你不需要的polyfill,例如ES6,它全面覆盖了一系列的特性集。为了解决一个简单的问题而向浏览器植入所有的这些代码其实是不必要的。
  • 较新版本的浏览器不需要polyfill,但一般来说polyfill可用于所有种类的浏览器。虽然这是为了提高与旧版浏览器的兼容性,但这也降低了新版浏览器的性能。我们不愿意做出这种妥协。我们更愿意在原本不具备某个特性的浏览器上使用polyfill。

我们的解决办法:以polyfill为服务

为了解决这些问题,我们开发了polyfill服务。这有点像是验光师先对你的眼睛验光检查,然后针对你的视力问题配置眼镜。我们将对浏览器做同样的事情。下面解释它是如何工作的:

  1. 开发人员在他们的页面中插入一个脚本标记作为导入polyfill服务的端点。
  2. 该服务分析浏览器的user-agent标头和必需特性列表(或是使用一个默认的可使用polyfill服务的列表),然后搭建浏览器所需的polyfill列表。
  3. 按照正确的依赖顺序表定制polyfill。
  4. 通过CDN 压缩服务包并提供服务(对此我们衷心感谢Fastly的支持)。

我们真的需要这个解决办法吗?你可以这样思考:Modernizris是一个大型的特性检测包,所有对它的合理使用都得益于自定义的安装配置,但是很大数量的Modernizris用户仅仅使用了它的默认安装,这常常是来自于 cdnjs.com 或是html5boilerplate 的某个部件。但是,如果不使用Modernizris的特性检测功能,那你为什么安装这个工具呢?可能你误解了库文件的功能,单纯地以为Modernizris会“修补东西”?不得不承认,第一次听到这个名字的时候笔者正是这样想的,以至于后来发现Modernizris不但没有起到作用,反而拖了现代浏览器的后腿,笔者感到有些失望。

然而,Polyfill服务却是真正起到了作用。不想花时间去深入了解旧版本浏览器缺点的你一点儿错也没有。让别人先弄明白问题所在,然后我们在不需要了解细节的情况下就能直接受益。

如何使用

最简单的使用情况是:

<script src="//cdn.polyfill.io/v1/polyfill.min.js" async defer></script>

这包含了我们默认的 polyfill设置。这个默认设置是我们人工挑选的一个特性列表,我们认为这个列表中所包含的特性对于现代网络开发来说不可或缺,而且相对应的polyfill相当小且十分精确。如果你想指定添加某个polyfill特性,只需要这么做:

<!-- Just the Array.from polyfill -->

<script src="//cdn.polyfill.io/v1/polyfill.min.js?features=Array.from" async defer></script>

<!-- The default set, plus the geolocation polyfill -->

<script src="//cdn.polyfill.io/v1/polyfill.min.js?features=default,Navigator.prototype.geolocation" async defer></script>

如果有必要在解析自己的代码之前加载polyfill的话,你可以移除async和defer属性,或是使用一个脚本加载器(不需要任何polyfill的加载器!)

测试与文档特性支持

我们所支持特性的完整表格在特性矩阵中。为了搭建这个网格,我们使用了Sauce Lab的自动测试平台,它截获了polyfill在每个浏览器中的测试,然后记录结果。

User-Agent 分析? 你确定?

是的,我们确定。下面是为什么UA分析要比特性检测好的原因:

  • 在一些情形中,针对同一特性我们有多个polyfill可供选择,这是因为一些浏览器提供非顺从实施方式,因此只需要你敲打成型即可,而其他浏览器则没有提供任何的实施。但若是有UA检测,你能够选择相应的polyfill。
  • 有了UA检测,第一个HTTP请求就能直接由polyfill代码应答。如果我们使用了特性检测,第一个请求将会为特性检测代码服务,而第二个请求则需要用于获取特定的polyfill。

几乎所有的大型网站都使用UA检测。这并不是说与之相关的特征就是不好的。显然,好的UA规则要比差劲的UA规则更难编写。而且我们并没有排除借助特性检测使用该服务的可能。

人人可用的服务

应用的服务部分由FT负责维护运营,我们也正不断地扩展和改进相关工具,文档,测试和服务特性。源代码可以在GitHub上上下载,因此你能轻易地自行配置服务,我们也在cdn.polyfill.io上面配置了一个实例服务,你可以免费使用。而且,Fastly的朋友正提供免费的CDN发布和SSL。

我们已经建好了平台。现在,我们需要社区的力量让它火起来。我们已经提供了一些来自Jonathan NealMathias Bynens等人的最佳polyfill服务,我们想要做得更加全面。请带上你的polyfill,帮助我们改进测试,让它成为能推动网络前行的一项资源吧。

原文地址:https://hacks.mozilla.org/2014/11/an-easier-way-of-using-polyfills/

时间: 2024-11-08 19:39:34

使用 polyfills 的简易方法的相关文章

四种方框内打钩符号的简易方法 如何在Word方框里打钩?

  四种方框内打钩符号的简易方法   如何在Word方框里打钩?          一.在方框里打钩的方法一 利用带圈数字来实现在方框内打钩,只在Word 2003及2007版中适用.步骤如下: 1.打开Word文档,点击插入菜单,选择特殊符号; 2.在特殊符号中,选择数学符号,选择对勾,这样对勾就出来了; 3.接下来选中这个对勾,点击格式,选择中文版式,选带圈字符; 4.圈号选中方框,点击确定; 5.这样,带框的对勾就出来啦. 二.在方框内打钩的方法二 通过插入特殊字符来实现在方框内打钩.这个

Golang strings.Split获取字符串中的url/域名的简易方法

package main import ( "fmt" "strings" ) func main() { fmt.Println("Hello World!") a := "golang strings.Split获取字符串中的url/域名的简易方法http://www.waylau.com/golang-strings-split-get-url/" a1 := strings.Split(a, "//"

局域网连通性测试简易方法

在进行局域网网络布线和线路维修时,通常使用网络电缆测试仪进行连通性测试.网络电缆测试仪有专业测试仪和简易测试仪之分.专业测试仪不仅能测试网络的连通性.接线的正误,还可以测试双绞线的阻抗.近端串扰.衰减.回返损耗.长度等参数,这确实能带来不少方便,但动辄几千元.上万元的价格令人望而却步. 于是,只有几十元的简易网络测试仪就 成了我们这些非专业网管人员的 首选. 但是,使用简易网络测试仪进行电缆连通性测试时, 往往需要一个人主控测试仪主机,另一个人在网线的另一端协助操作,这给测试工作带来了极大不便.

六大简易方法教你如何优化账户

对于http://www.aliyun.com/zixun/aggregation/1539.html">AdWords广告的投放,从来都是没有最好,只有更好.当你完成所有的设置,开始投放后,紧接着就开始了微调和精益求精的过程.取得优秀广告效果的魔法就在这个不断优化的过程中.我们只需要做的就是不断完善整装待命,去取得胜利.下面是初学者的一些优化账户的简易方法,通过这些简单的步骤,您就可以很快的提升广告效果了. 方法一.对广告进行分割测试 广告永远是写给顾客看的,而不是写给自己,因此让顾客来

《树莓派实战秘籍》——2.5 技巧25更新固件和预构建二进制内核的简易方法

2.5 技巧25更新固件和预构建二进制内核的简易方法 当有一个专用工具的时候,一切就都简单了.幸运的是,Liam McLoughlin(又名"Hexxeh")创建了一个更新树莓派固件和内核的专用工具. rpi-update是一个shell脚本,它可以在一张包含树莓派Linux发行版映像文件的SD卡上,自动处理更新固件.预构建内核以及预构建VideoCore SDK文件的过程. 首先,确保在你选择的树莓派发行版上已经安装了readelf和git的二进制文件,rpi-update脚本的成功

简易方法实现网页图片防盗链设置

图片防盗和图片防盗链有什么区别呢?图片防盗: 是不想自己的图片被别人使用.图片防盗链: 是不想自己的图片被别人使用,且消耗的是自己的服务器流量.图片防盗是困难的,完美的图片防盗那几乎是不可能的.但还是有很多方法能够减少图片盗用. 今天我们使用空白图片覆盖真实图片,这个方法可以让别人无法获取真实的图片,除非查看源代码.你可以把真实的图片做为背景图片,而使用一张透明图片匹配尺寸并覆盖到真实图片上面. <div id="image1" style="background-im

Delphi实现自动化对象的一种简易方法

Delphi 中不需要建立ActiveX Library,不需要编辑TLB也能创建一个自动化对象. 秘密就在于$METHODINFO这个没有文档描述的编译指令. 首先我们定义一个TScriptableObject,继承自TObjectDispatch (ObjComAuto.pas) {$METHODINFO ON} TScriptableObject = class(TObjectDispatch) public constructor Create; end; {$METHODINFO OF

PS技巧:10个处理照片的简易方法

  无论是自己去拍摄来的照片,还是在免费的摄影网站上下载下来的照片,通过一些简单的设定,运用一些小技巧,就可以实现非常棒的摄影后期效果. 主要如下:裁剪.模糊效果.饱和度.对比.明度.滤镜功能.网格整理.调整框架.图层效果.文字 详细内容从以下开始. 01. 裁剪:强调出构图和焦点 裁剪(英: Cropping)这是最简单的图像处理方法了.将不需要的地方给裁剪掉,将构图和布局改善,使引人注意的地方和焦点(英: Focal Point)强调出来. 当你切掉了图像的大部分区域,可以尝试着尽可能的放大

PHP中替换键名的简易方法示例详解

 默认输出的时候,将数据库字段名作为数组的键名进行输出,但带有键名的数据不能够满足未知情况下的操作,下面为大家介绍个不错的方法可以解决这个问题 YII框架中封装好了的数据库操作函数,默认输出的时候,将数据库字段名作为数组的键名进行输出,但是有些时候带有键名的数据不能够满足未知情况下的操作,譬如:数据库数据导出为EXCEL等比较非正常的操作.    所以这边需要对数据库结果集进行解析,下面就是针对这种特殊情况的一个简单方法:   代码如下: /**  * @todo 针对YII 查询输出带有数据库