.babelrc 中插件和预设的区别

Difference between plugins and presets in .babelrc

情况

所以我有一个 .babelrc 这样的:

{
    "presets": [
        "es2015",
        "stage-2",
        "react"
    ],
    "plugins": [
        "transform-decorators-legacy"
    ]
}

问题

预设和插件有什么区别?我应该使用哪一个来配置 Babel?

tl;博士

预设只是插件的集合。您可以在 plugins 数组中单独包含插件,或在 presets 数组中包含插件集合。如果插件是集合(预设)的一部分,则不必将其单独包含在 plugins.

将 npm 包包含在 package.json 中时也是如此。

预设与插件

Babel 有很多 official and third party plugins. Presets are collections of plugins or as they say:

Presets are sharable .babelrc configs or simply an array of babel plugins.

两者的一个重要区别是plugins are loaded before presets.

预设的插件

最常见的预设是 official ones and the discontinued experimental presets

大多数官方预设包含用于转换 EcmaScript 标准功能的插件,而实验性 (stage-x) 预设包含用于转换未来实验性功能的插件,其标准化工作仍在进行中。这些 experimental/proposal 预设自 Babel 7 以来已弃用。它们有一个 blog entry on the reasons。阅读以下部分以了解它们的工作原理。

当您单击预设时,您可以看到其中包含哪些插件(可能还有其他预设)。如果您通过预设包含插件,则不必单独包含它。当您包含预设的 npm 包时,package.json 也是如此。

弃用提案预设系统

从第 0 阶段(只是一个想法)到第 3 阶段(候选),您拥有更接近标准化的插件集合。因此,当您包含一个预设时,每个具有更高 stage-x 值的预设也会被包含在内。这些预设中包含的插件在每个版本中不断变化,因为它们是一项正在进行的工作,如果插件被拒绝,它们可能会被删除。这就是为什么你需要 transform-decorators-legacy because, decorator transpiling was earlier removed from Babel, although they added it back later.