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 相关文章推荐
JS命名空间的另一种实现
Aug 09 Javascript
jquery实现盒子下拉效果示例代码
Sep 12 Javascript
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
Jul 06 Javascript
JS动态修改iframe内嵌网页地址的方法
Apr 01 Javascript
基于AngularJS实现页面滚动到底自动加载数据的功能
Oct 16 Javascript
全面解析Bootstrap弹窗的实现方法
Dec 01 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
Jul 07 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
Jul 28 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
Dec 08 Javascript
解析jquery easyui tree异步加载子节点问题
Mar 08 Javascript
laravel-admin 与 vue 结合使用实例代码详解
Jun 04 Javascript
vue.js使用v-model实现父子组件间的双向通信示例
Feb 05 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
wordpress之wp-settings.php
2007/08/17 PHP
php file_exists 检查文件或目录是否存在的函数
2010/05/10 PHP
Yii2中DropDownList简单用法示例
2016/07/18 PHP
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
2014/06/16 Javascript
jQuery中的siblings用法实例分析
2015/12/24 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
2017/11/24 Javascript
React Native使用fetch实现图片上传的示例代码
2018/03/07 Javascript
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
angularjs自定义过滤器demo示例
2019/08/24 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
浅谈js数组splice删除某个元素爬坑
2020/10/14 Javascript
python实现问号表达式(?)的方法
2013/11/27 Python
python学习手册中的python多态示例代码
2014/01/21 Python
python基础教程项目三之万能的XML
2018/04/02 Python
详解用python写一个抽奖程序
2019/05/10 Python
python3中sys.argv的实例用法
2020/04/24 Python
浅析python 动态库m.so.1.0错误问题
2020/05/09 Python
Python远程方法调用实现过程解析
2020/07/28 Python
一款恶搞头像特效的制作过程 利用css3和jquery
2014/11/21 HTML / CSS
印度尼西亚电子产品购物网站:Kliknklik
2018/06/05 全球购物
解释一下抽象方法和抽象类
2016/08/27 面试题
Sql面试题
2013/03/20 面试题
大客户销售经理职责
2013/12/04 职场文书
购房协议书
2014/04/11 职场文书
敬老院活动总结
2014/04/28 职场文书
简洁的英文求职信范文
2014/05/03 职场文书
高中学生自我评价范文
2014/09/23 职场文书
车辆委托书范本
2014/10/05 职场文书
2015年护士节慰问信
2015/03/23 职场文书
圣诞晚会主持词
2015/07/01 职场文书
消防安全主题班会
2015/08/12 职场文书
交通安全教育心得体会
2016/01/15 职场文书
表扬信范文
2019/04/22 职场文书
HttpClient实现文件上传功能
2022/08/14 Java/Android