使用cdn和npm引入的区别_【Babel系列 第一篇】Babel的使用

本文是Babel系列首篇,主要介绍Babel的作用,如将ES6+转译为ES5,提供polyfill,支持TS/Flow等。详细讲解了如何通过CLI、代码内及打包工具使用Babel,并着重阐述了Babel的plugins和presets,包括它们的工作顺序和模块配置选项如amd、umd等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是Babel系列的第一篇,讲讲Babel的使用。

What is Babel

Babel is a JavaScript compiler. Babel is a toolchain that is mainly used to convert ECMAScript 2015+ code into a backwards compatible version of JavaScript in current and older browsers or environments. Babel可以帮我们处理以下事情:
  • 语法转换,将ES6+ 语法转换成ES5的代码

  • 对新版本ES的feature提供polyfill

  • TS / flow支持(类型)

  • 生成source map

  • ...

ad36f82643a28cb0ccfa571a662b88ed.png

Usage Guide

Babel 有以下几种使用方式:
  • 通过Cli使用

  • 代码中使用

  • 配合打包工具(gulp、webpack、rollup使用)

plugins

Babel不进行任何配置开箱即用不会任何效果,也就是说一段ES6的代码经过刚开箱的 babel 处理,输出的还是之前的代码。Babel的所有转换效果都是通过Plugins完成的,每个Plugin都有自己的能力,能处理对应的ES代码。 例(开箱即用) 安装babel cli和core 9d59d6c2aa4340ce2904806c85dab4ec.png 写一段简单的代码在src/index.js中,运行babel,将处理完的文件输出到dist目录,处理后的 dist/index.js没有变化

cab1489a2344636953a2847a5285e3a9.png

从babel7开始,babel提供的npm库都变为在@babel这个scope下。 Babel plugins分为两类:
  • 语法类(Syntax)

  • 转换类(Transform)

Syntax plugins在官网上是这么说的: These plugins only allow Babel to parse specific types of syntax (not transform). 所以Syntax plugin是用来 识别 新语法的,不进行转换,在启用transform plugin的时候对应的syntax会自动引入,不需要单独配置。 plugins usage 给index.js补充一些代码: 001dfd22531db01e3e74f2205628bcb0.png 安装plugin: 7580ff84575d13f065046fd9d5a9b159.png 创建一个 babel的配置文件(.babelrc.js) 64d639992cbc1ff4e930b626e47cdb6c.png 再次使用babel处理 8ca991105534649c41def87311c5cb40.png 可以看到class和箭头函数都被转换了。 plugins 的启用顺序 如果两个plugins都要对某一种类型的节点进行处理,处理顺序是怎样的? babel按照以下顺序对代码进行处理:
  • plugins先于presets

  • plugins数组内部处理顺序从左到右

  • presets数组内部处理顺序从右到左


transform-runtime 上面的plugins例子中可以看到在转换的时候,babel引入了很多自定义的函数(helper),比如_createClass,这样存在的问题是,每个使用class的文件里都会有这样一段一毛一样的代码,这种重复肯定是不可以接受的,所以babel提供了transform-runtime这个plugin。 948a9cc566ef8c68726098d57650bf7a.png 转换完的代码中就可以看到: 8304d7966771b6b0457a1c9b079f5ed3.png 这样就都是引用同一个地方的代码了就不存在重复问题了。 transform runtime plugin提供了一些配置: corejs 默认为false,可以设置为:false、2、3,不同的值需要安装不同的babel/runtime。
  • 为false,需要安装 babel/runtime

  • 为2,需要安装 babel/runtime-corejs2

  • 为3,需要安装 babel/runtime-corejs3

上面三个值的区别是什么? corejs: false的情况下,transform-plugin 只会对语法进行处理 255f96580a85ce88f1d0280ec088f926.png babel处理完如下: ad2cd2555b9e530643f8538355066f70.png 如果设置corejs为3并且安装了runtime-corejs3,babel处理过的代码如下: 96137c35028d1da49b5300bf4210d58a.png corejs: 2和corejs: 3的区别在于,2只能处理类方法,3能处理类方法和实例方法 presets plugins有辣么多,挨个配置岂不是要了老命,所以babel提供了presets,来简化babel配置。 官方Presets:
  • @babel/preset-env

  • @babel/preset-flow

  • @babel/preset-react

  • @babel/preset-typescript

下面主要介绍一下preset-env,其他几个preset从名字就可以看出来是非常有针对性的去处理一些指定情况。 @babel/preset-env env所有presets最复杂的一个了,这个preset,可以根据我们对browserslist的配置,在转码时自动根据我们对转码后代码的目标运行环境的最低版本要求,采用更加“smart”的转码,如果我们设置的最低版本的环境,已经原生实现了要转码的ES特性,则会直接采用ES标准写法;如果最低版本环境,还不支持要转码的特性,则会自动注入对应的polyfill。 @babel/preset-env没有收入所有stage-x的plugins。所以preset-env不是万能的。如果我们用到某一个新的ES特性,还是proposal阶段,而且preset-env不提供转码支持的话,就得自己单独配置plugins。 那preset-env如何去使用呢?这里介绍日常会用到的配置: target 告诉env要兼容的目标环境,上面说过,preset-env会很聪明的帮助我们进行代码转换,这里就是配置最低的目标环境。 例: 51354a2cf4f71eb680aafe90598a654a.png
modules
设置babel转换的时候对于模块的导出方式,可以设置以下几个值:
  • amd

  • umd

  • systemjs

  • commonjs

  • cjs

  • auto

  • false

: 新建一个src/lib/index.js 28da3538279b17fb3fa19a7c581ac9f3.png 不设置module,babel处理后: 7dc87d9cdc0854eaadc8249a8d5f1c70.png 设置module为false: 经过babel处理后,可以看到模块导出方式没有发生变化: a796070c87a4100b4ccfaac20328a795.png useBuildIns useBuildIns 可以设置为 usage、entry、false,默认为false。该属性告诉env如何去处理polyfill 因为我们要对一些高级语法、类方法、实例方法进行polyfill,所以我们要引入core-js, 16e6fe36be26c893b5bd5e341c668cd3.png 设置 useBuiltIns: “entry”,之后,env会根据当前目标的环境从中取出需要的polyfill,例: a964cf79917166ada536544937462c42.png 可以看到babel根据当前环境从corejs里取出了很多的polyfill文件 设置useBuildIns为usage,则会根据当前代码使用到的需要polyfill的方法进行处理,例: 这里只用到了数组的find方法 427540ea420c8681b4b4229208fec10d.png 经过babel处理之后,也只会引入find这一个依赖,不会像上面设置为entry之后引入了很多没用到的依赖。 0f8408b121696c8c52732e1d72fb8d91.png corejs 最后一个要介绍的配置是corejs 该属性设置使用的corejs的版本,默认是2 当设置 corejs为3并且useBuildIns为usage的时候,就不需要我们在代码入口处手动import corejs了。 ad36f82643a28cb0ccfa571a662b88ed.png

总结

Babel是一个JS的compiler,开箱即用的babel不会做任何处理,Babel的插件可以对语法进行转换,如果需要polyfill,需要使用core-js和regenerator-runtime。通过设置presets-env的useBuildIns可以帮助我们更好的进行polyfill。 79fd6abb82a2b21241eafa3d2d048e82.png 长按关注,不迷路

07238c2ace7718ddd0eb64a33bcc173e.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值