详解如何在css3打包后自动追加前缀插件:autoprefixer


Posted in HTML / CSS onDecember 18, 2018

用vue-cli构建的项目脚手架已经帮你把autoprefixer的配置做好了,自己不需要做什么改动就会自动加前缀:

详解如何在css3打包后自动追加前缀插件:autoprefixer

下面一起看看涉及到autoprefixer这个插件的一些配置:

1,postcss配置写在.postcssrc.js,

详解如何在css3打包后自动追加前缀插件:autoprefixer

2,浏览器规则则写在package.json上,

详解如何在css3打包后自动追加前缀插件:autoprefixer

3,开发环境(build/webpack.dev.conf.js)样式相关的loader

详解如何在css3打包后自动追加前缀插件:autoprefixer

4,生产环境(build/webpack.prod.conf.js)样式相关的loader

详解如何在css3打包后自动追加前缀插件:autoprefixer

上述的配置设置不需要自己配置,cli脚手架环境搭建的时候已经配置好了。

vue-cli的开发环境和生产环境都是使用了postcss的,并且配置是一样的

这里有一个问题,网上有博主说项目打包前和打包后的css前缀不一致:

--给app.vue下的img添加样式

img{
 display: flex;
 transform: translateX(200px)
}

--打包前(即开发环境)img的样式

详解如何在css3打包后自动追加前缀插件:autoprefixer

--打包后(即生产环境)img的样式

详解如何在css3打包后自动追加前缀插件:autoprefixer

根据上面可看出打包前和打包后元素所带的css前缀不一致了。

然后给出的解决方案:

从上面可以看出,vue-cli的开发环境和生产环境都是使用了postcss的,并且配置是一样的,那么为什么打包前和打包后元素所带的css前缀不一致呢,

锁定问题

我们可以分析对比下build/webpack.dev.conf.js和build/webpack.prod.conf.js这两个文件,影响css的无非就module里处理样式的loader和处理css的插件plugin,从上面可以看出影响前缀的postcss的loader在两个环节中是一致的,那么就可以知道问题出在处理css的插件上了。

经过排查发现,webpack.prod.conf.js配置里是多了两个css处理插件的,如下

详解如何在css3打包后自动追加前缀插件:autoprefixer

ExtractTextPlugin这是提取分离css文件,不会影响css前缀,排除,那么问题就锁定到OptimizeCSSPlugin插件身上。再进一步,当我们把OptimizeCSSPlugin插件注释掉,然后打包测试,居然发现这时开发环境和生产环境的css前缀一致了,就是它了!!!

我们打开到npm官网搜一下这家伙

https://www.npmjs.com/package/optimize-css-assets-webpack-plugin

这是一个优化压缩css代码的插件,但很失望,文档说明很少

但我们注意到有一句话很关键:

详解如何在css3打包后自动追加前缀插件:autoprefixer

这货里面依赖了cssnano,这插件也是用来优化处理css格式、前缀什么的。同时也有个autoprefixer配置参数,直接到它官网 https://cssnano.co/ 找到autoprefixer:

详解如何在css3打包后自动追加前缀插件:autoprefixer

这里的翻译是:根据browsers选项删除不必要的前缀。请注意,默认情况下,它不会向CSS文件添加新前缀,这就可以解析清除我们的问题了,原来这插件的autoprefixer(默认应该是为true)把它认为不必要的前缀删掉了,而postcss的autoprefixer是将我们设定的浏览器范围的前缀加上,因此完美冲突了

解决问题

在build/webpack.prod.conf.js文件中OptimizeCSSPlugin插件的属性cssProcessorOptions加上autoprefixer:false来禁用它,避免冲突

详解如何在css3打包后自动追加前缀插件:autoprefixer

上代码:

new OptimizeCSSPlugin({
  cssProcessorOptions: config.build.productionSourceMap
   ? { safe: true, map: false,autoprefixer:false }
   : { safe: true, autoprefixer: false}
 }),

结论

最后,看看我们dev和build出来的css前缀,应该就一致的了:

问题原因就是:OptimizeCSSPlugin里面依赖了cssnano,而cssnano里面也有一个autoprefixer配置参数,它的作用是删除不必要的前缀(会误删在某些浏览器必要的前缀),这与postcss的autoprefixer效果冲突了,因此禁用它。现在打包出来的与我们设定的浏览器范围对应的前缀一致

按照网上的博主的配置确实可以把开发环境和测试环境的前缀一模一样,但是看了下没有必要,问题的前提不是前缀不一致,那个配置只是把和当前浏览器不匹配的前缀不显示出来而已,样式还都是生效的,个人觉得如果不是特别大的问题不用改配置。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
详解CSS3伸缩布局盒模型Flex布局
Aug 20 HTML / CSS
用CSS3实现无限循环的无缝滚动的示例代码
Nov 01 HTML / CSS
纯css3使用vw和vh实现自适应的方法
Feb 09 HTML / CSS
CSS3使用transition属性实现过渡效果
Apr 18 HTML / CSS
HTML5引入的新数组TypedArray介绍
Dec 24 HTML / CSS
HTML5制作酷炫音频播放器插件图文教程
Dec 30 HTML / CSS
简单介绍HTML5中audio标签的使用
Sep 24 HTML / CSS
HTML5 Canvas绘制五星红旗
May 04 HTML / CSS
HTML5+CSS3模仿优酷视频截图功能示例
Jan 05 HTML / CSS
HTML5 LocalStorage 本地存储刷新值还在
Mar 10 HTML / CSS
详解基于canvas的视频遮罩插件
Jan 04 HTML / CSS
通过canvas转换颜色为RGBA格式及性能问题的解决
Nov 22 HTML / CSS
CSS3田字格列表的样式编写方法
Nov 22 #HTML / CSS
纯css3实现思维导图样式示例
Nov 01 #HTML / CSS
CSS3 Flex 弹性布局实例代码详解
Nov 01 #HTML / CSS
CSS3 创建网页动画实现弹跳球动效果
Oct 30 #HTML / CSS
css3实现椭圆轨迹旋转的示例代码
Oct 29 #HTML / CSS
纯css3实现宠物小鸡实例代码
Oct 08 #HTML / CSS
使用纯 CSS 创作一个脉动 loader效果的源码
Sep 28 #HTML / CSS
You might like
PHP新手上路(四)
2006/10/09 PHP
php 获取远程网页内容的函数
2009/09/08 PHP
简单的移动设备检测PHP脚本代码
2011/02/19 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
2012/09/25 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
2013/05/06 PHP
PHP解析html类库simple_html_dom的转码bug
2014/05/22 PHP
PHP实现文件下载断点续传详解
2014/10/15 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
文本加密解密
2006/06/23 Javascript
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
2011/07/31 Javascript
jQuery filter函数使用方法
2014/05/19 Javascript
jQuery检测鼠标左键和右键点击的方法
2015/03/17 Javascript
jQuery操作表单常用控件方法小结
2015/03/23 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
浅谈jquery中使用canvas的问题
2016/10/10 Javascript
微信小程序使用input组件实现密码框功能【附源码下载】
2017/12/11 Javascript
JS生成随机打乱数组的方法示例
2017/12/23 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
利用Decorator如何控制Koa路由详解
2018/06/26 Javascript
vue+echarts实现中国地图流动效果(步骤详解)
2021/01/27 Vue.js
使用python BeautifulSoup库抓取58手机维修信息
2013/11/21 Python
pyQt4实现俄罗斯方块游戏
2018/06/26 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
五分钟带你搞懂python 迭代器与生成器
2020/08/30 Python
Python实例方法、类方法、静态方法区别详解
2020/09/05 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
2020/12/08 Python
在加拿大在线租赁和购买电子游戏:Game Access
2019/09/02 全球购物
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
日本即尚网:JSHOPPERS.com(支持中文)
2019/12/03 全球购物
Chi Chi London官网:购买连衣裙和礼服
2020/10/25 全球购物
可靠的数据流传输TCP
2016/03/15 面试题
母婴店促销方案
2014/03/05 职场文书
致运动员加油稿
2015/07/21 职场文书
golang interface判断为空nil的实现代码
2021/04/24 Golang
教你使用Python pypinyin库实现汉字转拼音
2021/05/27 Python