「JavaScript学习笔记」 Babel 主要配置项

基本构成

babel-core:

  • 只包括 parse 和 output 部分
  • 不做任何转换
  • 可以通过bundler工具使用它(webpack rollup)

babel-polyfill babel-runtime

  • 提供不能转换的部分(API,比如promise,Object.assign),用以模拟转换es2015+到es5
  • 依赖 regenerator(generators polyfill), core-js (剩余polyfill部分)
  • 两者不同点在于,babel-polyfill的引入污染全局变量(相当于全局引入),babel-runtime 对源码进行转换(提供转换函数包装源码),不污染全局环境
  • babel-runtime不是所有API都能够处理

babel plugins

  • 代码转换,即具体的(语法)代码转换由plugin实现
  • babel syntax / transform plugin
  • stage-x 不推荐使用了

babel-preset-env

  • 根据具体环境(target选项 node/ browserslist / electron)提供针对性的插件合集
  • buildIns 选项,提供babel-polyfill的引入

core-js

  • 它是JavaScript标准库的polyfill
  • 它通过尽可能的模块化,让你能选择你需要的功能
  • 它可以不污染全局空间
  • 它和babel高度集成,可以对core-js的引入进行最大程度的优化
  • 最新版本core-js@3 ,babel@7.4 以上请使用 core-js@3+,新的语法提案会在 core-js@3+实现

来配置一下

// babel.config.js
module.exports = {
  presets: [
    [
      '@babel/preset-env',
      {
        useBuiltIns: 'usage', 
        // 该配置项决定 preset 如何处理polyfill
        // "usage" | "entry" | false, defaults to false.
        // usage: 根据源码和target 自动引入polyfill,此时不需要在app入口引入 polyfill
        // entry:该选项会将 import "core-js/stable" 或import "regenerator-runtime/runtime" (或者cjs格式的引入) 替换为 所有的polyfill
        // 即一行代码表示占位,通过替换引入所有polyfill,省位置
        
        corejs: 3 
        // 2, 3 or { version: 2 | 3, proposals: boolean }, defaults to 2.
        // corejs 仅在 useBuildIns: usage/entry 时生效,
        // 该选项只决定使用的是什么版本的corejs
        // babel 7.4.0 以上需要安装使用 core-js@3 版本,同时注意entry时入口的使用方式
      }
    ]
  ],
  
  plugins: [
    [
      '@babel/plugin-transform-runtime', // 该插件依赖 @babel/runtime 需要安装
      {
        helpers: true, 
        // default: true 
        // 是否使用helper转换源码 preset-env: useBuiltIns: usage 下使用
        
        regenerator: true, 
        // default: true
        // 转换 regenerator-runtime
        // 非 useBuiltIns: usage 时使用 ,usage下已通过polyfill引入
        
        corejs: false,
        // false, 2, 3 or { version: 2 | 3, proposals: boolean }, defaults to false.
        // 转换core-js 以及对应版本
        // 通常项目应用不需要开启,全局已经通过preset-env引入了
        // 如果是开发供他人用的库,根据需要开启,避免不同polyfill实现不同导致功能失效
        
        
        absoluteRuntime: require('path/to/@babel/runtime/package.json'),  // 指定runtime版本
        version: require('@babel/helpers/package.json').version // 同样指定版本,以免出现依赖版本错误
      }
    ]
  ]
}
 
// src.js
// entry 时使用,usage时不要加上,由插件自动加入,false时手动选择自己需要的插件
// 另外 babel/polyfill 实际包含以下两个库,只是从babel 7.4 (使用core-js@3) 以后需要分开引入
import "core-js";
import "regenerator-runtime/runtime";

// babel 7.4 以下版本使用,注意 @babel/polyfill 为 core-js@2版本
import '@babel/polyfill';

小小总结一下

配置babel时,preset-env作为plugin引入的基础,提供 target / broswerlist 指定不同环境下的babel转换。
需要注意preset-envbabel-runtime 存在对源码转换重复的地方。

一般来说,app配置 useBuildIns: usage 时,动态引入polyfill和plugin,babel-runtime配置为不转换core-jsregenerator,由于app为一个整体,可以全局引入polyfill,如果有特别的第三方库需要单独配置。此外,现在大部分脚手架工具(vue-cli cra)默认不转换node_modules的第三方库。

如果项目不在乎polyfill大小,也可以 useBuildIns: entry 入口引入core-jsregenerator-runtime/runtime ,此时不需要引入runtime helper

如果开发的是一个需要带polyfill且避免污染全局环境的第三方库,那么则配置为 useBuildIns: false babel-runtime 配置 core-js-: 3 helper: true regenerator: true 由runtime配置polyfill。

可能会遗忘的内容

pluginspresets 的顺序

presets 从后往前加载(配置项的数组从后往前),历史原因:原来的用户大多数会["es2015", "stage-0"]的形式书写,新的提案往往写在后面,新提案可能会依赖了ES6的语法,因此需要先解析到ES6再转ES5。

plugins 按照数组顺序从第一个到最后一个编译。

参考文章

结合Babel 7.4.0 谈一下Babel-runtime 和 Babel-polyfill
Babel学习系列3-babel-preset,babel-plugin
Babel学习系列4-polyfill和runtime差别(必看)
babel-polyfill vs babel-plugins -- stackoverflow

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349