webpack的css压缩不兼容IOS8问题探索

webpack使用postcss的autoprefixer插件,并在压缩css时使用了cssnano,处理不当的情况下会导致压缩css后,部分兼容前缀(比如-webkit-)被删除的问题。

postcss的autoprefixer配置如下:

autoprefixer({
              browsers: [‘> 1%‘, ‘iOS >= 7‘,"ie >= 7", ‘Android >= 2.4‘]
          })

css压缩的配置如下:

//压缩css代码
        new OptimizeCssAssetsPlugin({
            assetNameRegExp: /\.css\.*(?!.*map)/g,  //注意不要写成 /\.css$/g
            cssProcessor: require(‘cssnano‘),
            cssProcessorOptions: {
                discardComments: {removeAll: true },
                // 避免 cssnano 重新计算 z-index
                 safe: true
            },
            canPrint: true
        })

通过查阅资料发现,如果你使用的是webpack1.x版本,UglifyJsPlugin这个插件开启了minimize,导致css-loader也开启了压缩,然后css-loader会使用cssnano进行压缩,而cssnano会使用到autoprefixer进行无关前缀的清理。所以可以通过给css-loader添加-autoprefixer参数来告诉css-loader关闭掉autoprefixer这个功能,不要强制删除某些你觉得不重要的前缀。

{test: /\.less$/,   loader: ‘style-loader!css-loader?minimize&-autoprefixer!postcss-loader!less-loader‘},

而上述原因已经在webpack2.x修复,webpack2的UglifyJsPlugin插件去掉了强制开启minimize。

然而如果你不是使用的webpack1.x,通过排查发现,在css压缩插件未使用的时候,兼容前缀正常,一旦使用了OptimizeCssAssetsPlugin来压缩css就会丢失部分的webkit前缀。

上面有提到,cssnano会使用autoprefixer自动清除掉一些他认为不重要的前缀。而OptimizeCssAssetsPlugin中默认了是使用cssnano。所以我们主动关闭cssnano的autoprefixer功能即可,因为我们已经在postcss中使用了autoprefixer插件,这里无需重复使用。

解决方法如下:

//压缩css代码
        new OptimizeCssAssetsPlugin({
            assetNameRegExp: /\.css\.*(?!.*map)/g,  //注意不要写成 /\.css$/g
            cssProcessor: require(‘cssnano‘),
            cssProcessorOptions: {
                discardComments: {removeAll: true },
                // 避免 cssnano 重新计算 z-index
                 safe: true,
                 //cssnano通过移除注释、空白、重复规则、过时的浏览器前缀以及做出其他的优化来工作,一般能减少至少 50% 的大小
                 //cssnano 集成了autoprefixer的功能。会使用到autoprefixer进行无关前缀的清理。默认不兼容ios8,会去掉部分webkit前缀,比如flex
                 //所以这里选择关闭,使用postcss的autoprefixer功能
                 autoprefixer: false
            },
            canPrint: true
        })

再次编译发现压缩状态时也带有全部的兼容前缀,ios8的不兼容问题即也解决。

参考:

http://www.css88.com/archives/7317

https://github.com/ShowJoy-com/showjoy-blog/issues/31

https://www.w3cplus.com/css/taobao-2018-year.html

原文地址:https://www.cnblogs.com/saysmy/p/9021598.html

时间: 2024-08-06 14:13:19

webpack的css压缩不兼容IOS8问题探索的相关文章

js css 压缩

合并和压缩JS.CSS文件 压缩JS,CSS文件需要引用如下组件: gulp-minify-css: 压缩css gulp-jshint: 检查js gulp-uglify: 压缩js gulp-concat: 合并文件 gulp-rename: 重命名文件 gulp-clean: 清空文件夹 gulp-notify:提示 安装组件项目目录,通过cd 进入项目的根目录,执行下边的npm安装组件 npm install gulp-minify-css gulp-jshint gulp-uglify

react&webpack使用css、less && 安装原则 --- 从根本上解决问题。

在webpack-react项目中,css的使用对于不同人有不同的选择,早起是推荐在jsx文件中使用 css inline js的,但是这种方法要写很多对象来表示一个一个的标签,并且对于这些对象,我们在写样式时,还必须要使用驼峰式的写法,所以,这无疑使我们不能接受的,最好的做法就是讲css文件写在一个单独的文件夹中外联进来. webpack同时也是可以将css文件当做一个一个的模块的,所以,我们就需要对css模块的处理进行配置. npm install css-loader style-load

css 清除浮动 兼容IE+, FF

上代码: <!doctype html> <html> <head> <meta charset="utf-8"> <title>css 清除浮动 兼容IE+, FF</title> <style type="text/css"> .clearfix { *zoom: 1; } .clearfix:before, .clearfix:after { display: table; c

简短的几句js实现css压缩和反压缩功能

写在前面 最近一直在整理css,但因为现在Visual Studio 2013太智能了,它每每在我按ctrl+E+D进行格式化代码的时候,就会将css进行层次格式化(如下图所示),而这个格式让我老大实在无法忍受,我老大认为它实在是太浪费空间了. 那我应该怎么办呢,每次将本地代码上传之前都打开另外一个vs10,然后复制粘贴,可是下次从服务器拉下来代码我一编辑,手痒一下就又变成上面这个鬼样,折磨的我呀 刚刚看了豪情的一篇文章,http://www.cnblogs.com/jikey/archive/

CSS压缩混淆 / 格式化 / 美化

<!doctype html><html><head><meta charset="utf-8"><title>CSS压缩混淆 / 格式化 / 美化工具</title><style type="text/csss">@charset "utf-8";/* CSS Document */ *{margin:0; padding:0; font-family:&quo

ios如何实现本地推送,兼容ios8

如果要兼容IOS8在IOS中实现本地推送,关键是要注意:ios8在实现本地推送时需要通过如下语句进行注册. [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings]; 至于IOS8之前版本的做法就不多说了,直接上代码.新建oc类文件(NotificationHelper),在NotificationHelper.h中声明相关方法如下: #import <UIKit/UIKit.h> @inte

CSS实现的兼容所有浏览器的div悬浮在网页一侧的代码

CSS实现的兼容所有浏览器的div悬浮在网页一侧的代码:固定悬浮在网页一侧的效果应用非常的频繁,尤其是客服系统或者公告系统,CSS提供了position:fixed属性即可实现此功能,但是IE6浏览器并不支持,虽然IE6的用户越来越少,但是毕竟还是有用户在使用,所以最好还是要实现兼容效果,下面就是一段能够兼容所有浏览器的代码实例,希望能够给需要的朋友带来帮助.代码如下: <!DOCTYPE html> <html> <head> <meta charset=&qu

css hack IE兼容调试小结(Webstorm、VS2010),有图有真相,研究了一中午

练习了些CSS代码,发现IE各种不兼容,打算用css hack调试IE 6 7 8.网上搜了些方法,虽然可行,但webstorm和VS2010各种提示报错让人不爽,试了几个小时,最终结论如下: 1.只有IE6 7认那些乱七八槽的符号,可随便用一个(% ^ &之类都行),但大家习惯用*或+,如*.background,这样只有IE6 7才认.但是webstorm会把语法检查把上下行一起标错,看起来不爽,VS干脆就报错不让ctrl E D格式化. 2.!important虽然可用,但要注意顺序,且这

在线生成CSS样式和兼容的字体格式

http://www.fontsquirrel.com/tools/webfont-generator 在线生成CSS样式和兼容的字体格式.