升级Babel7踩坑

562 阅读2分钟

总结

  • npx babel-upgrade --write自动更换依赖中的Babel版本
  • 更换babelrc配置
  • 更换eslint配置

原始配置

// .babelrc
{
  "presets": [
  // 用来在vue中写jsx的
    ["@vue/babel-preset-jsx"], // @babel/transform-vue-jsx 支持的是Babel6+
    [
      "@babel/env",
      {
        "targets": {
          "chrome": 52,
          "browsers": ["last 2 versions", "safari 7"]
        },
        "modules": false,
        "useBuiltIns": "usage" // polyfill 由于@babel/polyfill已经快被废弃,该选项依赖babel/polyfill,所以不建议用此选项
      }
    ]
  ],
  "sourceType": "unambiguous", // 项目中有些地方import跟module.exports混用了,webpack2不支持 但是配置了还是无效
  "plugins": [
    [
      "@babel/plugin-transform-runtime",
      {
        "corejs": false, // corejs 是一个给低版本的浏览器提供接口的库,如 Promise, map, set 等。设置false不会对polyfill进行处理 如果不是开发js库 常规的业务设置false
        "helpers": true, // 辅助函数是否抽取出来,避免重复
        "regenerator": true, // 同babel-plugin-transform
        "useESModules": true // 使用 es modules helpers, 减少 commonJS 语法代码
      }
    ],
    ["@babel/plugin-syntax-dynamic-import"],
    ["@babel/plugin-transform-modules-commonjs"], // 解决import跟module.exports混用的问题
    ["@babel/plugin-proposal-nullish-coalescing-operator"] 坑爹,虽然官方说babel-preset-env支持了 但是其实并不 
    
    // As I know so far that babel preset-env won't support stage-x plugin. This 
    // babel/plugin-proposal-nullish-coalescing-operator seems to be at stage-4
    // for now which means you have to keep using this as plugin.
    
  ],
  "comments": false,
  "env": {
    "test": {
      "plugins": ["istanbul"]
    }
  }
}
// eslintrc.js
  parserOptions: {
    // eslint7才支持es2020 7.5支持非空运算符
    ecmaVersion: 2020,
    "sourceType": "module",
    ecmaFeatures: {
      experimentalObjectRestSpread: true
      //jsx: true
    },
  },

修正版本

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "chrome": 52,
          "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
        },
        "modules": false,
      }
    ]
  ],
  "plugins": [
    [
      "@babel/plugin-transform-runtime",
      {
        "corejs": {
          "version": 3,
          "proposals": true // 引入所有该版本的提案 注意是提案(建议)不是标准
        }, // 关闭其对polyfill的处理 
        "helpers": true, // 辅助函数是否提取
        "regenerator": true, // 同babel-plugin-transform
        "useESModules": true // 使用 es modules helpers, 减少 commonJS 语法代码
      }
    ]
  ]
}

踩坑

1.可选链插件需要升级Babel7才能用。。 2.升级的时候如果项目存在stage-xxx 自动升级会安装一堆该阶段的语法插件 3.usebuiltIns已经不被推荐了,如果使用它需要结合配置core-js