使用@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'],
  }),
  ],
})
打包运行结果
相关推荐
沿着路走到底16 小时前
JS事件循环
java·前端·javascript
子春一216 小时前
Flutter 2025 可访问性(Accessibility)工程体系:从合规达标到包容设计,打造人人可用的数字产品
前端·javascript·flutter
白兰地空瓶16 小时前
别再只会调 API 了!LangChain.js 才是前端 AI 工程化的真正起点
前端·langchain
jlspcsdn17 小时前
20251222项目练习
前端·javascript·html
行走的陀螺仪18 小时前
Sass 详细指南
前端·css·rust·sass
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ18 小时前
React 怎么区分导入的是组件还是函数,或者是对象
前端·react.js·前端框架
LYFlied18 小时前
【每日算法】LeetCode 136. 只出现一次的数字
前端·算法·leetcode·面试·职场和发展
子春一218 小时前
Flutter 2025 国际化与本地化工程体系:从多语言支持到文化适配,打造真正全球化的应用
前端·flutter
QT 小鲜肉18 小时前
【Linux命令大全】001.文件管理之file命令(实操篇)
linux·运维·前端·网络·chrome·笔记
羽沢3119 小时前
ECharts 学习
前端·学习·echarts