项目css / js的兼容性next项目实践处理

之前写过一篇,但是没有css的处理,但是那一篇有几个文章蛮好的https://blog.csdn.net/SaRAku/article/details/144704916

css兼容性和js兼容性

1. 确定需要兼容的版本

先确定你们的兼容性版本,我们的兼容性以APP H5的兼容版本为最低兼容性,如下:

ios >= 13
android >= 9
chrome >= 107

2. 在项目根目录创建.browserslistrc文件

配置大概是这样

ios >= 13
android >= 9
chrome >= 107

配置完了可以跑一下npx browserslist试试。
在这里插入图片描述

3. js的兼容性问题比较好的做法就是引入polyfill

针对某个API引入polyfill。

看看这个网站:https://cdnjs.cloudflare.com/polyfill/。想生成某个API的就直接生成,然后通过CDN引入垫片,这样可以最小粒度地控制引入的SDK。

使用babel-preset-env做自动化的收集生成垫片处理。

这个官网写的很清晰了:https://www.babeljs.cn/docs/babel-preset-env

默认情况下,@babel/preset-env 将使用 browserslist 配置文件

配置一般都默认,但是useBuiltIns配置usage

{"presets": [["@babel/preset-env",{"useBuiltIns": "usage","corejs": 3,"modules": false // 保留ES模块语法,便于Tree Shaking// "debug": true // 可以开发环境显示polyfill信息调试}]],
}

Babel 会自动检测你代码中用到的 ES 新特性,只为用到的特性自动按需引入 core-js 的 polyfill。(一定要设置corejs:3的版本)
而且如果配置 useBuiltIns: "entry" ,需要在入口文件手动引入 core-js.

坑点
  1. 注意babel/preset-env和core-js的版本问题。一开始我想验证Object.hasOwn这个API的polyfill效果,然后就在代码里写了几个Object.hasOwn,结果咋都没搜到has-own文件被引入,查了一下,这个API是ES2022引入的(好像是),总之非常新,所以core-js的版本低于3.xxx(忘记多少了)版本的话,就无法对这个API polyfill,好家伙。
  2. next配置。
    PS:结果我自己在next/babel的配置里做了好多次都不行,也不知道是不是包版本的原因,一开始代码是这样,我甚至为了强化效果直接把targets配上了,结果生成出来的效果还是没有polyfill。
    在这里插入图片描述
    一气之下(不是),我直接在外面引入preset-env,像下面这样,忽然就行了
    在这里插入图片描述
    build的时候打开debug,控制台会有提示:
    在这里插入图片描述
浏览器API需要特殊处理

Babel/preset-env 只负责JS还有ES6的转换,不处理浏览器的 DOM/Web API,比如 IntersectionObserver、fetch、requestIdleCallback 等等,Babel 无法兼容自动引入 polyfill。

如何判断env-preset能不能使用?

  1. (有点麻烦)通过core-js的文档查:https://github.com/zloirock/core-js
  2. 可以查 MDN 文档,看该 API 是否属于 ECMAScript 标准。
  3. 一般来说,只要是 window.xxx 或 document.xxx 相关的 API,Babel preset-env 都不会自动 polyfill。

推荐做法:

if ('IntersectionObserver' in window) {// 使用原生API
} else {// 加载polyfillimport('intersection-observer');
}
产物生成

可以注意下生成的polyfill文件,在build产物中找一下
在这里插入图片描述

4. css的兼容性问题

配置postcss-loader(postcss是一个转换css语法的工具),还有autoprefixer自动加不同浏览器的前缀,cssnano压缩生成的css。
装这些依赖yarn add postcss postcss-preset-env cssnano
(其实也可以不用写browsers,会自动抓取.browserslist的内容。)

// postcss.config.js
module.exports = {plugins: [require('postcss-preset-env')({// browsers: ['ios >= 13', 'android >= 9', 'chrome >= 107'],stage: 3, // 稳定阶段的CSS特性features: {'nesting-rules': true, // 启用嵌套规则'custom-properties': {preserve: false, // 完全转换CSS变量},'media-query-ranges': true, // 支持媒体查询范围语法'logical-properties-and-values': true, // 逻辑属性支持},autoprefixer: {grid: 'no-autoplace', // Chrome 107+ 不需要grid前缀// overrideBrowserslist: ['ios >= 13', 'android >= 9', 'chrome >= 107'] 自动读取,不用配}// debug: true, // 输出转换日志}),require('cssnano')({preset: 'default'})]
}/** 
* grid: 'no-autoplace'
* false:完全不处理 Grid 前缀(不推荐)
* true:处理所有 Grid 相关前缀(包括 IE 的旧语法)
* 'no-autoplace':只处理不涉及自动布局的 Grid 属性
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 + Vite 中使用 Lodash-es 的防抖 debounce 详解

Vue3 Vite 中使用 Lodash-es 的防抖(debounce)详解 在 Vue3 Vite 项目中,debounce 是 lodash-es 中最常用的功能之一,它可以帮助我们优化高频事件的处理。下面我将详细讲解 debounce 的使用方法,并提供一个完整的示例。 Debounce 核心概念…

MySQL--慢查询日志、日志分析工具mysqldumpslow

mysqldumpslow 常用参数: -s,是order的顺序----- al 平均锁定时间-----ar 平均返回记录时间-----at 平均查询时间(默认)-----c 计数-----l 锁定时间-----r 返回记录-----t 查询时间-t,是top n的意思,即为返…

C++课设:实现图书馆借阅记录系统(支持书籍管理、借阅功能、超期检测提醒)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、系统概述与设计思路1. 系统核心功能…

矩阵和向量范数的区别分析

文章目录 1. 研究对象本质差异2. 运算和作用方式不同3. 应用需求不同4. 数学性质和理论体系不同5. 几何直观不同6. 范数定义区别7. 范数计算方式区别8. 范数几何意义区别9. 范数相容性区别总结 1. 研究对象本质差异 向量本质:向量是具有大小和方向的一维有序数组&a…

HTMLCSS 学习总结

目录 ​​​一、HTML核心概念​​ ​​三大前端技术作用​​ ​​HTML基础结构​​ 开发工具:VS Code 专业配置​​​​安装步骤​​: ​​二、HTML标签大全(含表格)​​ ​​三、CSS核心技术​​ 1. 三种引入方式对比 2.…

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包

通过Cline使用智能体

文章目录 1、VS Code配置2、Cline使用2.1 工作模式2.2 MCP服务2.3 Cline支持的服务 3、案例一&#xff1a;天气查询项目3.1 需求说明3.2 申请高德API Key3.3 实操&#xff1a;向Cline下达命令 4、案例二&#xff1a;双城天气对比项目4.1 需求说明4.2 实操 Cline是VS Code的插件…

「混合开发」H5与原生App交互流程方案全面解析

目录 内嵌H5调用iOS内的方法 1. 背景 2. 解决方案 2.1 创建WebView 2.2 注册原生方法 2.3 H5调用原生方法 3. 序列图 H5 调用 Android&#xff1a;详细指南 整体流程 每一步的详细说明 步骤1&#xff1a;在Android项目中设置WebView 步骤2&#xff1a;定义JavaScri…

webpack打包vue项目

要在 Vue 项目中使用 Webpack 进行打包&#xff0c;通常有几种不同的方式来设置你的项目。以下是基本步骤&#xff1a; 1. 使用 Vue CLI 创建项目&#xff08;推荐&#xff09; Vue CLI 是官方提供的一个脚手架工具&#xff0c;它内置了对 Webpack 的支持&#xff0c;并且简化…

Linux环境-通过命令查看zookeeper注册的服务

假设前置条件如下&#xff1a; 1.root权限用户名&#xff1a;zookeeper 2.zookeeper所在服务器地址&#xff1a;168.7.3.254&#xff08;非真实ip&#xff09; 3.zookeeper的bin文件路径&#xff1a;/opt/zookeeper/bin 4.确保zookeeper注册中心已启动 查看注册中心服务如下&a…

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…

ArcGIS计算多个栅格数据的平均栅格

3种方法计算多个栅格数据的平均栅格 1->使用“ 栅格计算器”工具 原理就是把多幅影像数据相加&#xff0c;然后除以个数&#xff0c;就能得到平均栅格。 2-> 使用“像元统计数据”工具&#xff0c;如果是ArcGIS pro&#xff0c;则是“像元统计”工具。使用这个工具可以…

Ubantu-Docker配置最新镜像源250605

尝试其他镜像加速器 阿里云镜像加速器&#xff1a;登录阿里云&#xff0c;进入容器镜像服务获取专属加速器地址。毫秒镜像&#xff1a;https://docker.1ms.run。DockerHub镜像加速器&#xff1a;https://docker.xuanyuan.me。Docker Hub 镜像加速服务&#xff1a;https://dock…

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…

Unity网络通信笔记

需求 首先要意识到网络通信面对的是一个怎么样的情景&#xff1a; 服务器会连任意个客户端&#xff0c;任意时刻可能有客户端连入连出&#xff1b;服务端和客户端可能任意时刻给对方发消息&#xff0c;所以双方都要一直准备好接收。但是两端还有别的事要做&#xff0c;通信不…

EasyRTC嵌入式音视频通信SDK音视频功能驱动视频业务多场景应用

一、方案背景​ 随着互联网技术快速发展&#xff0c;视频应用成为主流内容消费方式。用户需求已从高清流畅升级为实时互动&#xff0c;EasyRTC作为高性能实时音视频框架&#xff0c;凭借低延迟、跨平台等特性&#xff0c;有效满足市场对多元化视频服务的需求。 二、EasyRTC技术…

《MLB美职棒》勇士队排名·棒球1号位

亚特兰大勇士队&#xff08;Atlanta Braves&#xff09;是美国职业棒球大联盟&#xff08;MLB&#xff09;中历史最悠久的球队之一&#xff0c;隶属于国家联盟&#xff08;NL&#xff09;东区。 球队基本信息 成立时间&#xff1a;1871年&#xff08;前身为波士顿红袜帽队&…

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…

每日一令:Linux 极简通关指南 - 汇总

专栏列表 &#x1f4bb; 每日一令&#xff1a;Linux 极简通关指南 (25篇) 【基础】每天掌握一个Linux命令 - nsenter&#xff1a;深入容器与命名空间的利器 发布于 2025-06-08 22:27:04【基础】 每天掌握一个Linux命令 - journalctl&#xff1a;系统日志管理的得力助手 发布于…