vite+vue3+antd4项目兼容低版本chrome86+ && chrome68+

51 阅读7分钟

兼容性问题解决方案汇总

一、兼容到chrome86+

1.antd4 向下兼容方案

1、文档流中的样式和位置问题,主入口app.vue添加如下内容, 解决方案:

App组件容易漏,会导致message提示无法显示,需要注意~

import { ConfigProvider, App } from 'ant-design-vue';
import { StyleProvider, legacyLogicalPropertiesTransformer } from 'ant-design-vue/es/_util/cssinjs';
        <StyleProvider
          hash-priority="high"
          :prefix="configProviderPrefixCls"
          :transformers="[legacyLogicalPropertiesTransformer]"
        >
          <a-style-provider
            hash-priority="high"
            :prefix="configProviderPrefixCls"
            :transformers="[legacyLogicalPropertiesTransformer]"
          >
            <App>              
            <RouterView />
            </App>
          </a-style-provider>
        </StyleProvider>

2、  全局弹出、全局提示等脱离文档流的位置问题。 解决方案:

import { App } from 'ant-design-vue';
使用 const { modal } = App.useApp(); 替换Modal.confirm等,message alert 同理
 

 

3、  前缀是antd,没有被prefix前缀处理到的组件位置问题(如画布节点) 解决方案:采用问题一的解决方案,把画布自定义节点包裹一次

4、  使用creatApp或者creatVnode创建的模块,脱离了vue的上下文文档流

解决方案:采用问题一的解决方案,把节点包裹一次

样式及js兼容修改

1.建议初始化配置时在vite.config中加上如下内容:

build:{
    ... 原来的内容,
    // js最低兼容的浏览器版本
    target: ['chrome86', 'edge88', 'firefox78', 'safari14'],
    // 禁用 CSS 代码压缩,防止 top/right/bottom/left 被转换成 inset
     cssMinify: false
 }
 

本地启动报错

1.集成unocss出现报错问题 image.png

 

注意⚠️:   如果使用了unocss或taiwindcss覆盖antd原有的样式会失效,兼容后antd的样式等级会提高。我采取的方法比较笨但可靠,在覆盖的css类名后面添加‘!’,编译后会给unocss或taiwindcss的css后面添加!important。这样能解决!

position导致的样式失效

360极速版position导致的样式失效 如果同时有top:0;left:0,bottom:0;right:0;vite会打包成一个insert:0,但是360极速版不支持该属性加上width:100%和height:100%

二、兼容到chrome68+

在兼容chrome86的基础上添加如下配置

全程基于项目根目录执行操作,核心依赖为 Vite5 官方兼容插件@vitejs/plugin-legacy+ API 补全库core-js@3,所有配置可直接复制使用,按步骤执行即可完成兼容。

前提:Chrome68 支持 ES2017,缺失 ES2018+ 新语法(?.、?? 等)和部分全局 API,兼容核心是语法转译 + 自动 polyfill 注入 + 适配构建目标

步骤 1:安装核心兼容依赖

# npm 安装
npm install @vitejs/plugin-legacy core-js @babel/core -D

步骤 2:配置 browserslist(统一所有工具的兼容目标)

在项目根目录的package.json新增browserslist字段,统一 Vite、Babel、PostCSS 的浏览器兼容规则,仅指定Chrome 68即可,修改后如下:

{
  "name": "your-vue-project", // 你的项目名
  "version": "0.0.0",
  "browserslist": ["Chrome 68"], // 新增这行,统一兼容目标
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },
  // 保留项目原有dependencies、devDependencies等配置...
}

步骤 3:修改 Vite 核心配置(vite.config.js/ts)

这是兼容的核心步骤,修改项目根目录的vite.config.js(ts 项目为vite.config.ts,配置完全一致),完成插件注册 + 构建目标降级 + CSS 适配,直接替换原有配置即可:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import legacy from '@vitejs/plugin-legacy' // 1. 引入legacy兼容插件

// Vite5 核心配置
export default defineConfig({
  plugins: [
    vue(), // Vue3 插件
    // 2. 配置legacy插件,自动转译语法+注入polyfill
    legacy({
      targets: 'Chrome 68', // 明确指定兼容Chrome68(也可读取browserslist)
      polyfills: true, // 开启自动polyfill注入(基于core-js@3)
      renderLegacyChunks: true, // 生成旧浏览器兼容产物
      modernPolyfills: true // 现代浏览器兜底polyfill
    })
  ],
  build: {
    target: 'es2017', // 3. 构建目标降级为Chrome68支持的ES2017(Vite5默认es2020)
    cssTarget: 'chrome68', // 4. CSS适配Chrome68,避免生成不兼容CSS语法
    minify: 'terser', // 可选:用terser压缩,避免新压缩特性导致兼容问题
    terserOptions: {
      compress: { drop_console: false } // 可选:保留console,方便调试
    }
  }
})

步骤 4:Vue3.3.0 兼容兜底(无额外配置,仅 2 个避坑点)

Vue3 本身已放弃 IE 但完全兼容 Chrome68,无需修改任何 Vue 相关配置,只需注意 2 个细节即可:

  1. 代码中避免使用 Vue3 的实验性特性(如defineModel高级用法、props解构的新特性),若使用,legacy 插件会自动转译;
  2. Vue3 模板编译产物为 ES5 级别,Chrome68 可直接解析,无需修改@vitejs/plugin-vue的编译配置。

步骤 5:执行生产构建(兼容逻辑仅对构建生效)

Vite 的 legacy 兼容处理仅在生产构建时生效(开发环境 Chrome68 已支持 ES 模块,可直接运行npm run dev开发,无需额外处理,本地还是无法访问的!!!!!),执行构建命令生成兼容包:

# 生成兼容Chrome68的生产包,输出到项目根目录的dist文件夹
npm run build

构建完成后,dist目录会自动生成 2 类产物,且index.html内置浏览器嗅探逻辑:Chrome68 会自动加载兼容产物 + polyfill,高版本浏览器加载现代产物,无需手动判断。

注意: 本地无法访问,看不到页面呈现,只有部署后才能打开!!!!!!!

步骤 6:Chrome68 兼容性测试(2 种便捷方法,无需安装旧浏览器)

方法 1:Chrome 开发者工具模拟(推荐,最快)

  1. 打开新版 Chrome 浏览器,运行npm run preview启动预览服务,打开项目预览地址;
  2. F12打开开发者工具 → 点击右上角「⋮」→ 更多工具 → 设备模拟;
  3. 左上角设备下拉框选择「自定义」→ 输入Chrome 68,刷新页面即可模拟运行。

方法 2:本地启静态服务测试

  1. 全局安装静态服务工具servenpm install serve -g
  2. 项目根目录执行:serve dist,会生成本地访问地址(如http://localhost:3000);
  3. 在模拟的 Chrome68 中访问该地址,验证页面渲染、按钮点击、接口请求等交互是否正常。

步骤 7:常见兼容问题解决(按需处理)

若测试时出现报错 / 样式错乱,按以下场景针对性解决,均为 Chrome68 兼容的高频问题:

问题 1:第三方依赖未被转译(如 Element Plus/axios 用了 ES2018 + 语法)

Vite5 默认不转译node_modules,需在vite.config.js强制指定转译的依赖,修改后如下:

export default defineConfig({
  // 保留原有配置...
  optimizeDeps: {
    include: ['element-plus', 'axios'] // 按需添加需要转译的第三方依赖
  },
  build: {
    // 保留原有配置...
    commonjsOptions: {
      include: [/element-plus/, /axios/, /node_modules/] // 强制转为CommonJS格式
    }
  }
})

问题 2:个别全局 API 未被 polyfill(如 URLSearchParams/fetch)

Chrome68 已支持大部分 API,若遇到缺失,在 src/main.js/ts 中手动引入即可:

// src/main.js(Vue入口文件)
import 'core-js/es/url-search-params' // 手动注入URLSearchParams polyfill
import 'core-js/es/fetch' // 按需注入fetch polyfill
import { createApp } from 'vue'
import App from './App.vue'

createApp(App).mount('#app')

问题 3:CSS 样式错乱(如高级 CSS 选择器 / 特性)

Chrome68 支持基础 CSS 变量 / Flex 布局,样式问题多为第三方 CSS 用了高级特性,安装postcss-preset-env兜底:

  1. 安装依赖:pnpm add postcss-preset-env -D
  2. 项目根目录新建postcss.config.js,添加配置:
module.exports = {
  plugins: [
    require('postcss-preset-env')({
      browsers: 'Chrome 68', // 适配Chrome68
      features: { 'custom-properties': { preserve: true } } // 保留CSS变量
    })
  ]
}

核心步骤总结

  1. 安装@vitejs/plugin-legacy@5.x + core-js@3 + @babel/core三大核心依赖;
  2. package.json中配置browserslist: ["Chrome 68"]统一兼容目标;
  3. Vite 配置中注册 legacy 插件,降级build.target为 es2017、cssTarget为 chrome68;
  4. 执行npm run build生成兼容包,通过 Chrome 开发者工具模拟 Chrome68 测试;
  5. 按需解决第三方依赖转译、手动 polyfill、CSS 适配等问题。