一文搞定babel转换

babel转换流程

code转换为AST => 遍历AST树、进行修改 => 还原为code

babel结构

  • @babel/core AST转换的核心

  • @babel/cli 打包工具

  • @babel/plugin* Babel 插件机制,Babel基础功能不满足的时候,手动添加些

  • @babel/preset-env 预设插件集,减少配置各类插件

  • @babel/polyfill 把浏览器某些不支持API,兼容性代码全部导入到项目,不管你是不是用到,缺点是代码体积特别大

  • @babel/runtime 把你使用到的浏览器某些不支持API,按需导入,代码少

presets

  • @babel/preset-env:最常用的 presets,包含大部分es6语法

  • @vue/app:Vue presets,在@babel/preset-env基础上,添加了自定义的plugins

  • preset的常用参数

    • debug 默认是 false 开启后控制台会看到 哪些语法做了转换,Babel的日志信息,开发的时候强烈建议开启
    • useBuiltIns
      • false 啥子也不干
      • entry 引入全部polyfill
      • usage 按需引入polyfill
    • targets 支持哪些浏览器

polyfill

babel-polyfill是将整个es2015+环境引入到全局中,会造成全局污染
require('core-js/modules//set');

改变了原型,所以可以在实例上使用方法

通过配置useBuiltIns可实现按需加载

// .babelrc
{
    "presets": [
        [
            "@babel/preset-env",
            {
                "debug": true,
                "useBuiltIns": "usage",
                "targets":{
                    "browsers":["> 1%", "last 2 versions", "not ie <= 8"]
                }
            }
        ]
    ],
    "plugins": [
        [
            "@babel/plugin-transform-runtime"
        ]
    ],
}

transform-runtime和babel-runtime

定义特有变量引入api,从而避免全局污染
var _set = require('@babel/runtime/helpers/set');
  • babel-plugin-transform-runtime是插件,转换代码为对babel-runtime的引用
  • babel-runtime是真正提供runtime环境的包
// 输入的ES6代码
var sym = Symbol();
// 通过transform-runtime转换后的ES5+runtime代码 
var _symbol = require("babel-runtime/core-js/symbol");
var sym = (0, _symbol.default)();

你可能感兴趣的:(babel)