欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一文搞定babel转换

程序员文章站 2022-07-13 09:00:18
...

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,在[email protected]/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