使用@rollup/plugin-babel 在低版本浏览器中运行ES2020新语法

前言

vite4 + vue3 构建的一个项目,在谷歌75浏览器上跑,然后渺小的我在上面写了ES2020新语法:可选链操作符(?.)、空值合并运算符(??),然后就在谷歌75浏览器上报错了。

预期结果

在代码使用ES2020新语法并且在谷歌75浏览器上运行不报错。

问题展示

xml 复制代码
<template>
  <button @click="fun">
    按钮
  </button>
</template>

<script setup>
const fun = () => {
  let a = {
    name: 'joke',
    age: 30,
  }
  let b = a?.name ?? 'tom';
  console.log(b)
}
</script>

<style scoped>

</style>

了解vite

解决方案

我在网上到了2个兼容方案的插件

不过我在用vite-plugin-babel总是出现一些奇奇怪怪的问题,然后我就又尝试了@rollup/plugin-babel

实践

首先安装 @rollup/plugin-babel 、 预设兼容包 @babel/preset-env、还有core-js

js 复制代码
npm install --save-dev @rollup/plugin-babel @babel/preset-env
npm install core-js@3 --save
js 复制代码
// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import babel from '@rollup/plugin-babel';
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue(),
    {
      ...babel({
        // // 可选: 'bundled', 'runtime', 'inline', 'external'
        babelHelpers: 'bundled',
        // 处理那些文件
        include: [/\.vue$/, /\.ts$/, /\.tsx$/, /\.jsx$/, /\.js$/],
        // 需要处理的文件类型
        extensions: ['.vue', '.ts', '.js', '.tsx', '.jsx'],
        presets: [
          [
            '@babel/preset-env',
            {
              useBuiltIns: 'usage',
              corejs: 3,
              targets: {
                chrome: '75',
              },
              modules: false,
            },
          ],
        ],
      }),
    },
  ],
})
运行结果

打包

然后我就尝试着打包部署到线上看看会不会也有这个问题,结果又报错了

解决打包到线上报错问题

安装 @vitejs/plugin-legacy

js 复制代码
npm install --save-dev @vitejs/plugin-legacy@4
js 复制代码
// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import babel from '@rollup/plugin-babel';
import legacy from '@vitejs/plugin-legacy';

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue(),
  {
    ...babel({
      babelHelpers: 'bundled',
      include: [/\.vue$/, /\.ts$/, /\.tsx$/, /\.jsx$/, /\.js$/],
      extensions: ['.vue', '.ts', '.js', '.tsx', '.jsx'],
      presets: [
        [
          '@babel/preset-env',
          {
            useBuiltIns: 'usage',
            corejs: 3,
            targets: {
              chrome: '75',
            },
            modules: false,
          },
        ],
      ],
    }),
  },
  legacy({
    targets: ['defaults', 'not IE 11', 'chrome >= 75'],
  }),
  ],
})
打包运行结果
相关推荐
Ticnix18 分钟前
ECharts初始化、销毁、resize 适配组件封装(含完整封装代码)
前端·echarts
纯爱掌门人21 分钟前
终焉轮回里,藏着 AI 与人类的答案
前端·人工智能·aigc
twl25 分钟前
OpenClaw 深度技术解析
前端
崔庆才丨静觅28 分钟前
比官方便宜一半以上!Grok API 申请及使用
前端
星光不问赶路人37 分钟前
vue3使用jsx语法详解
前端·vue.js
天蓝色的鱼鱼40 分钟前
shadcn/ui,给你一个真正可控的UI组件库
前端
布列瑟农的星空44 分钟前
前端都能看懂的Rust入门教程(三)——控制流语句
前端·后端·rust
Mr Xu_1 小时前
Vue 3 中计算属性的最佳实践:提升可读性、可维护性与性能
前端·javascript
jerrywus1 小时前
我写了个 Claude Code Skill,再也不用手动切图传 COS 了
前端·agent·claude
玖月晴空1 小时前
探索关于Spec 和Skills 的一些实战运用-Kiro篇
前端·aigc·代码规范