身为大厂前端的你,不能不知道Babel + Polyfill!

news/2025/11/15 21:30:44/文章来源:https://www.cnblogs.com/haoxiugong/p/19226278

〇、Babel 概述

Babel 的工作原理 = “把代码变树 → 改树 → 再变回代码”。

也就是三个阶段:

  1. Parse(解析):ESNext(ES 新语法) → AST 语法树
  2. Transform(转换):插件修改 AST
  3. Generate(生成):AST → 旧 JS 代码(浏览器都可以识别的代码)

Babel 是一个“代码转换工具”,核心就是围绕 AST(抽象语法树)做代码替换,替换成兼容各浏览器的代码旧语法。

一、Babel 的编译三阶段(Pipeline)

  1. Parsing(解析成 AST)

作用:把 JS 源码转成 AST(抽象语法树)

示例代码:

const sum = (a, b) => a + b;

转换成的 AST 类似这样的树状结构:

Program└─ VariableDeclaration└─ VariableDeclarator├─ Identifier(sum)└─ ArrowFunctionExpression├─ Identifier(a)├─ Identifier(b)└─ BinaryExpression(+)

解析流程满足:

  • babylon / @babel/parser → 把源码变成 AST
  • AST 格式遵循 ESTree 标准
  1. Transform(通过插件修改 AST)

Babel 插件会遍历 AST,并进行“节点替换”。

比如将箭头函数转成 ES5:

输入(AST 节点:ArrowFunctionExpression):

const sum = (a, b) => a + b;

输出(被插件改过的 AST):

const sum = function(a, b) {return a + b;
};

这个过程主要由 Babel 的“Transform 插件”(如 @babel/plugin-transform-arrow-functions)完成。

插件在遍历 AST 时,会提供“Visitor 函数”,例如:

Visitor = {ArrowFunctionExpression(path) {// 发现箭头函数 → 替换成普通函数定义}
}

所有 Babel 插件本质上都是:AST 节点识别 + 替换。

我们最常见插件有:

  • 处理箭头函数
  • 处理类 class
  • 处理 async/await
  1. Generate(生成兼容代码)

最后阶段:把变过的 AST 再转成 JS 字符串。

通过:

  • @babel/generator

输出:

"use strict";var sum = function (a, b) {return a + b;
};

至此,编译完成。

二、Babel 与 Webpack 的协作很简单

Webpack 使用 babel 其实只需要 babel-loader ,然后为不同的转换提供不同的 babel 插件配置,整个过程都会在 babel-loader 内部完成:

把文件交给 Babel 处理,拿到 Babel 输出的 JS,再丢给 webpack 的后续 loader / bundler。

流程如下:

source.js↓ (webpack 调用 babel-loader)
Babel1. parse2. transform (plugins/presets)3. generate↓
transpiled.js↓
webpack 打包输出 bundle.js

身为开发者的我们只需要关注 webpack 相关配置,至于内部如何处理无需关心。

三、Preset(预设)进一步减少我们的心智负担

如果每一个 babel 插件都需要我们手动配置,其实会大大增加我们的工作量,而且这些插件对应的语法都是固定的,有没有这样一种可能,我们可以将同一个类型的插件都合并为一个“插件集合”呢?

有的兄弟,有的。

一个 Preset(预设)就是一个这样的“插件集合”。

你多多少少会听过 @babel/preset-env,这也是我们最常用的预设。

它会自动根据浏览器兼容列表(browserslist)决定启用哪些语法转换。

例如:

// package.json
{// 大厂中我们一般直接继承公司内部的配置包,放到跟仓库供所有包复用:// "extends @your-company/browserslist-config""browserslist": ["> 0.2%","not dead","not op_mini all"] 
}

然后 preset-env 就会根据浏览器的兼容列表自动识别哪些语法需要兼容。

四、你真的无敌了吗 Babel ?

缺陷:Babel 不能转换无法用旧语法表达的特性 / 运行时 API

例如:

  • Promise
  • Array.from
  • String.includes
  • Object.assign
  • WeakMap
  • Symbol
  • Map
  • Set
  • Array.prototype.flat
  • .....

而这些,还需要 Polyfill 支持(如 core-js)。

core-js​ 是 polyfill 的集合库​。

polyfill 就是 “在旧浏览器里补上新原生 API”。

// 用 preset-env + core-js 自动按需注入 polyfill
["@babel/preset-env", {useBuiltIns: "usage", // 用到了什么新API,就注入对应的 polyfill,而不是注入整个 core-jscorejs: 3
}]
  • 这里再说一下,其他的两个常用包:
  • @babel/runtime:一般来说 babel 会为每个文件注入 helper 函数,使用了 runtime 包后,这些 helper 会被统一从 "@babel/runtime/helpers/*" 引入,减少重复 helper,减少 bundle 体积
  • @babel/plugin-transform-runtime:让 Babel 自动从 runtime 引入 helper

这里暂时不提供大厂完整配置代码,因为很多复杂配置可能同学们看不太懂。

所以,点赞 + 收藏 + 关注,直到工程化系列文章更新完毕,再为大家展示真实大厂项目中的前端工程化完整配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/966512.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨域问题解决方案汇总

全文默认讲的是浏览器端发起的 HTTP 请求的“跨域”问题(同源策略导致的受限)。跨域 / 同源策略概述​同源(same-origin)​:协议、域名(host)、端口 三者完全相同称为同源。 例如 https://example.com:443 和 h…

Access-Control-Allow-Origin 在企业中的用法

接上篇文章说道,跨域解决方案中的 CORS 方案,会配置一个 Access-Control-Allow-Origin 的配置项,而且我们一般不直接配置为 *,这样做的原因是什么以及企业中的最佳实践是怎么样的,这篇文章给你答案!简单概括Acce…

VUE_basic - Ref

vue Vue 官方文档: https://vuejs.org/ 1.vue_basic 01_初识Vue <!DOCTYPE html> <html><head><meta charset="UTF-8" /><title>初识Vue</title><!-- 引入Vue --…

详细介绍:像素退场,曲线登场:现代响应式 CSS 全家桶 | 领码课堂

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

HTTPS 究竟比 HTTP 好在哪?

一、HTTP vs HTTPS 概览 HTTPS = HTTP + 加密认证(基于 TLS),能防止被中间人窃听与篡改,并证明服务器身份。非对称(RSA/ECDSA)用于​做身份认证与安全协商密钥​(但慢)。 对称加密速度快,适合实际数据传输。 …

小苯的因子查询

题目链接:https://www.nowcoder.com/practice/6a22a725087b4a11a1aad4fd170d1c6b?channelPut=trackerqcq12 思路解法: 武功秘籍:《阶乘因子心法》 第一层心法:核心洞察(为什么是质因子『2』?) 口诀一: “问奇…

详细介绍:MongoDB 自动化脚本安装方案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Linux网络--6、网络层 - 详解

Linux网络--6、网络层 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

原型理解从入门到精通

原型这块知识点,其实在我们工作中的使用非常简单。但是俗话说“面试造火箭,工作拧螺丝”,在面试中,面试官不时就会考察一些花里胡哨的问题,所以,我们只有将这个概念和他的相关知识理解透彻,才能以不变应万变。两…

2025-11-15

Problem - 1858B - Codeforces(1500)(贪心) 这题一个是要读题 在不包括cookie seller的区间才算没吃饼干的时间sum += (s[i] - s[i - 1] - 1) / d; 在加上路过cookie seller时吃的饼干数 sum += m - 1; 然后贪心的…

Pandas - read_html()

Pandas - read_html()When I ran below code: df = pd.read_html(https://en.wikipedia.org/wiki/List_of_countries_by_population) I got error: HTTPError: HTTP Error 403: Forbidden I can open that URL in brow…

实用指南:Linux企业级解决方案架构:字节跳动短视频推荐系统全链路实践

实用指南:Linux企业级解决方案架构:字节跳动短视频推荐系统全链路实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: …

实用指南:PyTorch DataLoader 高级用法

实用指南:PyTorch DataLoader 高级用法2025-11-15 20:48 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block …

简单做一个舒尔特方格小游戏

以下是一个 Python 简易舒尔特方格小游戏,基于 tkinter 实现(无需额外安装第三方库),支持自定义方格大小、计时计分、自动生成随机数字,新手可直接复制运行: 舒尔特方格小游戏(Python 代码) `import tkinter a…

C语言新手怎么快速掌握

C 语言新手快速掌握的核心逻辑是:先抓核心语法(少而精),再练动手实战(高频场景),最后补底层原理(避免踩坑),全程围绕 “用代码解决实际问题” 展开,拒绝死记硬背。以下是 4 周可落地的学习方案,兼顾效率和…

RSS and Atom

RSS and AtomWhat is RSS? ChatGPT said:RSS (Really Simple Syndication) is a standard web format used to publish frequently updated content, such as news articles, blog posts, podcasts, and announcement…

Wi-Fi FTM(Fine Timing Measurement)简介

1. 什么是 Wi-Fi FTM? Wi-Fi FTM(Fine Timing Measurement)是 IEEE 802.11mc 标准中引入的一项精确测距技术。它通过 Wi-Fi 设备之间的多次往返时间(Round-Trip Time, RTT)测量,计算两者之间的距离,从而实现室内…

通用会话控制方案

一、会话控制概念目的:在无状态的 HTTP 请求间识别/鉴权用户身份并维持登录状态。 核心问题:谁保存“用户状态”?(服务器 / 客户端 / 第三方认证服务器),以及如何安全地在多请求间传递该凭证(Cookie / Authoriz…

LISTAGG 用于将多行数据聚合为单行字符串(拼接),而与其功能相反的需求是 将单行字符串按指定分隔符拆分为多行数据

LISTAGG 用于将多行数据聚合为单行字符串(拼接),而与其功能相反的需求是 将单行字符串按指定分隔符拆分为多行数据。Oracle 中没有直接对应的内置内置函数**,但可以通过以下方法实现类似效果: 方法1:使用 CONNEC…