首页/文章/javascript

兼容性问题

2025-07-28
2242 字约 8 分钟
...

浏览器兼容性问题是什么?

浏览器兼容性问题通常是指网页或 Web 应用在不同浏览器或版本中表现不一致的问题。说白了无非就是 css不兼容,JS Api在旧版本浏览器中不兼容。

解决思路

  1. 明白目标浏览器范围
  2. 找个插件将现代 JS 转到 ES5
  3. 处理一下CSS的兼容性问题

解决方案

  1. 通过定义 .browserslistrc 明确目标浏览器范围
  2. 使用 Babel 将现代 JS 转到 ES5
  3. 使用 Autoprefixer 给 CSS 加厂商前缀

好了,开搞

.browserslistrc文件是什么

.browserslistrc 文件是一个配置文件,用于定义目标浏览器和Node.js版本的兼容性列表。这个文件被多个前端工具链和库所使用,如Babel、Autoprefixer、ESLint等,可以帮助我们确定需要转译或添加兼容性前缀的JavaScript和CSS代码版本。通过配置 .browserslistrc,我们可以精确地控制代码应该兼容哪些浏览器和设备,从而优化构建输出和减少最终包的大小。

.browserslistrc文件中可以配置的内容

  • ‌浏览器名称和版本‌:例如,last 2 Chrome versions 表示最新的两个Chrome浏览器版本。
  • ‌市场份额‌:如 > 1% in US 表示在美国市场份额超过1%的浏览器。
  • ‌年份‌:since 2017 表示自2017年以来发布的所有浏览器版本。
  • ‌特定浏览器‌:not IE 11 表示不包括IE 11浏览器。

个人项目中使用.browserslistrc配置

在个人日常办公项目中 .browserslistrc 文件配置如下:

> 0.2%
last 2 versions
Firefox ESR
not dead
IE 11

这个配置的含义是:

  • 支持全球使用率超过0.2%的浏览器。
  • 支持最新的两个浏览器版本。
  • 支持Firefox的Extended Support Release(ESR)版本。
  • 排除所有已经不被官方支持(dead)的浏览器。
  • 额外包含IE 11浏览器,尽管它可能不在其他条件内

Babel是什么

Babel 是一个广泛使用的 JavaScript 编译器/转译器,其核心作用是将 高版本 JavaScript(如 ES6+)转换为向后兼容的低版本代码(如 ES5),以确保代码能在旧版浏览器或环境中正常运行。

Babel的主要作用

1. 语法转换(Syntax Transformation)

将现代 JavaScript 语法(如 let/const、箭头函数、类、模板字符串、解构赋值等)转换为等价的 ES5 语法,以便在不支持新特性的浏览器中运行。

2. Polyfill 填充新 API

通过插件(如 @babel/polyfill 或 core-js),为旧环境提供对新增全局对象(如 Promise, Array.from, Map, Set)的支持。

3. 按需转换(基于目标环境)

结合 .browserslistrc 配置,@babel/preset-env 可根据指定的目标浏览器自动决定哪些特性需要转换,哪些可以保留原样。

4. 支持 TypeScript 和 JSX

Babel 提供了对 TypeScript(通过 @babel/preset-typescript)和 React 的 JSX 语法(通过 @babel/preset-react)的解析与转换能力,无需依赖其他编译工具。

5. 插件化架构,高度可扩展

Babel 支持丰富的插件生态,开发者可以自定义语法转换规则,比如:

  • 按需引入 polyfill(@babel/plugin-transform-runtime)
  • 移除调试代码(@babel/plugin-transform-remove-console)
  • 支持装饰器、私有属性等实验性语法

@babel/preset-env的核心配置

@babel/preset-env 的参数项数量很多,但大部分我们都用不到。我们只需要重点掌握四个参数项即可:targets、useBuiltIns、modules 和 corejs。

@babel/preset-env 的 targets 参数

该参数项的写法和.browserslistrc 配置是一样的,主要是为了定义目标浏览器。如果我们对 targets 参数进行了设置,那么就不会使用 .browserslistrc 配置了,为了减少多余的配置,我们推荐使用 .browserslistrc 配置。

@babel/preset-env 的 useBuiltIns 参数

useBuiltIns 项取值可以是usage、 entry 或 false。如果该项不进行设置,则取默认值 false。

  • 设置成 false 的时候会把所有的 polyfill 都引入到代码中,整个体积会变得很大。
  • 设置成 entry 则是会根据目标环境引入所需的 polyfill,需要手动引入;
  • 设置成 usage 则是会根据目标环境和代码的实际使用来引入所需的 polyfill。 此处我们推荐使用:useBuiltIns: usage 的设置。

@babel/preset-env 的 corejs 参数

该参数项的取值可以是 2 或 3,没有设置的时候取默认值为 2。这个参数只有 useBuiltIns 参数为 usage 或者 entry 时才会生效。在新版本的Babel中,建议使用 core-js@3。

@babel/preset-env 的 modules 参数

指定模块的输出方式,默认值是 "auto",也可以设置为 "commonjs"、"umd"、"systemjs" 等。

个人项目中使用Babel的配置

在个人日常办公项目中 .babel.config.js 文件配置如下:

module.exports = {
  plugins: [
    
    () => ({
      visitor: {
        MetaProperty(path) {
          path.replaceWithSourceString('process');
        },
      },
    })
  ],
  presets: [
    [
      '@babel/preset-env', {
        
        useBuiltIns: "usage", 
        corejs: 3
      }
    ],
    '@babel/preset-typescript'
  ],
};

Autoprefixer 的使用

在vite.config.ts文件中css的部分,添加 autoprefixer 的配置。

css: {
  postcss: {
    plugins: [
      postCssPxToRem({
        
        rootValue: 37.5,
        propList: ['*'],
      }),
      autoprefixer({
        overrideBrowserslist: [
          'Android 4.1',
          'iOS 7.1',
          'ff > 31',
          'Chrome > 69',
          'ie >= 8',
          '> 1%'
        ]
      }),
    ],
  },
},

总结

主要通过配置 .browserslistrc 明确目标浏览器范围,使用 Babel 将现代 JS 转到 ES5,主要用到的插件是 @babel/preset-env ,最后再使用 Autoprefixer 插件给 CSS 加厂商前缀。

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
javascript2026-02-24
navigator.sendBeacon全指南
在前端开发中,埋点系统是必不可少的一环。我们经常需要在用户 关闭页面 、 刷新 或 跳转路由 时,向服务器发送最后一条统计数据(比如用户停留时长、页面跳出率)。 但这看似简单的需求,在实现时却危机四伏:请求发不出去?页面跳转卡顿?今天我们就来聊聊这个问题的终极解决方案 —— 。 一、 痛点与传统方案的挣扎 场景还原 当用户点击关闭按钮时,浏览器会触发生命周期事件( 或 )。如果我们直接使用普通的异步 AJAX ( 或 ) 发送请求,浏览...
学习
javascript2025-11-02
理解浏览器事件系统,从用户点击到事件对象的完整旅程
深入理解浏览器事件系统:从用户点击到事件对象的完整旅程 “当我点击页面按钮时,背后发生了什么?为什么回调函数能收到一个包含丰富信息的event对象?今天,让我们一起揭开浏览器事件系统的神秘面纱。” 一个令人困惑的现象 作为前端开发者,我们每天都在写这样的代码: 这段代码如此熟悉,以至于我们很少停下来思考:​ ​这个 对象到底从哪里来?它为什么能知道点击的精确坐标?为什么能识别是哪个元素被点击了?​ ​ 更神奇的是,当我们手动创建事件时:...
学习
javascript2025-10-01
实现大文件上传全流程详解
在日常开发中,大文件上传是个绕不开的坎——动辄几百 MB 甚至 GB 级的文件,直接上传不仅容易超时,还会让用户体验大打折扣。最近我用 Vue+Express 实现了一套完整的大文件上传方案,支持分片上传、断点续传、秒传和手动中。 一、先看效果:我们要实现什么? 先上核心功能清单,确保大家明确目标,知道我们要解决哪些实际问题: 大文件分片上传 :将文件切成固定大小的小片段分批上传,避免单次请求超时 秒传 :服务器已存在完整文件时,直接返...
学习
javascript2025-09-18
JavaScript 的多线程能力:Worker
如果你写过一些计算量稍大的 JavaScript 代码,比如图像处理、大量数据排序或者复杂的算法,你几乎肯定遇到过浏览器“卡死”的现象。点击页面没反应,动画也停了,就像整个世界都静止了。 这就是主线程被阻塞的典型后果。因为主线程既要负责执行 JavaScript,又要负责渲染页面、响应用户操作,一旦它被繁重的计算任务占满,就无暇顾及其他,用户体验便直线下降。 这个问题的根源,正是“主线程是单线程的”。那么,如何解决呢? 答案很简单:把这...
学习面试
javascript2025-09-15
一张 8K 海报差点把首屏拖垮
你给后台管理系统加了一个「企业风采」模块,运营同学一口气上传了 200 张 8K 宣传海报。首屏直接飙到 8.3 s,LCP 红得发紫。 老板一句「能不能像朋友圈那样滑到哪看到哪?」——于是你把懒加载重新翻出来折腾了一轮。 解决方案:三条技术路线,你全踩了一遍 1\. 最偷懒:原生 一行代码就能跑,浏览器帮你搞定。 🔍 关键决策点 2020 年后现代浏览器全覆盖,IE 全军覆没。 必须写死 ,否则 CLS 会抖成 PPT。 适用场景...
学习
javascript2025-09-10
🚀 Web Worker让你的应用丝滑
🌟 引言 在日常的前端开发中,你是否遇到过这样的困扰: 大数据处理时页面卡死 :处理几万条数据时,页面直接卡成PPT,用户点击毫无反应 复杂计算阻塞UI :图片处理、数据分析等计算密集型任务让整个应用假死 文件上传/下载卡顿 :大文件操作时,其他功能完全无法使用 实时数据处理性能差 :WebSocket接收大量数据时,页面渲染严重滞后 今天分享6个Web Worker的核心技巧,让你的应用告别卡顿,用户体验丝滑如德芙! 💡 核心技巧...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录