使用@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'],
  }),
  ],
})
打包运行结果
相关推荐
hedley(●'◡'●)24 分钟前
基于cesium和vue的大疆司空模仿程序
前端·javascript·vue.js·python·typescript·无人机
qq5_81151751526 分钟前
web城乡居民基本医疗信息管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
百思可瑞教育27 分钟前
构建自己的Vue UI组件库:从设计到发布
前端·javascript·vue.js·ui·百思可瑞教育·北京百思教育
百锦再27 分钟前
Vue高阶知识:利用 defineModel 特性开发搜索组件组合
前端·vue.js·学习·flutter·typescript·前端框架
CappuccinoRose1 小时前
JavaScript 学习文档(二)
前端·javascript·学习·数据类型·运算符·箭头函数·变量声明
这儿有一堆花1 小时前
Vue 是什么:一套为「真实业务」而生的前端框架
前端·vue.js·前端框架
全栈前端老曹1 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
NCDS程序员2 小时前
v-model: /v-model/ :(v-bind)三者核心区别
前端·javascript·vue.js
夏幻灵2 小时前
CSS三大特性:层叠、继承与优先级解析
前端·css
小杨同学呀呀呀呀2 小时前
Ant Design Vue <a-timeline>时间轴组件失效解决方案
前端·javascript·vue.js·typescript·anti-design-vue