前端工程化工具系列(十一)—— Babel(v7.24):JavaScript编译器

本文主要是介绍前端工程化工具系列(十一)—— Babel(v7.24):JavaScript编译器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Babel 是一个Javascript 编译器。主要用于将 ECMAScript 2015+ 版本的代码转换为向后兼容(backwards compatible)的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其它环境(如:Node.js)中。
Babel 可以在命令行中单独运行也可以和 webpack、rollup 等工具结合使用。

1 单独 || 结合 Webpack 使用

1.1 安装

1.1.1 针对 JavaScript

pnpm add -D @babel/core @babel/preset-env core-js
  • @babel/core
    主要用于将源代码 (JS\TS) 解析为 AST (抽象语法树)。
  • @babel/preset-env
    预设环境。源代码解析成 AST 后,还需要进行转换和生成,这是由插件来做的。@babel/preset-env(预设环境)是常用预设和插件的集合(babel-preset-es2015,babel-preset-es2016,babel-preset-es2017,babel-preset-latest,babel-preset-node5, babel-preset-es2015-node 等,@babel/preset-env 不支持 stage-x 插件)。
    最初每年 EcmaScript 标准更新,都需要使用者手动添加最新年份的预设才能进行新语法的转换,后来改成了 babel-preset-latest,意思为最新的预设(包含了以往所有年份),不用每年都需要手动添加一把。最终 latest 也被废弃,变成了目前的 preset-env。开发人员可以在代码中直接书写已经正式发布的特性。不过,当 ES 更新时,肯定还需要更新一下 @babel/preset-env。
  • core-js
    Babel 默认只转换新的 JavaScript 语法,如: 类、箭头函数、扩展运算(spread),而不转换新的 API ,如:Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise 等全局对象,以及一些定义在全局对象上的方法(如:Object.assign)。不能被转译的 API 详细清单可以查看 definitions.js 文件。
    core-js 提供了 ES5、ES6+ 的 polyfills (填充物,用于实现浏览器并不支持的原生 API 的代码,它将一个新的 API 引入到一个旧的环境中,仅靠旧环境中已有的技术手段实现),包括 promises, symbols, collections, iterators, typed arrays 等等。之前的 @babel/polyfill 已被废弃。

这里不得不提一下 core-js 库和它的俄罗斯作者。该库一周的下载量比大家熟知的 Angular、 React、Vue加一起的下载量还要多的多。就这样的一个库谁能想到它的作者竟然需要在命令行里 looking for a good job,后来该作者又因为骑摩托车撞死一人,伤一人,被判入狱18个月, 现在已经出狱了,应该也找到工作了…

1.1.2 针对 TypeScript

在 JS 的基础上增加:

pnpm add -D @babel/preset-typescript

1.1.3 通过命令行单独使用

pnpm add -D @babel/cli 
@babel/cli

用于通过命令行编译文件。

1.2 配置

1.2.1 针对 JavaScript

需要结合 browserslist 一起使用,Browerslist 的配置见:《前端工程化工具系列(十)—— Browserslist:浏览器兼容性配置工具》
接下来在项目根目录下创建 babel.config.json,填入以下内容:

{"presets": [["@babel/preset-env",{"useBuiltIns": "usage","corejs": "3","modules": false}]]
}
  • targets
    设置编译代码的目标平台,可以是浏览器也可以是node环境。如不设置,会将所有ES6+的代码编译为ES5-。建议设置,这样可以按目标平台来决定是否进行转换,以避免增加不必要的补丁,减少打包后的代码体积。
    这里没有单独做设置,而是共享了 browserslist 的配置。
  • useBuiltIns
    是否内置兼容。如果设置,就可以不用在 HTML 中引入 polyfill 的 JS 文件来处理浏览器的兼容性问题了。
    可选值包括:“usage” | “entry” | false。
    • false:默认值,即不引入polyfills,不做浏览器兼容。
    • entry:根据配置的浏览器,引入这些浏览器不兼容的polyfill。这个是在文件中已经明确写了import “core-js” 或其中具体某个模块(如:import “core-js/es/array”)的情况下,babel 会根据 browserslist 自动添加指定浏览器不兼容的该模块下的所有 polyfill,无论当前代码是否需要。
    • usage:会根据配置的浏览器以及代码中用到的 API 自动添加polyfill,实现了按需引入。一般使用这个配置。

只有当 useBuiltIns 的值为 entry 或 usage 时,“corejs” 这个选项才会起作用。这里如无特殊情况尽量指定
core-js 的版本为 3(默认为 2), 因为它有很多2没有的新特性: “corejs”: 3。

  • modules
    可选值包括:“amd” | “umd” | “systemjs” | “commonjs” | “cjs” | “auto” | false, 默认是 “auto”.
    一般默认转出的是 CommonJS 模块,这里配置为 false ,是想保留 ESM 模块。

1.2.2 针对 TypeScript

{"presets": [["@babel/preset-env",{"useBuiltIns": "usage","corejs": "3","modules": false}],"@babel/preset-typescript"]
}

2 结合 Rollup

对于一般应用开发来说,直接使用上述的 polyfill 方案是比较方便的,但如果是开发组件库或者类库的话,这种方案未就不太合适,以上第一部分的 polyfill 是添加自定义全局对象或向对象的 prototype 上添加方法实现的,会污染全局作用域。使用 @babel/plugin-transform-runtime 这个插件就可以解决这个问题。

2.1 安装

在以上单独配置的基础上,添加:

pnpm add -D @babel/plugin-transform-runtime

2.1 配置

无论是 JavaScript 还是 TypeScript 都使用以下配置。
如果是 TypeScript 项目,由于转译不能在 babel 中做(会报错),而是通过 rollup 的插件来做。因此,需要移除 @babel/preset-typescript 这个库

{"presets": [["@babel/preset-env",{"modules": false}]],"plugins": [["@babel/plugin-transform-runtime",{"corejs": "3"}]]
}

这里没有单独设置 targets,而是共享了 browserslist 的配置。

针对 Babel 的配置已经完成了,接下来要结合 rollup 来构建打包。具体可参看《前端工程化工具系列(十三)—— Rollup:专注于库构建的JavaScript打包器》。

这篇关于前端工程化工具系列(十一)—— Babel(v7.24):JavaScript编译器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1042087

相关文章

SpringBoot整合AOP及使用案例实战

《SpringBoot整合AOP及使用案例实战》本文详细介绍了SpringAOP中的切入点表达式,重点讲解了execution表达式的语法和用法,通过案例实战,展示了AOP的基本使用、结合自定义注解以... 目录一、 引入依赖二、切入点表达式详解三、案例实战1. AOP基本使用2. AOP结合自定义注解3.

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

HTML5的input标签的`type`属性值详解和代码示例

《HTML5的input标签的`type`属性值详解和代码示例》HTML5的`input`标签提供了多种`type`属性值,用于创建不同类型的输入控件,满足用户输入的多样化需求,从文本输入、密码输入、... 目录一、引言二、文本类输入类型2.1 text2.2 password2.3 textarea(严格

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过