我想在我的AngularJS应用中使用各种填充/垫片。
例如,classList
在IE9及以下版本中不受支持。
我尝试了两种在应用程序中定义polyfill的方法:
首先,只需将所有polyfill放在app.js
页面的顶部,即可定义和配置所有其他模块。
其次,我已经尝试过了:
angular.module('polyfills',[]);
angular.module('polyfills')
.config([function() {
// all polyfills in here
}]);
这两个选项都可以。但是,这两种选择对我来说似乎都有些奇怪。凭直觉,.config
我感觉应该坚持配置诸如提供者,拦截器等之类的东西。似乎这可能是一个过去已经解决的问题,并且我觉得某种最佳实践已经实现了。结果。
有更好的方法吗?
不要将您的polyfill放在一个有角度的模块中,这很奇怪,而不是您想要的。您想要的是让每个浏览器中的js实现看起来都一样,因此请在加载其他任何js资源之前加载您的polyfill。创建一个包含您的polyfill的js文件(如果您希望每个polyfill都包含在自己的文件中,请创建更多文件),并在脚本标记中加载该js文件,然后再放置其他任何js文件。您的polyfills也应该在IIFE的内部。
这是Array.from的示例polyfill的示例(出于演示目的,这是一个非常简单的polyfill):
array-from-polyfill.js
(function() {
'use strict';
Object.defineProperty(Array, 'from', {
configurable: false,
enumerable: false,
value: function (object) {
'use strict';
return [].slice.call(object);
}
});
})();
然后,将以下标签放在index.html(或您称为顶层模板的任何文件)中的任何其他js文件之前。是的,甚至在没有角度资源或引导资源之前。
<script src="path/to/array-from-polyfill.js"></script>
最后两个注意事项。首先,始终使用Object.defineProperty,并将“ enumerable”设置为false。除非您想要某种迭代对象属性的方法来拾取您的polyfill。这意味着您必须摆弄MDN的polyfill,但这很好。无论如何,您可能应该知道绕过defineProperty的方法。
其次,我建议您在每个浏览器中加载polyfill,即使该浏览器已经具有该功能。基本上,您执行的代码在任何地方都应该尽可能相同。在一个特定的浏览器中出现错误没有什么比这更令人烦恼的了,因为它正在(或者并非如此)使用您的polyfill。这不是一个普遍的真理,所以做适合您的事情。
不要忘记确保您的Polyfill也已加载到测试环境中,并定期检查是否可以停用Polyfill。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句