首页/文章/javascript

兼容性问题

2025-07-28
22428 分钟
...

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

浏览器兼容性问题通常是指网页或 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 项取值可以是usageentryfalse。如果该项不进行设置,则取默认值 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的核心技巧,让你的应用告别卡顿,用户体验丝滑如德芙! 💡 核心技巧...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录