babel6使用ES2020最新js语法

babel6使用ES2020最新js语法

Babel 6 原本是不支持 ES2020 语法,因为它是在 Babel 7 中引入的。如果您想使用 ES2020 语法,您需要将 Babel 6 升级到 Babel 7 或更高版本(推荐),当然也可以在bebel6中安装支持某个语法的plugin,比如你想使用 ES2020 中的可选链操作符,就要配置使用 @babel/plugin-proposal-optional-chaining。

ES2020新增语法

这里只列出我们最常用,也最好用的语法

1. 可选链操作符

javascript 复制代码
const obj = {};

// 老语法
let second = obj && obj.first && obj.first.second;

//es2020可选链语法
let second = obj?.first?.second;

2. 空位合并运算符

javascript 复制代码
// 老语法
//这两种方式有个明显的弊端,它都会覆盖所有的假值,如(0, '', false),这些值可能是在某些情况下有效的输入
let c = a ? a : b // 方式1
let c = a || b // 方式2

//es2020
// ??的左侧运算符求值为 undefined 或 null,才返回其右侧默认值
let c = a ?? b;
// 等价于let c = a !== undefined && a !== null ? a : b;

方式一: 升级babel7(推荐)

1. 使用Babel升级工具

不要手动升级,因为不同babel版本依赖不同的node和webpack版本,借助工具可以自动匹配对应版本.比如我项目中使用的是webpack4和node12,工具就会自动安装babel-loader8版本,不会安装最新的v9.

bash 复制代码
# 不安装,直接使用npx来执行
npx babel-upgrade --write

# 或是安裝 babel-upgrade 在 global 並執行
npm i -g babel-upgrade
babel-upgrade --write

执行命令后, package.json 中移除了旧版本的依赖,自动新增了新版依赖,

json 复制代码
+    "@babel/core": "^7.0.0",
+    "@babel/plugin-proposal-class-properties": "^7.0.0",
+    "@babel/plugin-proposal-object-rest-spread": "^7.0.0",
+    "@babel/plugin-syntax-dynamic-import": "^7.0.0",
+    "@babel/plugin-syntax-jsx": "^7.0.0",
+    "@babel/plugin-transform-runtime": "^7.0.0",
+    "@babel/preset-env": "^7.0.0",
-    "babel-core": "^6.25.0",
-    "babel-loader": "^7.1.1",
-    "babel-plugin-syntax-dynamic-import": "^6.18.0",
-    "babel-plugin-syntax-jsx": "^6.18.0",
-    "babel-plugin-transform-class-properties": "^6.24.1",
-    "babel-plugin-transform-object-rest-spread": "^6.26.0",
-    "babel-plugin-transform-runtime": "^6.23.0",
+    "babel-loader": "^8.0.0",
-    "babel-preset-env": "^1.6.1",

2. 删除node_modules,重新安装依赖

bash 复制代码
# 删除node_module
rm -rf node_modules
# 重新安装
npm i

3. 修改配置文件.babelrc

json 复制代码
// 原.babelrc文件
{
    "presets": [
      ["env", {
        "loose": true,
        "debug": false,
        "useBuiltIns": true,
        "targets": {
          "browsers": [ "ie > 8", "last 2 version", "safari >= 9" ]
        },
        "production": {
          "plugins": ["transform-remove-console"]
        }
      }]
    ],
    "plugins": [
      [ "transform-runtime", {
        "helpers": false,
        "polyfill": false,
        "regenerator": true } ],
      [ "transform-class-properties", { "spec": true } ],
      [ "transform-object-rest-spread", { "useBuiltIns": true } ],
      [ "transform-vue-jsx" ],
      [ "syntax-dynamic-import" ]
    ],
    "comments": false
  }

// 修改后.babelrc文件(其他所有配置都不需要了)
//@babel/preset-env 预设,能根据目标环境自动决定要使用的插件和转换规则,而无需手动安装和配置单个插件
{
  "presets": [["@babel/preset-env"]]
}

4. 修改webpack配置文件

json 复制代码
module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: {
          hotReload: !isProduction
        },
      },
      {
        test: /\.js$/,
        exclude: /(node_modules|bower_components)/,
        use: [
          {
            loader: 'babel-loader',
            options: {
              cacheDirectory: true,
              cacheIdentifier: 'babel-loader',//修改这个位置,原来值为'true'修改为'babel-loader'
            },
          },
        ],
      }
    ],
  },

方式二: 安装指定语法plugin

1. 可选链操作符

1.安装
bash 复制代码
npm i -D @babel/plugin-proposal-optional-chaining
2.配置.babelrc
json 复制代码
{
    "presets": [
      ["env"]
    ],
    "plugins": [
      [ "transform-runtime"],
      [ "transform-class-properties"],
      [ "@babel/plugin-proposal-optional-chaining"],//配置
      [ "transform-object-rest-spread"],
      [ "transform-vue-jsx" ],
      [ "syntax-dynamic-import" ]
    ],
    "comments": false
  }

2. 空位合并运算符

1.安装
bash 复制代码
npm i -D @babel/plugin-proposal-nullish-coalescing-operator
2.配置.babelrc
json 复制代码
{
    "presets": [
      ["env"]
    ],
    "plugins": [
      [ "transform-runtime"],
      [ "transform-class-properties"],
      [ "@babel/plugin-proposal-nullish-coalescing-operator"],//配置
      [ "@babel/plugin-proposal-optional-chaining"],
      [ "transform-object-rest-spread"],
      [ "transform-vue-jsx" ],
      [ "syntax-dynamic-import" ]
    ],
    "comments": false
  }

通过插件方式,也可以实现使用es2020中的新语法,但更建议第一种方式.

相关推荐
程序员Sunday7 小时前
JavaScript 事件循环面试题,宏任务与微任务怎么执行|Sunday面试指南
开发语言·javascript·面试·校招·事件循环·程序员sunday
默_笙8 小时前
🌊 向量库和 ES 都查不出"关系",我只好给奶茶建了一张人脉网
前端·javascript
思无邪669 小时前
用 AI 做 JS 逆向:从抓包到复现的完整方法论
开发语言·javascript·人工智能
福兮说10 小时前
浏览器里把 iPhone 的 HEIC 转成 JPG:Chrome 解不开、转完大了七成、拍摄时间全丢,六个坑实测
前端·javascript·图像处理·chrome·ios·iphone·heic
可乐鸡翅yeah_11 小时前
video.js 集成 hls.js 开发 M3U8 播放器,新手高频踩坑
开发语言·前端·javascript·后端·ecmascript·m3u8·音视频在线播放
用户1179536547813 小时前
TRAE vs Claude Code 性能对比:从代码生成、多文件重构到底层吞吐,谁更适合你的日常开发?
javascript
kill52214 小时前
useRef
前端·javascript·react.js
米多科技14 小时前
我做了一个 3D 虚拟世界基底,在上面再搭 3D 世界或元宇宙,事半功倍
javascript·人工智能·github
霍营_托尼15 小时前
纯前端播 40GB 本地视频?我把浏览器改造成了「磁盘流式」播放器
前端·javascript·音视频开发
西柚小萌新15 小时前
【LLM&&AI应用开发 八股文】--4.2.Agent智能体(中)
前端·javascript·react.js