详解如何在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实现鼠标悬停显示扩展内容
Aug 24 HTML / CSS
CSS3 Notes: -webkit-box-reflect实现倒影的实例
Dec 08 HTML / CSS
详解CSS 3 中的 calc() 方法
Jan 12 HTML / CSS
HTML5的结构和语义(4):语义性的内联元素
Oct 17 HTML / CSS
HTML5 的新的表单元素(datalist/keygen/output)使用介绍
Jul 19 HTML / CSS
解析HTML5中的新功能本地存储localStorage
Mar 01 HTML / CSS
用html5绘制折线图的实例代码
Mar 25 HTML / CSS
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
Feb 13 HTML / CSS
Html5移动端适配IphoneX等机型的方法
Jun 25 HTML / CSS
HTML table 表格边框的实现思路
Oct 12 HTML / CSS
详解CSS开发过程中的20个快速提升技巧
May 21 HTML / CSS
CSS3 Tab动画实例之背景切换动态效果
Aug 23 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报错configure error Cannot find libmysqlclient under usr的解决方法
2014/06/27 PHP
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
PHP封装curl的调用接口及常用函数详解
2018/05/31 PHP
php抽象方法和普通方法的区别点总结
2019/10/13 PHP
浅谈laravel数据库查询返回的数据形式
2019/10/21 PHP
JavaScript实现俄罗斯方块游戏过程分析及源码分享
2015/03/23 Javascript
JavaScript中的anchor()方法使用详解
2015/06/08 Javascript
JavaScript之AOP编程实例
2015/07/17 Javascript
jQuery实现移动端滑块拖动选择数字效果
2015/12/24 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
2016/02/17 Javascript
最原始的jQuery注册验证方式
2016/10/11 Javascript
微信小程序 教程之wxapp 视图容器 view
2016/10/19 Javascript
jQuery动态增减行的实例代码解析(推荐)
2016/12/05 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
零基础之Node.js搭建API服务器的详解
2019/03/08 Javascript
Vue实现微信支付功能遇到的坑
2019/06/05 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
element-ui中按需引入的实现
2019/12/25 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
vue使用echarts实现水平柱形图实例
2020/09/09 Javascript
解决vue项目axios每次请求session不一致的问题
2020/10/24 Javascript
python生成随机验证码(中文验证码)示例
2014/04/03 Python
Python通过websocket与js客户端通信示例分析
2014/06/25 Python
Python二分查找详解
2015/09/13 Python
django+js+ajax实现刷新页面的方法
2017/05/22 Python
浅谈python内置变量-reversed(seq)
2017/06/21 Python
Python中list循环遍历删除数据的正确方法
2019/09/02 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
2020/03/02 Python
浅谈HTML5中dialog元素尝鲜
2018/10/15 HTML / CSS
在浏览器端如何得到服务器端响应的XML数据
2012/11/24 面试题
连锁经营管理专业大学生求职信
2013/10/30 职场文书
大型演出策划方案
2014/05/28 职场文书
公安四风对照检查材料思想汇报
2014/10/11 职场文书
教师学习中国梦心得体会
2016/01/05 职场文书
Python3.10的一些新特性原理分析
2021/09/15 Python