babel.config.json配置 (兼容IE)

190 阅读2分钟
@babel/polyfill

babel7.4.0之后是弃用掉的,然后现在由core-js替换:

//import "@babel/polyfill"; //之前的写法
import "core-js/stable";
import "regenerator-runtime/runtime";

这样会有全局变量被污染的问题(通过向全局对象和内置对象的prototype上添加方法来实现的)

core-js&core-js-pure

core-js其实就是为了能让你代码中的一些api能够在低版本浏览器上运行,相当于是在你的代码跟浏览器中加入了一个垫片,所以在babel7.4.0之后所有的polyfill操作都依赖core-jscore-js-purecore-js的另外一个版本,可以不污染全局变量,比如我们的@babel/plugin-transform-runtime插件就是依赖的core-js-pure

@babel/runtime

@babel/runtime@babel/runtime-corejs2@babel/runtime-corejs3这几个都叫“@babel/runtime”,只是每一个对应的实现不一样,都是提供给@babel/plugin-transform-runtime插件做依赖,@babel/plugin-transform-runtime插件会根据corejs的配置做不通的runtime依赖

@babel/plugin-transform-runtime 和 @babel/preset-env

@babel/preset-env包含了一些基本es语法转换的插件(箭头函数、类转换等等),同时还支持polyfill,有usageentry模式,但是preset-env添加polyfill会像之前使用@babel/polyfill一样,会污染全局变量。

@babel/plugin-transform-runtime主要是利用@babel/runtime提取了一些公共的babel帮助函数,同时也支持polyfill的添加,添加的polyfill都是以一个局部变量的形式引入,不会污染全局变量。

如果你做的是一个三方库,然后需要被别人依赖,那么建议使用@babel/plugin-transform-runtime来引入polyfill,因为你要尽可能的专注于做自己的事,而不是说去影响别人,语法转换可以使用preset-env预设,比如以下配置(dependencies引入@babel/runtime-corejs3即可):

即 @babel/preset-env + @babel/plugin-transform-runtime + @babel/runtime-corejs3

    {
      "presets": ["@babel/preset-env"],
      "plugins": [
        [
          "@babel/plugin-transform-runtime", // @babel/plugin-transform-runtime目前不支持设置targets
          {
            "corejs": { "version": 3 } 
          }
        ]
      ]
    }

如果你做的是一个普通的业务项目的话,可以用preset-env来转换语法和polyfill,然后再利用@babel/plugin-transform-runtime来引入helpers(节省代码大小)generator(按需加载regenerator-runtime 插件)做到代码重复利用,比如以下配置( dependencies里需引入 @babel/runtime", "core-js",):

即:@babel/preset-env + core-js@3 + regenerator-runtime

因为在rollup.config.js里配置的babelHelpersruntime,所以通过插件的方式引入regenerator-runtime,如果设置的是bundled则不需要`

image.png

    {
      "presets": [
        [
          "@babel/preset-env",
          {
            "corejs": { "version": 3 } ,
            "useBuiltIns": "usage",
            // @babel/preset-env可以配置targets 需要支持全球使用率超过 0.25% 的浏览器
            "targets": [
              "> 0.25%"
            ]
          }
        ]
      ],
      "plugins": [
        [
          "@babel/plugin-transform-runtime", 
          {
             //不使用 `core-js` 来提供 polyfill
            "corejs": false
          }
        ]
      ],
    }

如果是bundled则是这样的:

    {
      "presets": [
        [
          "@babel/preset-env",
          {
            "corejs": { "version": 3 } ,
            "useBuiltIns": "usage",
            "targets": [
              "> 0.25%"
            ]
          }
        ]
      ],
    }

也不一定都是这几种方式写死,还是要根据自己项目需要灵活配置,找到自己项目最合适的就可以了