0

0

javascript的polyfill和transpiler有何区别_如何使用babel兼容旧浏览器【教程】

紅蓮之龍

紅蓮之龍

发布时间:2026-01-17 21:52:02

|

181人浏览过

|

来源于php中文网

原创

polyfill 补功能缺失,transpiler 改语法不兼容;babel 不处理运行时 api 缺失,需搭配 core-js 等 polyfill;按需引入可优化体积,复杂特性应避免手写。

javascript的polyfill和transpiler有何区别_如何使用babel兼容旧浏览器【教程】

Polyfill 和 Transpiler 解决的是两类完全不同的兼容性问题:一个补“功能”,一个改“语法”。 你写 Promise.allSettled(),IE11 直接报 TypeError: Object doesn't support property or method 'allSettled' —— 这是 Polyfill 的活;你写 const fn = () => {},老引擎直接 SyntaxError 报错卡死 —— 这得靠 Transpiler(比如 Babel)提前转成 var fn = function() {}

为什么不能只用 Babel?—— 它不处理 API 缺失

Babel 是个语法重写器,它能看到 async/awaitclass?. 这些新写法,并把它们变成老浏览器能 parse 的代码。但它看不到运行时缺失的全局对象或原型方法,比如:

  • Array.prototype.flat() 在 IE 和早期 Edge 中根本不存在,Babel 不会、也不能给 Array.prototype 加这个方法
  • fetch() 是一个全局函数,Babel 不会自动注入它的实现
  • MapSetPromise 这些构造函数,Babel 默认不提供替代实现

换句话说:Babel 转译后,代码能“跑起来”;但跑起来之后调用一个不存在的 API,照样崩溃。

如何用 Babel + Polyfill 实现真正兼容?—— 三步配齐

现代项目里,Babel 本身不自带 Polyfill,必须显式引入。推荐组合方式(以 Webpack + Babel 为例):

Supercreator
Supercreator

AI视频创作编辑器,几分钟内从构思到创作。

下载

立即学习Java免费学习笔记(深入)”;

  • 安装核心依赖:
    npm install --save-dev @babel/preset-env
    npm install --save core-js@3 regenerator-runtime
  • 在入口 JS 文件顶部(如 index.js)最前面引入:
    import 'core-js/stable';
    import 'regenerator-runtime/runtime';
    (注意顺序:先 core-js/stable,再 regenerator-runtime/runtime
  • 配置 .babelrcbabel.config.js,明确目标浏览器:
    {
      "presets": [
        ["@babel/preset-env", {
          "targets": {
            "ie": "11",
            "chrome": "49"
          },
          "useBuiltIns": "usage",
          "corejs": 3
        }]
      ]
    }
    其中 "useBuiltIns": "usage" 表示按需引入 Polyfill(比如只用了 Array.prototype.includes,就只打进去这一个),避免全量加载拖慢首屏。

手写 Polyfill 的边界在哪?—— 别碰复杂特性

你可以安全地为简单方法写 Polyfill,比如:

if (!String.prototype.replaceAll) {
  String.prototype.replaceAll = function(search, replace) {
    return this.split(search).join(replace);
  };
}
但以下情况强烈不建议手写

  • Promisefetch:涉及微任务队列、网络请求状态机等底层机制,手写极易出竞态或内存泄漏
  • Map/Set:需要正确实现迭代器协议([Symbol.iterator])、键值唯一性、弱引用语义等,core-js 的实现经过大量浏览器实测
  • Intl 相关 API(如 Intl.DateTimeFormat):依赖庞大 ICU 数据,Polyfill 体积动辄几百 KB,应交由 @formatjs/intl 等专业库处理

真实项目中,core-js 已覆盖 95%+ 常见需求,手动 Polyfill 只适合极简场景或学习目的。

最容易被忽略的一点:即使配置了 useBuiltIns: "usage",如果代码里有动态字符串拼接调用(比如 eval('Array.prototype.includes')),Babel 无法静态分析,就不会注入对应 Polyfill —— 这类写法本身也该被禁止。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
edge是什么浏览器
edge是什么浏览器

Edge是一款由Microsoft开发的网页浏览器,是Windows 10操作系统中默认的浏览器,其目标是提供更快、更安全、更现代化的浏览器体验。本专题为大家提供edge浏览器相关的文章、下载、课程内容,供大家免费下载体验。

1691

2023.08.21

IE浏览器自动跳转EDGE如何恢复
IE浏览器自动跳转EDGE如何恢复

ie浏览器自动跳转edge的解决办法:1、更改默认浏览器设置;2、阻止edge浏览器的自动跳转;3、更改超链接的默认打开方式;4、禁用“快速网页查看器”;5、卸载edge浏览器;6、检查第三方插件或应用程序等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

395

2024.03.05

如何解决Edge打开但没有标题的问题
如何解决Edge打开但没有标题的问题

若 Microsoft Edge 浏览器打开后无标题(窗口空白或标题栏缺失),可尝试以下方法解决: 重启 Edge:关闭所有窗口,重新启动浏览器。 重置窗口布局:右击任务栏 Edge 图标 → 选择「最大化」或「还原」。 禁用扩展:进入 edge://extensions 临时关闭插件测试。 重置浏览器设置:前往 edge://settings/reset 恢复默认配置。 更新或重装 Edge:检查最新版本,或通过控制面板修复

1025

2025.04.24

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

557

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

698

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

645

2023.11.24

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

4

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.7万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.3万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号