vue/cli -- babel


Babel 是一个工具链,主要用于将 ECMAScript 2015+ 版本的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。

1. babel的作用

  1. 语法转换
  2. 通过 Polyfill 方式在目标环境中添加缺失的特性
  3. 源码转换 (codemods)

为什么要用babel转换代码呢:

@babel/polyfill

例:如果我们要使用Array.prototype.find(),但是某个版本的浏览器不支持此方法,我们可以通过babel引入相关的Polyfill文件就可以了

注:Polyfill 是一块代码(通常是 Web 上的 JavaScript),用来为旧浏览器提供它没有原生支持的较新的功能。

@babel/preset-env

例:

1// 箭头函数
2let Fn = () => {
3    //
4}

因为一些浏览器根本就不识别这些代码,这时候就需要把这些代码转换成浏览器识别的代码。 babel就是做这个事情的。

2. babel的工作原理

Code => AST => new AST => new Code


为了转换我们的代码, babel做了三件事:

  • Parser:解析我们的代码转换为 AST。(@babel/parser)
  • Transformer:利用我们配置好的 plugins/presets把 Parser生成的 AST转变为新的 AST。(@babel/preset-*)
  • Generator:把转换后的 AST生成新的代码(@babel/generator)

从图上看 Transformer占了很大一块比重,这个转换过程就是 babel中最复杂的部分,我们平时配置的 plugins/presets就是在这个模块起作用。

*注:抽象语法树(AST)Abstract Syntax Tree是javascript的最底层结构,babel通过操作AST实现对源代码的修改,可以通过recast插件查看AST的结构

3. babel的使用

  • 正常我们需要安装以下依赖

1npm install --save-dev @babel/core @babel/cli @babel/preset-env
2npm install --save @babel/polyfill

  • 创建一个名为config的配置文件

1module.exports = {
2    presets: [
3        [
4            require('@babel/preset-env'),
5            {
6                targets: {
7                    edge: "17",
8                    firefox: "60",
9                    chrome: "67",
10                    safari: "11.1",
11                },
12                useBuiltIns: 'usage'
13            },
14        ],
15    ],
16    // 上面的浏览器列表只是一个任意示例。您将不得不对其进行调整以适合您要支持的浏览器。
17    plugins: [
18        //
19    ]
20}

  • 运行此命令,将src目录中的所有代码编译为lib

1./node_modules/.bin/babel src --out-dir lib

@babel/cli

Babel带有内置CLI,可用于从命令行编译文件。

@babel/core

@babel/core 包括了整个babel工作流,也就是说在@babel/core里面我们会使用到@babel/parser、transformer[s]、以及@babel/generator。

所有的transformations都会使用babel.config.js文件

@babel/parser

@babel/parser的作用是将源代码解析成 AST ,方便各个插件分析语法进行相应的处理。

@babel/generator

@babel/generator将修正后的AST解码生成js代码。

@babel/preset-env

@babel/preset-env是一个智能预设,可让您使用最新的JavaScript,转化最新语法如箭头函数, class, 扩展运算符,想要转换最新的api还需引入@babel/polyfill

@babel/preset-env接受您指定的任何目标环境,并根据其映射检查它们,以编译插件列表,并将其传递给Babel。

默认情况下,除非设置了target或ignoreBrowserslistConfig选项,@babel/preset-env将使用browserslist配置源

browserslist配置源从以下位置读取:

  1. package.json文件中的browserslist字段
  2. .browserslistrc配置文件
  3. browserslist.config.js 配置文件
  4. 运行环境变量BROWSERSLIST
  5. 默认如下

1"browserslist": [
2    "defaults"
3]
4// defaults => > 0.5%, last 2 versions, Firefox ESR, not dead

useBuiltIns:

  • 此选项配置如何@babel/preset-env处理polyfill
  • 'usage':支持按需引入,优化了core-js导入

@babel/polyfill

babel只负责语法转换,比如将ES6的语法转换成ES5。但如果有些对象、方法,浏览器本身不支持,比如:

  1. 全局对象:Promise、WeakMap 等。
  2. 全局静态函数:Array.from、Object.assign 等。
  3. 实例方法:比如 Array.prototype.includes 等。

此时,需要引入@babel/polyfill来模拟实现这些对象、方法。需要安装在生产依赖中

3. @vue/cli中的babel

我们从package.json入手

1"dependencies": {
2    "axios": "^0.19.1",
3    "core-js": "^3.4.4",
4    "vue": "^2.6.10",
5    "vue-meta": "^2.3.2",
6    "vue-router": "^3.1.3",
7    "vuex": "^3.1.2"
8},
9"devDependencies": {
10    "@vue/cli-plugin-babel": "^4.1.0",
11    "@vue/cli-plugin-eslint": "^4.1.0",
12    "@vue/cli-plugin-unit-jest": "^4.1.0",
13    "@vue/cli-service": "^4.1.0",
14    "@vue/eslint-config-standard": "^4.0.0",
15    "@vue/test-utils": "1.0.0-beta.29",
16    "babel-eslint": "^10.0.3",
17    "babel-plugin-import": "^1.13.0",
18    "eslint": "^5.16.0",
19    "eslint-plugin-vue": "^5.0.0",
20    "image-webpack-loader": "^6.0.0",
21}

core-js

由于自@babel/polyfill7.4.0起已弃用,可以直接添加core-js和设置版本。在@vue/cli项目中,只安装了core-js

core-js是我们能够使用新的API的最重要的包,然而一般情况它隐藏在webpack编译后的代码中,我们一般不会去查看

  • 它是JavaScript标准库的polyfill
    • 最新的 ECMAScript 标准
    • ECMAScript 标准库提案
    • 一些 WHATGW / W3C 标准(跨平台或者 ECMAScript 相关)
  • 它尽可能的进行模块化,让你能选择你需要的功能
  • 它可以不污染全局空间
  • 它和babel高度集成,可以对core-js的引入进行最大程度的优化

@vue/cli-plugin-babel

这就是vue-cli特有的babel插件,其中包括babel7,babel-loader,@vue/babel-preset-app

其中也加载了@babel/core工作流,查看./node_modules/@vue/babel-preset-app,其中配置了:

1presets: [
2    [require('@babel/preset-env'), {
3        useBuiltIns,
4        corejs: 3
5    }]
6]

babel-loader则是webpack配置的预处理器

babel-plugin-import

babel-plugin-import是一款 babel 插件,它会在编译过程中将 import 的写法自动转换为按需引入的方式
例:vant

1plugins: [
2    ['import', {
3        libraryName: 'vant',
4        libraryDirectory: 'es',
5        style: true
6    }, 'vant']
7]

babel-eslint

ESLint 默认使用Espree作为其解析器,你可以在配置文件中指定一个不同的解析器

ESLint不支持Babel支持的某些语法节点。使用babel-eslint时,将对ESLint进行修补,并将您的代码转换为ESLint可以理解的代码。相关配置

.eslintrc.js中:

1parserOptions: {
2    parser: 'babel-eslint'
3}



babel 的介绍及其配置的更多相关文章

  1. 03_MyBatis基本查询,mapper文件的定义,测试代码的编写,resultMap配置返回值,sql片段配置,select标签标签中的内容介绍,配置使用二级缓存,使用别名的数据类型,条件查询ma

     1 PersonTestMapper.xml中的内容如下: <?xmlversion="1.0"encoding="UTF-8"?> < ...

  2. python学习第二讲,pythonIDE介绍以及配置使用

    目录 python学习第二讲,pythonIDE介绍以及配置使用 一丶集成开发环境IDE简介,以及配置 1.简介 2.PyCharm 介绍 3.pycharm 的安装 二丶IDE 开发Python,以 ...

  3. OSPF协议介绍及配置 (上)

    OSPF协议介绍及配置 (上) 一.OSPF概述 回顾一下距离矢量路由协议的工作原理:运行距离矢量路由协议的路由器周期性的泛洪自己的路由表,通过路由的交互,每台路由器都从相邻的路由器学习到路由,并且加 ...

  4. x-pack 功能介绍及配置传输层安全性(TLS / SSL)

    x-pack 功能介绍及配置传输层安全性(TLS / SSL) 学习了:https://blog.csdn.net/wfs1994/article/details/80411047

  5. mysql多实例介绍及配置

    mysql多实例介绍及配置 1.mysql多实例介绍 1.1 什么是mysql多实例 mysql多实例就是在一台机器上开启多个不同的服务端口(如:3306,3307),运行多个MySQL服务进程,通过 ...

  6. 13.LAMP架构介绍及配置

    LAMP架构介绍及配置 LAMP简介与概述 LAMP概述 LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态Web站点服务及其应用开发环境. LAMP是一 ...

  7. [webpack] webpack-dev-server介绍及配置

    webpack-dev-server是webpack官方提供的一个小型Express服务器.使用它可以为webpack打包生成的资源文件提供web服务.webpack-dev-server官方文档 w ...

  8. Rsync原理介绍及配置应用

    1.前言 基于LAN或WAN的网络应用之间进行数据传输或者同步非常普遍,比如远程数据镜像.备份.复制.同步,数据下载.上传.共享等等.对此,最简单.直接的做法是对数据进行完全复制.然而,数据在网络上来 ...

  9. 日志组件logback的介绍及配置使用方法

    一.logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback-core,logback- classic和logback-acc ...

随机推荐

  1. 【工程应用五】 opencv中linemod模板匹配算法诸多疑惑和自我解读。

    研究这个前前后后也有快两三个月了,因为之前也一直在弄模板匹配方面的东西,所以偶尔还是有不少朋友咨询或者问你有没有研究过linemod这个算法啊,那个效率啥的还不错啊,有段时间一直不以为然,觉得我现在用 ...

  2. 网站SQL注入防御实战

    SQL注入作为直接威胁web业务的最严重攻击行为,已经被大多数的网站管理员所了解,这种通过HTTP标准端口,利用网页编码不严谨,提交精心构造的代码实现对数据库非授权访问的攻击方法,已经被越来越多的sc ...

  3. 远程控制Windows2003下安装Pcanywhere导致Awgina.dll出错的解决办法

    远程控制的时候出现的问题引用 症状启动计算机时,"欢迎使用 Windows"登录屏幕不出现.您还可能会看到与下面的某条信息类似的错误信息: ? 一个最近安装的程序使欢迎屏幕和快速用 ...

  4. Java基础——日期类Date

    一.概述 date代表一个特定的时间,精确到毫秒 二.构造方法 方法名 说明 public Date() 分配一个Date对象,并初始化,以便它代表被分配的时间,精确到毫秒 public Date(l ...

  5. 基于Kali的一次DDos攻击实践

    镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 一.什么是DDos攻击 DDOS(Distributed Denial of Service),即分布式拒绝服务,是一种针对于网络服务的攻击行为. ...

  6. xilinx SDK在线仿真_烧写 提示失败

    1.找到工程目录下的Binaries->xxx.elf-[arm/le] . 2.右击该elf,选择Debug As->Debug Configurations... 进入设置界面. 3. ...

  7. 内网渗透----域环境搭建(server 2012)

    先确定两台服务器相通 1.配置静态IP与DNS 2.配置域服务 点击服务器管理器-添加角色和功能-下一步-添加AD域服务: 3.提升为域控制器 安装完成后,可在旗帜处选择提升为域控制器 添加新林 添加 ...

  8. 项目可以怎么规范Git commit ?

    通常情况下,commit message应该清晰明了,说明本次提交的目的,具体做了什么操作.但是在日常开发中,大家的commit message都比较随意,中英文混合使用的情况有时候很常见,这就导致后 ...

  9. SpringCloudAlibaba 微服务讲解(四)Sentinel--服务容错(一)

    4.1 高并发带来的问题 在微服务中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现网 ...

  10. 半吊子菜鸟学Web开发1 --配置开发环境

    先说说我自己的情况,我算是一个半吊子菜鸟,对web开发熟练度为0,但是对熟悉C++和Python 所以这里开始记录我学习Web开发的历程,看看我这里学习的程序,能够学到什么地方. 首先是配置环境,我的 ...