引言
最近的工作中业务方需要兼容IE浏览器,众所周知,IE这个反人类的东西,微软自己都抛弃了。谁叫甲方爸爸想要呢。使用过程中发现IE这东西吧很奇葩,常见的axios和ES6的一些常用的语法糖都不支持,总不能项目使用ES5重写吧。经过寻找发现了polyfill这东西。
原因就是使用到了ES6的语法,比如在IE浏览器中会出现“promise未定义“的问题
1.在项目中安装babel-polyfill
2.在main.js中引入 import "babel-polyfill"
3.修改配置文件,即在webpack.base.conf.js这个文件中加入代码 require("babel-polyfill")
Polyfill是什么
Polyfill 是一块代码(通常是 Web 上的 JavaScript),用来为旧浏览器提供它没有原生支持的较新的功能。
比如说 polyfill 可以让 IE7 使用 Silverlight 插件来模拟 HTML Canvas 元素的功能,或模拟 CSS 实现 rem 单位的支持,或text-shadow,或其他任何你想要的功能。(引用自MDN)
下面是对概念发明者的描述
那是我在2009 年撰写HTML5简介时的情景。当时我正坐在一家咖啡店(就像您所做的那样),构想一个单词能表达如下思想——“如果浏览器本身没有,则复制一个使用JavaScript(或Flash或其他任何方法)的API”。
对我来说,Shim意味着您可以添加一段代码来修复某些功能,但是大多数情况下,它拥有自己的API。我想要您可以插入一个东西并且默默地工作(还记得旧的shim.gif吗?它需要你手动插入图像来修复空白td单元格而我想要可以自动完成此操作的东西)。
我知道我所追求的不是逐步增强,因为我工作的基准需要JavaScript和最新技术。因此,该现有术语对我不起作用。
我还知道这不是优雅降级,因为如果没有本机功能和JavaScript(假设您的polyfill使用JavaScript),它将根本无法工作。
因此,我想说一个简单的词,并且可以使人对这件事会做的事情产生一个模糊的想法。Polyfill就这么出现在我的想法里,并且符合我的要求。Poly表示可以使用多种技术解决该问题-它不仅限于使用JavaScript完成,而且fill会填补浏览器中需要该技术的空白。它也并不意味着“旧的浏览器”(因为我们也需要填充新的浏览器)。
同样对我来说,产品Polyfilla(在美国包装)是一种糊剂,可以粘贴到墙壁上以覆盖裂缝和孔洞。我非常喜欢可视化我们如何修复浏览器的想法。墙壁平坦后,您可以随意绘画,也可以贴墙纸作为您内心的满足。
我收到了一些有关“应该更改单词”的反馈,但更多的是当时的社区需要单词,就像我们需要Ajax,HTML5,Web 2.0来实现我们的想法一样。不管这个词是否完美,都已证明它具有作用力,并且开发人员和设计师都了解这些概念。
示例
摘自MDN,你可以将这段代码插入到你的脚本开头,从而使你的 bind() 在没有内置实现支持的环境中也可以部分地使用bind。
if (!Function.prototype.bind) (function(){
var slice = Array.prototype.slice;
Function.prototype.bind = function() {
var thatFunc = this, thatArg = arguments[0];
var args = slice.call(arguments, 1);
if (typeof thatFunc !== 'function') {
// closest thing possible to the ECMAScript 5
// internal IsCallable function
throw new TypeError('Function.prototype.bind - ' +
'what is trying to be bound is not callable');
}
return function(){
var funcArgs = args.concat(slice.call(arguments))
return thatFunc.apply(thatArg, funcArgs);
};
};
})();