2022-06-21 Babel

Babel相关

什么是Babel?

  • Babel就是一个js转码器,将高版本js转化为低版本js以兼容各种或者各个版本的浏览器

**Babel各版本区别

  • Babel5

    • babel-cli 一个babel命令行工具
    • babel-core 核心编译引擎
    • babel-polyfill 各种高级别语法糖或者api垫片
  • Babel6
    -完全插件化,不包含任何转换器,需要按需引入插件以实现功能

@babel/core和@babel/cli工作原理

  • babel/core本身不具备转码功能,它把功能拆分到一个个插件中,比如负责解析阶段的是parser,作用是将源码解析成AST,负责生成节点的是generator,作用是将AST转化成低版本的js代码

  • 根据配置文件,可以决定产物中是否存在代码,ast或者map文件

    var options = {
    //是否生成解析的代码
    code: true,
    //是否生成抽象语法树
    ast: true,
    //是否生成sourceMap
    sourceMaps: true,
    plugins: [],
    presets: [],
    };
    
  • babel/cli是自带的交互式编译工具

    //全局安装调用
    npm install --g @babel/cli
    babel index.js -o output.js
    //本地安装调用
    npm install --save-dev @babel/cli
    npx babel index.js -o output.js
    

预设

  • 由于babel插件众多,如果每次都要一个个去配置太耗时,所以提供了预设,其实就是插件包,一个预设里面包含了很多不同功能且必须的插件,省去配置的时间

配置文件

  • 命令行虽然可以配置插件和预设(preset),但是为了结合前端工程化工具,比如gulp,webpack等,还可以通过配置文件进行配置
  • 项目常见的babel配置文件有:babelrc.js,babel.confog.js等
    主要配置内容像这样:
    {
    "presets": [...],
    "plugins": [...]
    }
    
  • 一般通过配置文件来给babel/core添加一些预设和plugin插件
  • 有时候我们需要给预设和插件设置参数,这个时候每个项就需要用到数组来设置
    {
    "plugins": [
      [
        "@babel/plugin-transform-arrow-functions", 
        { "spec": true }
      ]
    ]
    }
    

执行顺序

  • 插件比预设先执行
  • 插件执行顺序时插件数组从前向后执行
  • 预设执行顺序时数组从后向前执行

浏览器支持

  • 默认情况下presets-evn是presets-es2015 presets-es2016和presets-es2017的叠加
  • 支持特定版本的浏览器
    {
    "presets": [
      [
        "@babel/env",
        {
          "targets": "last 2 Chrome versions"
        }
      ]
    ]
    }
    

spec
解析箭头函数插件的参数,默认为false,如果设置为true。将会用bind包裹this,以便在箭头函数内部使用

@babel/polyfill
presets可以解决大部分语法转换,但是一些ES6原型链上的函数或者新的API,低版本浏览器本身就不支持。比如promise,这个时候就需要用过polyfill也就是垫片来解决了。实际上就是按其他方式实现了一个promise,然后将pomise设置到浏览器全局对象中。
确定是这样会污染全局变量

@babel/runtime
将所有辅助函数放置到一个函数包中,在使用的地方按需引入,这样做的效果类似polyfill,只不过你没法直接通过api调用高级语法

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文链接 https://blog.csdn.net/liuyan19891230/article/details...
    雷霆克吕齐阅读 466评论 0 0
  • Babel 是一个 JavaScript 编译器。 Babel 是一个工具链,主要用于将 ECMAScript 2...
    hellomyshadow阅读 461评论 0 0
  • 前端工程化之前 前端工程化之前,我们编写代码 html js css . 因为浏览器只能读懂这几个代码因为单独的h...
    川九阅读 554评论 0 0
  • Babel 是 JavaScript 的转译器。用于将 ES Next 的代码转换成浏览器或者其他环境支持的代码。...
    一蓑烟雨任平生_cui阅读 491评论 0 0
  • babel官网 babel 介绍 Babel 是一个通用的多用途 JavaScript 编译器。通过 Babel ...
    锋享前端阅读 1,846评论 0 10