浏览器兼容性问题是什么
现在市面上,有各式各样的浏览器,而每个浏览器的版本又是非常多的。它们各自又支持不同的特性,比如对于css特性、js语法等。这就导致我们在开发中必须考虑到浏览器兼容性的问题。
这篇总结文章会涉及到browserslist、postcss、autoPrefixer、postcss-preset-env等工具。
Browserslist
既然我们在开发时需要考虑到浏览器兼容性这个问题,那我们怎么确定我们开发的项目要兼容哪些浏览器呢? 哪些浏览器的哪个版本是我们需要兼容的,试想一个个罗列出来,那是基本很难实现的事情。那我们怎么解决呢?
目前我们前端已经非常的工程化了。那么是否有这样一个工具帮助我们进行统计呢?答案就是browserslist。
定义
browserslist是一个在不同的前端工具之间共享 目标浏览器 和 Node.js版本 的配置。
browserslist会做什么事呢?
Browserslist会将满足条件的浏览器信息,共享给其他工具去解决浏览器兼容性问题。比如Autoprefixer、Babel、postcss-preset-env等。
Browserslist配置
在很多项目里,我们都是在根目录的browserslistrc文件里看到如下配置。这个时候我就很迷惑,这些是个啥?
先说结论:这些就是一个个的条件,告诉我们的browserslist工具,我们的项目需要兼容满足一下这些条件的浏览器,你帮我找出来都有哪些浏览器是符合的。
//browserslistrc
>1%
last 2 version
not dead
在学习这些条件前,我们需要先了解浏览器的市场占有率等,我们可以到caniuse网站去查询到下边图片展示的信息,其中包含各个浏览器各个版本的市场占有率。
然后我们就可以来学习刚才说到的条件各自的含义:
>1%:浏览器的市场占有率需大于百分之一;
last 2 versions:最近的两个版本;
not dead:没有死亡(距离上一次更新不超过24个月;
配置browerslist的两种方案:
方案一:在package.json里配置
方案二:创建browerslistrc文件进行配置
配置规则:
- 使用逗号或者or隔开,都是满足任一条件即可;
- 使用and隔开,需要满足全部条件
browserslist安装:无需手动安装,在安装webpack时就会帮助我们自动安装
browserslist使用:无需手动使用,因为它只是为了给其他工具共享信息的。其他工具库会去找当前项目是否有browserslist的配置。
当然在命令行去使用也可以。在node_modules/bin文件夹下就能找到我们的browserslist,所以我们就可以在命令行通过如下命令使用。
npx browserslis
Postcss在webpack里的使用
定义
一个通过JavaScript来转化css的工具。
这个怎么理解呢?
举个例子:css-loader与style-loader也是通过JavaScript来转化css的。在打包时,css-loader使用js将css代码转化为js,然后style-loader使用js在header下创建一个style,将所有的css转化出来的js代码放到style里。
这样就很好理解为什么postcss是使用js来转化css的工具了。而且在实际开发中,postcss转化完还是需要交给css-loader和style-loader来处理的。
Postcss都做了什么事情呢?
postcss会根据browserslist配置共享出来的浏览器信息,去给css样式进行一些css的转化与适配,比如添加需要的浏览器前缀、css样式重叠等,去解决浏览器兼容性问题。
如何使用postcss呢?
下面将在webpack中配置postcss + autoprefixer,去实现css适配不同浏览器。
第一步:安装postcss-loader
第二步:添加postcss需要用到的相关插件(比如说postcss要想实现添加浏览器前缀,单靠自己还完成不了,还需要依赖到Autoprefixer插件)
安装:
npm i postcss-loader autoprefixer --save-dev
使用:
//webpack.config.js
{
// 规则使用正则表达式
test: /\.css$/,
use: [
"style-loader",
{
loader: "css-loader",
options: {
importLoaders: 1
}
},
{
loader:'postcss-loader',
options:{
postcssOptions:{
plugins:[
require('autoprefixer')
]
}
}
}
],
},
另一种方式:
也可以将postcss-loader的配置抽离出来。
//postcss.config.js
module.exports = {
plugins: [
'autoprefixer'
]
}
在根目录下创建postcss.config.js文件,将postcss-loader的配置放到这个文件里
{
// 规则使用正则表达式
test: /\.css$/, // 匹配资源
use: [
"style-loader",
{
loader: "css-loader",
options: {
importLoaders: 1,
},
},
"postcss-loader",
],
},,
autoPrefixer与postcss-preset-env
在前面对autoPrefixer的使用中,不难看出,autoPrefixer的作用,就是给css代码添加浏览器前缀。
但是在很多脚手架里,用得更多的是postcss-preset-env插件(而不是autoPrefixer)。
postcss-preset-env插件是什么呢?
postcss-preset-env内置了autoPrefixer,所以autoPrefixer有的功能它都有。而且postcss-preset-env比autoPrefixer更强大。
下边举例证明下强大在哪里:
/*rgb为6位,rgba位8位*/
color:#12345678
/*使用autoPrefixer转化后,还是保持8位数字。*/
/*新版本浏览器是认识8位rgba的,但是旧版本浏览器直接无视最后两位*/
color:#12345678
/*使用postcss-preset-env转化后*/
color:rgba(18,52,56,0.47059)
Postcss-preset-env的使用:使用方法与autoPrefixer一模一样,都是作为postcss-loader的插件。
//postcss.config.js
module.exports = {
plugins: [
'postcss-preset-env'
]
}