按需加载 Polyfill 的核心是精准特性检测与动态加载:用 window.Promise、'fetch' in window 等检测具体能力,而非 UA;优先 polyfill.io 自动适配,或手动引入 UMD 版本(如 core-js/stable/promise、whatwg-fetch),并配合 Babel preset-env 的 useBuiltIns: 'usage' 按需注入。

按需加载 Polyfill 是兼顾兼容性与性能的关键策略——不给现代浏览器塞多余代码,只在真正缺失功能时补丁。核心就两点:精准检测 + 动态加载。
先做特性检测,别猜浏览器版本
用 window.Promise、'fetch' in window 这类原生 API 检测,比查 navigator.userAgent 可靠得多。IE11 支持 Promise 但不支持 fetch,Chrome 60+ 原生支持 CustomElements,但老版 Android WebView 可能连 Object.defineProperty 都不全。检测必须落到具体能力上。
-
if (!window.Promise)→ 补 Promise -
if (!('fetch' in window))→ 补 fetch(注意:它依赖 Promise,得先确保 Promise 可用) -
if (!('customElements' in window))→ 补 Web Components,且要搭配custom-elements-es5-adapter.js解决 ES5/ES6 混用问题
用 polyfill.io 实现最小化交付
直接引入 polyfill.io 的带参 URL,它会根据当前浏览器 User-Agent 自动返回仅含所需特性的 polyfill 包。比如 IE11 请求会包含 Promise + fetch + classList,而 Chrome 120 请求可能返回空响应。
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- 优势:零配置、CDN 加速、自动适配未来浏览器
- 注意:不能用于内网或 UA 被篡改的环境;敏感项目建议自建服务或预编译
手动加载要选对格式和时机
旧浏览器(如 IE11)不支持 ES6 模块,所以不能 import polyfill,必须用 <script src> 方式加载 UMD 或 IIFE 版本。
立即学习“Java免费学习笔记(深入)”;
- Promise 推荐 core-js/stable/promise(比 es6-promise 更贴合标准,修复 Edge 12–13 的 bug)
- fetch 用 whatwg-fetch,但它不提供 AbortController,需要取消请求就得额外加 abortcontroller-polyfill
- 避免冲突:不要同时引入 es6-promise 和 core-js 的 Promise,会导致
Promise.all()行为异常
构建流程里配合 Babel preset-env
如果用 webpack 或 vite 构建,@babel/preset-env 配合 useBuiltIns: 'usage' 能自动在源码中插入所需 polyfill 引用,比如检测到用了 Array.from(),就只注入 core-js/stable/array/from。
- 目标浏览器声明示例:
"targets": {"browsers": ["last 2 versions", "IE 11"]} - 注意:它只处理语法转译 + 静态 API 补丁,动态特性(如
IntersectionObserver)仍需手动检测加载

















