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 相关文章推荐
javascript URL锚点取值方法
Feb 25 Javascript
JS URL传中文参数引发的乱码问题
Sep 02 Javascript
给jQuery方法添加回调函数一款插件的应用
Jan 21 Javascript
JS随机生成不重复数据的实例方法
Jul 17 Javascript
判断浏览器的内核及版本号方法汇总
Jan 05 Javascript
JavaScript中的标签语句用法分析
Feb 10 Javascript
javascript计时器详解
Feb 28 Javascript
Bootstrap模态框调用功能实现方法
Sep 19 Javascript
微信小程序实战之轮播图(3)
Apr 17 Javascript
JavaScript学习笔记之惰性函数示例详解
Aug 27 Javascript
JS闭包的几种常见形式实例详解
Sep 16 Javascript
JavaScript制作3D旋转相册
Aug 02 Javascript
解决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
1 Tube Radio
2021/03/02 无线电
php面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
php生成zip文件类实例
2015/04/07 PHP
学习php设计模式 php实现装饰器模式(decorator)
2015/12/07 PHP
基于PHP的登录和注册的功能的实现
2020/08/06 PHP
document.designMode的功能与使用方法介绍
2007/11/22 Javascript
js 金额文本框实现代码
2012/02/14 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
2014/06/16 Javascript
js图片轮播特效代码分享
2015/09/07 Javascript
apply和call方法定义及apply和call方法的区别
2015/11/15 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
什么是JavaScript中的结果值?
2016/10/08 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
js实现日历的简单算法
2017/01/24 Javascript
整理关于Bootstrap排版的慕课笔记
2017/03/29 Javascript
Javascript中八种遍历方法的执行速度深度对比
2017/04/25 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
详解微信小程序胶囊按钮返回|首页自定义导航栏功能
2019/06/14 Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
2019/09/10 Javascript
[02:45]2016年中国刀塔全程回顾,完美“圣”典即将上演
2016/12/15 DOTA
Python request设置HTTPS代理代码解析
2018/02/12 Python
python判断完全平方数的方法
2018/11/13 Python
python Tkinter版学生管理系统
2019/02/20 Python
python运用sklearn实现KNN分类算法
2019/10/16 Python
python基于K-means聚类算法的图像分割
2019/10/30 Python
详解Python的三种拷贝方式
2020/02/11 Python
PyQt5-QDateEdit的简单使用操作
2020/07/12 Python
简单介绍HTML5中的文件导入
2015/05/08 HTML / CSS
系统管理员的职责包括那些?管理的对象是什么?
2013/01/18 面试题
政府门卫岗位职责
2014/04/29 职场文书
信息管理与信息系统专业求职信
2014/06/21 职场文书
法制宣传标语
2014/06/23 职场文书
2014年教师节讲话稿5篇
2014/09/10 职场文书
2015年度护士个人工作总结
2015/04/09 职场文书
2016大学生诚信考试承诺书
2016/03/25 职场文书
PHP中->和=>的意思
2021/03/31 PHP