babelrc配置

Babel 是什么?

Babel 是一个 JavaScript 编译器

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

  • 语法转换
  • 通过 Polyfill 方式在目标环境中添加缺失的特性(通过第三方 polyfill 模块,例如 core-js,实现)
  • 源码转换 (codemods)

配置 Babel

.babelrc和babel.config.js 都是Babel的配置文件

babel 7.x 以上开始支持两种类型的配置文件, 分别是.babelrc 和 babel.config.js

babel.config.js是在babel第7版引入的,主要是为了解决babel6中的一些问题

  • .babelrc会在一些情况下,莫名地应用在node_modules中
  • .babelrc的配置不能应用在使用符号链接引用进来的文件
  • 在node_modules中的.babelrc会被检测到,即使它们中的插件和预设通常没有安装,也可能在Babel编译文件的版本中无效

并且支持的文件扩展名:

Babel 可以使用 Node.js 原生支持的任何文件扩展名进行配置:您可以使用.json、 .js、.cjs和.mjs, forbabel.config.json和.babelrc.jsonfiles

推荐使用场景:

  • babel.config.json
    • 你正在使用一个monorepo(可以理解为在一个项目中会有多个子工程)
    • 你希望编译node_modules以及symobllinked-project中的代码
      *.babelrc
    • 你的配置仅适用于项目的单个部分
    • 需要在子目录/文件中运行一些特定的转换,比如你可能不希望一些第三方库被转码
  • 综合推荐使用babel.config.json,Babel itself is using it

配置文件 .babelrc

使用 Babel 第一步就是配置此文件,放在项目根目录,此文件用于配置转码规则和插件,基本格式:

{
"presets":[],
"plugins":[]
}

预设(Presets)

Babel 的预设(preset)可以被看作是一组 Babel 插件和/或 options 配置的可共享模块。

创建预设
如需创建一个自己的预设(无论是为了本地使用还是发布到 npm),需要导出(export)一个配置对象

可以是返回一个插件数组...

module.exports = function() {
  return {
    plugins: ["pluginA", "pluginB", "pluginC"],
  };
};

preset 可以包含其他的 preset,以及带有参数的插件。

module.exports = () => ({
  presets: [require("@babel/preset-env")],
  plugins: [
    [require("@babel/plugin-proposal-class-properties"), { loose: true }],
    require("@babel/plugin-proposal-object-rest-spread"),
  ],
});

预设的排列顺序
Preset 是逆序排列的(从后往前)。

{
  "presets": ["a", "b", "c"]
}

将按如下顺序执行: c、b 然后是 a。

这主要是为了确保向后兼容,由于大多数用户将 "es2015" 放在 "stage-0" 之前。

预设的参数
插件和 preset 都可以接受参数,参数由插件名和参数对象组成一个数组,可以在配置文件中设置。

如果不指定参数,下面这几种形式都是一样的:

{
  "presets": [
    "presetA", // bare string
    ["presetA"], // wrapped in array
    ["presetA", {}] // 2nd argument is an empty options object
  ]
}

要指定参数,请传递一个以参数名作为键(key)的对象。

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "loose": true,
        "modules": false
      }
    ]
  ]
}

插件(plugins)

Babel 的代码转换是通过将插件(或预设)应用到您的配置文件来启用的。

使用插件
如果插件在npm 上,你可以传入插件的名称,Babel 会检查它是否安装在node_modules. 这被添加到plugins配置选项,它采用一个数组。

{
  "plugins": ["babel-plugin-myPlugin", "@babel/plugin-transform-runtime"]
}

您还可以指定插件的相对/绝对路径。

{
  "plugins": ["./node_modules/asdf/plugin"]
}

插件顺序
这意味着如果两个转换插件都将处理“程序(Program)”的某个代码片段,则将根据转换插件或 预设(preset) 的排列顺序依次执行。

  • 插件在 预设(preset) 前运行。
  • 插件顺序从前往后排列。
{
  "plugins": ["transform-decorators-legacy", "transform-class-properties"]
}

先执行 transform-decorators-legacy ,在执行 transform-class-properties

** 插件参数**
参数由插件名和参数对象组成一个数组,可以在配置文件中设置。
如果不指定参数,下面这几种形式都是一样的:

{
  "plugins": ["pluginA", ["pluginA"], ["pluginA", {}]]
}

要指定参数,请传递一个以参数名作为键(key)的对象。

{
  "plugins": [
    [
      "transform-async-to-module-method",
      {
        "module": "bluebird",
        "method": "coroutine"
      }
    ]
  ]
}

补充
1.语法转译器
@babel/preset-env 转译包
主要对 JavaScript 最新的语法糖进行编译,并不负责转译新增的 API 和全局对象。
而 Promise,Iterator,Generator,Set,Maps,Proxy,Symbol 等全局对象,以及一些定义在全局对象的方法(比如 includes/Object.assign 等)并不能被编译。
官方推荐使用,包含了所有现代js(es2015 es2016等)的所有新特性,你也可以传递一些配置给env,精准实现你想要的编译效果。

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "useBuiltIns": "entry"
      }
    ]
  ]
}

参数:

  • targets https://www.babeljs.cn/docs/babel-preset-env#targets
    string | Array<string> | { [string]: string },targets如果在@babel/preset-env的文档中没有指定与浏览器列表相关的选项,则默认为顶级选项,否则为{}
    描述您的项目支持/目标的环境。
{
  "targets": "> 0.25%, not dead"
}
  • modules
    "amd" | "umd" | "systemjs" | "commonjs" | "cjs" | "auto" | false,默认为"auto"。
    启用 ES 模块语法到另一种模块类型的转换。请注意,这cjs只是commonjs.
    将此设置为false将保留 ES 模块。仅当您打算将本机 ES 模块发送到浏览器时才使用此选项。如果您在 Babel 中使用捆绑器,modules: "auto"则始终首选默认值。

  • include
    Array<string|RegExp>,默认为[]
    始终包含的一系列插件。

  • exclude
    Array<string|RegExp>,默认为[]。
    要始终排除/删除的一系列插件。

  • useBuiltIns
    "usage"| "entry"| false,默认为false。
    此选项配置如何@babel/preset-env处理 polyfill。
    当使用usageentry选项时,@babel/preset-env会将对core-js模块的直接引用添加as bare imports (or requires)。这意味着core-js将相对于文件本身进行解析并且需要可访问。

由于@babel/polyfill已在 7.4.0 中弃用,我们建议直接core-js通过corejs选项添加和设置版本。

  • corejs
    string或{ version: string, proposals: boolean },默认为"2.0"。该version字符串可以是任何受支持的core-js版本。例如,"3.8"或"2.0"。

  • configPath
    string, 默认为 process.cwd()
    开始对 browserslist 进行配置搜索的起点,并上升到系统根目录直到找到。

2.API 和全局对象转译器

负责转译新增的 API 和全局对象,保证在浏览器的兼容性。比如Promise,Iterator,Generator,Set,Maps,Proxy,Symbol 等全局对象,以及一些定义在全局对象的方法(比如 includes/Object.assign 等)具体可查询https://github.com/babel/babel/blob/master/packages/babel-plugin-transform-runtime/src/definitions.js

babel polyfill
相当于一个垫片,可以转译所有 ES6 API 和全局对象。
缺点:增加包体,比如仅是使用到一种 ES6 新增 API,他也会增加所有的转移语法。

3.jsx,flow,TypeScript 等插件转译器
@babel/preset-react
当你使用 react 项目时,需要使用此包配合转译
安装:npm install --save-dev @babel/preset-react
引用:在 .babelrc 中添加配置

"presets": ["@babel/preset-react"]

@babel/preset-typescript
当你项目是用 TypeScript 编写时,需要使用此包配合转译
安装:npm install --save-dev @babel/preset-typescript
引用:在 .babelrc 中添加配置

"presets": ["@babel/preset-typescript"]

参考:
https://www.babeljs.cn/docs/configuration
https://blog.csdn.net/weixin_45151873/article/details/118572216
https://zhuanlan.zhihu.com/p/84083454

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

推荐阅读更多精彩内容