惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

雷峰网
雷峰网
MongoDB | Blog
MongoDB | Blog
D
Docker
Martin Fowler
Martin Fowler
人人都是产品经理
人人都是产品经理
GbyAI
GbyAI
Jina AI
Jina AI
酷 壳 – CoolShell
酷 壳 – CoolShell
M
MIT News - Artificial intelligence
腾讯CDC
阮一峰的网络日志
阮一峰的网络日志
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
Netflix TechBlog - Medium
B
Blog RSS Feed
云风的 BLOG
云风的 BLOG
Blog — PlanetScale
Blog — PlanetScale
Vercel News
Vercel News
The Cloudflare Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
有赞技术团队
有赞技术团队
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
I
InfoQ
U
Unit 42

张鑫旭-鑫空间-鑫生活

1分钟速度了解text-align match-parent声明 « 张鑫旭-鑫空间-鑫生活 光标的形状也能设置了,就是CSS caret-shape属性 « 张鑫旭-鑫空间-鑫生活 pretext与文字四面环绕效果的实现 « 张鑫旭-鑫空间-鑫生活 JSON.rawJSON方法的作用是什么? « 张鑫旭-鑫空间-鑫生活 如何使用CSS判断鼠标从哪个方向进入元素? « 张鑫旭-鑫空间-鑫生活 借助mediabunny纯JS实现视频水印、剪裁、合成等功能 « 张鑫旭-鑫空间-鑫生活 务必谨慎使用JS WeakRef弱引用 « 张鑫旭-鑫空间-鑫生活 CSS六边形头像的实现与蜂巢布局 « 张鑫旭-鑫空间-鑫生活 CSS corner-shape与背景底纹技术 « 张鑫旭-鑫空间-鑫生活 浅学WebTransport API:下一代Web双向通信技术 « 张鑫旭-鑫空间-鑫生活 HTML dialog元素新支持了closedBy属性 « 张鑫旭-鑫空间-鑫生活 HTML interestfor属性与悬停popover交互效果 « 张鑫旭-鑫空间-鑫生活 CSS3模拟window7炫酷界面效果展示 « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 纯js无图片无外链CSS图片幻灯片播放插件 « 张鑫旭-鑫空间-鑫生活 CSS border三角、圆角图形生成技术简介 « 张鑫旭-鑫空间-鑫生活 CSS “渐进增强”在web制作中常见应用举例 « 张鑫旭-鑫空间-鑫生活 让IE6/IE7/IE8浏览器支持CSS3属性 « 张鑫旭-鑫空间-鑫生活 jQuery – 高亮动态显示页面HTML代码插件 « 张鑫旭-鑫空间-鑫生活 翻译 – 逐渐消失的Flash网站 « 张鑫旭-鑫空间-鑫生活 CSS reset的重新审视 – 避免样式重置 « 张鑫旭-鑫空间-鑫生活 新浪微博插入话题后部分文字选中的js实现 « 张鑫旭-鑫空间-鑫生活 JavaScript实现http地址自动检测并添加URL链接 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变背景(gradient)效果 « 张鑫旭-鑫空间-鑫生活 CSS content内容生成技术以及应用 « 张鑫旭-鑫空间-鑫生活 CSS gradient渐变之webkit核心浏览器下的使用 « 张鑫旭-鑫空间-鑫生活 CSS渐变之CSS3 gradient在Firefox3.6下的使用 « 张鑫旭-鑫空间-鑫生活 区分IE8/IE7/IE6及其他浏览器-CSS “\9″hack « 张鑫旭-鑫空间-鑫生活 CSS实现跨浏览器兼容性的盒阴影效果 « 张鑫旭-鑫空间-鑫生活 CSS3&HTML5各浏览器支持情况一览表 « 张鑫旭-鑫空间-鑫生活
polyfill、ponyfill、prollyfill傻傻分不清楚 « 张鑫旭-鑫空...
张鑫旭,zhangxinxu · 2021-08-08 · via 张鑫旭-鑫空间-鑫生活

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=10054 鑫空间-鑫生活
本文欢迎分享与聚合,全文转载就不必了,尊重版权,圈子就这么大,若急用可以联系授权。

马儿素描

一、ponyfill是什么?

偶然进入谷歌实验室的Browser-FS-Access项目,这个项目使用 File System Access API 实现文件上传现在,对于不支持文件系统访问API的浏览器使用 <input type="file"><a download> 进行优雅降级。

这不是重点,重点是我在如此官方的项目中又一次见到了这个名字——ponyfill!

ponyfill填充

之前也见到过几次,以为是乡野名词,技术梗,坊间笑谈,没想到谷歌官方项目都这可这个名词,那就必须要搞清楚ponyfill是个什么东东了。

小马填充

关于ponyfill还有个专门的github项目,专门解释ponyfill是什么,以及和polyfill的区别。

polyfill字面意思是使用聚合物进行填充,有补窟窿的意味在里面,就好像有四面墙,有一面墙有个窟窿,使用东西把这个窟窿补上,让四面墙看起来一样,整整齐齐的就是polyfill。

整整齐齐一家人

ponyfill和polyfill类似,但是更纯净,无污染,就像小马一样,我称之为“小马填充”。

小马吃草

同样是让修补墙壁,ponyfill的策略则是另起炉灶,不会在原有的墙壁上修补,而是重新建一面墙,保证原来的墙壁还是那么原始纯净无污染。

二、polyfill和ponyfill的区别

举个例子,Array.isArray()方法可以判断一个对象是不是数组,此方法IE8浏览器并不支持。

如果采用 polyfill 策略,则代码会是下面这样:

if (!Array.isArray) {
  Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]';
  };
}

采用和原生浏览器一样的API。

如果采用 ponyfill 策略,则代码会是下面这样:

function isArray (arg) {
  return Object.prototype.toString.call(arg) === '[object Array]';
}

使用示意:

isArray([]) // 返回 true

同样是让所有浏览器支持某功能,但是,并不会采用和规范一致的API。

也就是Ponyfill总是避免使用原生 API。

什么时候使用Ponyfill?

polyfill策略大部分时候都是很OK的,使用方便快捷,不需要关心各种细节。

但是,并不是所有的时候都适合使用polyfill。

  1. 有些原生API完全没法模拟,此时只能使用Ponyfill策略。例如本文一开始提到的 File System Access API,低版本浏览器完全搞不定。

    又例如 indexDB 能力,history.pushState()方法等,IE9浏览器根本没法模拟,只能使用 Ponyfill策略。

  2. 有些原生API规范还没稳定,或者处于快速迭代中,或者是浏览器部分支持,此时走polyfill策略可能会有问题,影响未来策略。例如自定义元素v1规范和v2规范。
  3. 有时候可能会通过对象存在与否判断浏览器,polyfill可能会影响逻辑。例如有业务代码使用 if (![].map) {} 判断是不是低版本IE浏览器,如果不小心引入了包含 Array.prototype.map 的代码,可能会出现问题。

其他

基本上,为了避免全局命名的污染,Ponyfill都是建议采用独立的模块化的方式开发与调用的,例如:

module.exports = function (arg) {
  return Object.prototype.toString.call(arg) === '[object Array]';
};
var isArray= require('is-array-ponyfill');
// 返回 true
isArray([]);

随着浏览器开始原生支持 export/import 模块导入导出,ponyfill 方法开始使用浏览器标准模块规范使用了:

export default function (arg) {
  return Object.prototype.toString.call(arg) === '[object Array]';
};
import isArray from 'is-array-ponyfill';
// 返回 true
isArray([]);

三、prollyfill又是什么鬼?

什么鬼? 查找相关资料的时候,发现还有个 prollyfill,搞笑了,prollyfill概念貌似还未加入正统,处于小范围转播阶段。

Prollyfill本质上就是 Polyfill,只是Polyfill的这个API还没有成为标准API,但是已经约定俗称,或者呼声很高,或者官方已经开始考虑,也就是你知道以后会有这个API,但是目前浏览器都还没有支持的API的实现。

例如 JSON.saveJSON.load 这两个未来可能的JSON方法

对了,还有个 Nottifill

Nottifill表示浏览器或Node环境以后可能支持的功能,但是,没有任何草案显示,细节实现和描述都是开发人员自己定义的。

例如,10年前 jQuery中的 remove() 方法,append()方法就有这种味道在里面。

四、结束语

上了年纪,心态稳了,内容也平静多了。

要是年轻的时候,肯定不会称“小马填充”,而会称“马化腾填充”,保证记忆深刻,数年都不会忘记。

就这吧,不多扯了,今天事儿太多了,本周计划估计完不成了。

欢迎分享,欢迎传播,让更多人知道这几个概念。

对了,下周我会在微博和掘金(关注我的沸点)上进行新书的抽奖,大家可以关注下,应该都是周一发(如果我忘记了那就是周二):

我的新书

感谢大家长久以来的支持,祝大家好运!

本文为原创文章,欢迎分享,勿全文转载,如果实在喜欢,可收藏,永不过期,且会及时更新知识点及修正错误,阅读体验也更好。
本文地址:https://www.zhangxinxu.com/wordpress/?p=10054

(本篇完)