vue-cli2打包前和打包后的css前缀不一致的问题解决


Posted in Javascript onAugust 24, 2018

??乱还?/strong>

最近基于vue-cli2 学习webpack,将vue-cli2的webpack配置强撸了一遍,感觉身体已被掏空。。。但还是收获不少的,起码掌握了webpack的一些基本套路、开发环境和生产环境的概念、根据不同的环境写不同的webpack配置、和一些常用插件的用法等。

问题来了

基于vue-cli不用自己配置webpack开撸项目是十分爽的,但当我在撸得正爽的时候发现一个问题,就是项目打包前和打包后的css前缀不一致的,如下(浏览器:Chrome):

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

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

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

vue-cli2打包前和打包后的css前缀不一致的问题解决

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

vue-cli2打包前和打包后的css前缀不一致的问题解决

根据上面可看出打包前和打包后元素所带的css前缀不一致了。当我们给一个元素设置css3属性时,是希望它带有浏览器前缀来兼容的。vue-cli也给我们搭建这样的功能(是通过配置postcss的autoprefixer实现的)

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

module.exports = {
 "plugins": {
  "postcss-import": {},
  "postcss-url": {},
  // to edit target browsers: use "browserslist" field in package.json
  "autoprefixer": {}
 }
}

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

"browserslist": [
  "> 1%",
  "last 2 versions",
  "not ie <= 8"
 ]

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

module: {
  rules: utils.styleLoaders({ 
   sourceMap: config.dev.cssSourceMap, 
   usePostCSS: true })
 },

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

module: {
  rules: utils.styleLoaders({
   sourceMap: config.build.productionSourceMap,
   extract: true,
   usePostCSS: true
  })
 },

从上面可以看出,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处理插件的,如下

vue-cli2打包前和打包后的css前缀不一致的问题解决

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

我们打开到npm官网搜一下这家伙https://www.npmjs.com/package/optimize-css-assets-webpack-plugin,这是一个优化压缩css代码的插件,但很失望,文档说明很少

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

vue-cli2打包前和打包后的css前缀不一致的问题解决

什么鬼,这货里面依赖了cssnano,这插件也是用来优化处理css格式、前缀什么的。同时也有个autoprefixer配置参数,直接到它官网(这个好像需要番墙) https://cssnano.co/ 找到autoprefixer(比较难找得借助翻译):

vue-cli2打包前和打包后的css前缀不一致的问题解决

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

解决问题

最后在github上找到解决方案(忘了复制找不回那地址了,具体为啥这样设置没说,这得深入这个插件的源码了),在build/webpack.prod.conf.js文件中OptimizeCSSPlugin插件的属性cssProcessorOptions加上autoprefixer:false来禁用它,避免冲突

vue-cli2打包前和打包后的css前缀不一致的问题解决

上代码:

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效果冲突了,因此禁用它。

现在打包出来的与我们设定的浏览器范围对应的前缀一致,感觉整篇文章有点??铝耍??馐俏医饩稣馕适碧獾难?罚??锹家幌掳桑?缬蟹治霾欢缘穆榉持赋觯?恍唬?/p>

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

Javascript 相关文章推荐
通过jquery实现tab标签浏览效果
Feb 20 Javascript
IE 下的只读 innerHTML
Aug 21 Javascript
js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)
Feb 02 Javascript
js获取select默认选中的Option并不是当前选中值
May 07 Javascript
javascript监听鼠标滚轮事件浅析
Jun 05 Javascript
javascript比较两个日期相差天数的方法
Jul 23 Javascript
js实现精确到秒的日期选择器完整实例
Apr 30 Javascript
使用JavaScript计算前一天和后一天的思路详解
Dec 20 Javascript
JavaScript实现Excel表格效果
Feb 07 Javascript
小程序实现录音功能
Sep 22 Javascript
基于JQuery和DWR实现异步数据传递
Oct 16 jQuery
jQuery实现tab栏切换效果
Dec 22 jQuery
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
Aug 24 #Javascript
AngularJS自定义表单验证功能实例详解
Aug 24 #Javascript
Vue源码解读之Component组件注册的实现
Aug 24 #Javascript
element-ui 关于获取select 的label值方法
Aug 24 #Javascript
微信小程序用户信息encryptedData详解
Aug 24 #Javascript
element-ui 中的table的列隐藏问题解决
Aug 24 #Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
Aug 24 #Javascript
You might like
php上传文件的增强函数
2010/07/21 PHP
php中的curl_multi系列函数使用例子
2014/07/29 PHP
php倒计时出现-0情况的解决方法
2016/07/28 PHP
PHP中CheckBox多选框上传失败的代码写法
2017/02/13 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
浅谈PHPANALYSIS提取关键字
2019/03/08 PHP
JavaScript中Math对象方法使用概述
2014/01/02 Javascript
javascript函数重载解决方案分享
2014/02/19 Javascript
使用Javascript简单实现图片无缝滚动
2014/12/05 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
2015/03/20 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
2016/02/19 Javascript
jQuery实现的鼠标经过时变宽的效果(附demo源码)
2016/04/28 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
jQuery判断是否存在滚动条的简单方法
2016/09/17 Javascript
NW.js 简介与使用方法
2018/02/01 Javascript
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
[53:29]完美世界DOTA2联赛循环赛 DM vs Matador BO2第二场 11.04
2020/11/05 DOTA
windows系统中python使用rar命令压缩多个文件夹示例
2014/05/06 Python
python在linux系统下获取系统内存使用情况的方法
2015/05/11 Python
Python算法应用实战之栈详解
2017/02/04 Python
python tkinter界面居中显示的方法
2018/10/11 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
python爬虫 正则表达式解析
2019/09/28 Python
python批量将excel内容进行翻译写入功能
2019/10/10 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
Selenium自动化测试工具使用方法汇总
2020/06/12 Python
Spring @Enable模块驱动原理及使用实例
2020/06/23 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
土木工程毕业生自荐信
2013/09/21 职场文书
个人查摆剖析材料
2014/02/04 职场文书
建筑工地质量标语
2014/06/12 职场文书
物价局领导班子四风问题整改措施
2014/10/26 职场文书
行政助理岗位职责
2015/02/10 职场文书
综合管理员岗位职责
2015/02/11 职场文书
2019暑假阅读倡议书
2019/06/24 职场文书