详解如何在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 相关文章推荐
老生常谈CSS中的长度单位
Jun 27 HTML / CSS
利用CSS3实现单选框动画特效示例代码
Sep 26 HTML / CSS
CSS3实现多背景模拟动态边框的效果
Nov 08 HTML / CSS
html5-websocket基于远程方法调用的数据交互实现
Dec 04 HTML / CSS
HTML5新增的表单元素和属性实例解析
Jul 07 HTML / CSS
全面解析HTML5中的标准属性与自定义属性
Feb 18 HTML / CSS
深入剖析HTML5 内联框架iFrame
May 04 HTML / CSS
HTML5 常见面试题之PC端和移动端区别介绍
Jan 22 HTML / CSS
html5 冒号分隔符对齐的实现
Jul 31 HTML / CSS
Html5基于canvas实现电子签名并生成PDF文档
Dec 07 HTML / CSS
如何在CSS中绘制曲线图形及展示动画
May 24 HTML / CSS
深入理解margin塌陷和margin合并的解决方案
Jun 26 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
基于mysql的bbs设计(五)
2006/10/09 PHP
php算开始时间到过期时间的相隔的天数
2011/01/12 PHP
PHP 万年历实现代码
2012/10/18 PHP
iis 7下安装laravel 5.4环境的方法教程
2017/06/14 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
用javascript实现画板的代码
2007/09/05 Javascript
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
2010/03/21 Javascript
jquery 图片 上一张 下一张 链接效果(续篇)
2010/04/20 Javascript
js实现ifram取父窗口URL地址的方法
2015/02/09 Javascript
javascript实现数独解法
2015/03/14 Javascript
js简单实现竖向tab选项卡的方法
2015/05/04 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
2015/12/16 Javascript
js格式化时间的简单实例
2016/11/27 Javascript
jQuery实现简易QQ聊天框
2020/02/10 jQuery
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS OG
2018/03/30 DOTA
[51:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/30 DOTA
在Django中同时使用多个配置文件的方法
2015/07/22 Python
Python urls.py的三种配置写法实例详解
2017/04/28 Python
Python定时器实例代码
2017/11/01 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
python清除字符串中间空格的实例讲解
2018/05/11 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
2019/09/07 Python
Python 依赖库太多了该如何管理
2019/11/08 Python
python ssh 执行shell命令的示例
2020/09/29 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
护理专业个人求职简历的自我评价
2013/10/13 职场文书
证婚人经典证婚词
2014/01/09 职场文书
师德模范事迹材料
2014/06/03 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
2014年组织部工作总结
2014/11/14 职场文书
巾帼文明岗事迹材料
2014/12/24 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
工作失职检讨书范文
2015/05/05 职场文书
本科毕业答辩开场白
2015/05/27 职场文书
浅析CSS在DevTools 中架构演变
2021/10/05 HTML / CSS