babel:对ES2015+的语法转换为浏览器兼容的语法

babel的安装和使用

官网:https://babeljs.io/
民间中文网:https://www.babeljs.cn/

babel简介

因为不同版本的浏览器能识别的ES标准并不相同,就导致了开发者面对不同版本的浏览器要使用不同的语言,例如ES2015,ES2017,ES2018…等等。为了能够把不同标准书写的语言,编译为统一的、能被各种浏览器识别的语言,这就是babel的作用
在这里插入图片描述

由于语言的转换工作灵活多样,babel的做法和postcss、webpack差不多,它本身仅提供一些分析功能,真正的转换需要依托于插件完成。
在这里插入图片描述

举个例子吧,比如我们用ES6中的箭头函数

const func = ()=>{
	console.log("babel test")
}
//-------它会被编译为:
"use strict";

var func = function func() {
  console.log("babel test");
};

babel的安装

babel可以和构建工具联合使用,也可以独立使用。需要安装下面两个库:

  • @babel/core:babel核心库,提供了编译所需的所有api
  • @babel/cli:提供一个命令行工具,调用核心库的api完成编译
npm i -D @babel/core @babel/cli

babel的使用

@babel/cli的使用极其简单,它提供了一个命令babel,可以按文件或目录编译

# 按文件编译
#babel 要编译的文件 -o 编辑结果文件
npx babel index.js -o temp.js
# 按目录编译
#babel 要编译的整个目录 -d 编译结果放置的目录
npx babel src -d dist

babel预设

预设的作用我就不多说了,babel有多种预设,比如@babel/preset-env@babel/preset-flow@babel/preset-typescript等等。

最常见的预设是@babel/preset-env。可以让你使用最新的JS语法,而无需针对每种语法转换设置具体的插件

npm i -D @babel/preset-env

配置预设:通过一个配置文件.babelrc,presets是一个数组,可以有多个预设,从后向前处理,和loader相似

{
    "presets": [
        "@babel/preset-env"
    ]
}

配置兼容的浏览器:预设需要根据兼容的浏览器范围来确定如何编译。通过一个配置文件.browserslistrc

last 3 version  //兼容倒数三个版本
> 1%  			//市场占有率1%以上
not ie <= 8		//不需要兼容ie8以下

配置自身的属性

具体的配置见:https://www.babeljs.cn/docs/babel-preset-env#options

{
    "presets": [
        ["@babel/preset-env", {
            "配置项1": "配置值",
            "配置项2": "配置值",
            "配置项3": "配置值"
        }]
    ]
}

其中一个比较常见的配置项是usebuiltins,该配置的默认值是false,由于该预设仅转换新的语法,并不对新的API进行任何处理,usebuiltins可以在编译结果中注入这些新的API,它的值默认为false,表示不注入任何新的API,可以将其设置为usage,表示根据API的使用情况,按需导入API

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

babel常用插件

上节课补充:@babel/polyfill 已过时,目前被core-jsgenerator-runtime所取代

通常情况下,@babel/preset-env只转换那些已经形成正式标准的语法,对于某些处于早期阶段、还没有确定的语法不做转换。如果要转换这些语法,就要单独使用插件。他们的运行顺序

  • 插件在 Presets 前运行。
  • 插件顺序从前往后排列。
  • Preset 顺序是颠倒的(从后往前)。

1、@babel/plugin-proposal-class-properties

@babel/plugin-proposal-class-properties:该插件可以在类中书写初始化字段

class A {
    a = 1;
    constructor(){
        this.b = 3;
    }
}

2、@babel/plugin-proposal-function-bind

@babel/plugin-proposal-function-bind:该插件可以为某个方法绑定this

function Print() {
    console.log(this.loginId);
}

const obj = {
    loginId: "abc"
};

obj::Print(); //相当于:Print.call(obj);

3、@babel/plugin-proposal-optional-chaining

@babel/plugin-proposal-optional-chaining:可以使用链式运算符

const obj = {
  foo: {
    bar: {
      baz: 42,
    },
  },
};

const baz = obj?.foo?.bar?.baz; // 42

const safe = obj?.qux?.baz; // undefined

4、babel-plugin-transform-remove-console

babel-plugin-transform-remove-console:该插件会移除源码中的控制台输出语句

console.log("foo");
console.error("bar");

5、@babel/plugin-transform-runtime

@babel/plugin-transform-runtime:用于提供一些公共的API,这些API会帮助代码转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值