最近项目中在使用webpack,css是采用sass->postcss的结构, postcss 主要完成了下面几个功能css
autoprefix,样式加前缀webpack
precesweb
合并图片promise
1) 能够合并多张雪碧图 2) 能够按照不一样的比例合并图片 3) 对一些简单的图片能够使用base64编码
兼容IE浏览器浏览器
后期须要将px转换为em,使用media-query作屏幕适配sass
其余功能都比较容易实现,现成的插件都能知足,合并图片如今使用的是sprites,有一些编码,在这里先贴出来post
webpack.config.jsui
let postcssSprites = require('postcss-sprites'); let sprites = postcssSprites.default; let precss = require('precss'); let assets = require('postcss-assets'); let autoprefixer = require('autoprefixer');{编码
postcss: [ autoprefixer, precss, assets({//主要是用来作base64编码的 basePath: __dirname + '/client', relative: false }) ] } //雪碧图相关代码 let spritesConfig = sprites({ retina: true,//支持retina,能够实现合并不一样比例图片 verbose: true, spritePath: './public/images/',//雪碧图合并后存放地址 stylesheetPath: './public', basePath: './', filterBy: function (image) { //过滤一些不须要合并的图片,返回值是一个promise,默认有一个exist的filter // if (image.url.indexOf('/images/sprites/') === -1) { return Promise.reject(); } return Promise.resolve(); }, groupBy: function (image) { //将图片分组,能够实现按照文件夹生成雪碧图 return spritesGroupBy(image); }, hooks: { onUpdateRule: function (rule, comment, image) { //更新生成后的规则,这里主要是改变了生成后的url访问路径 return spritesOnUpdateRule(true, rule, comment, image); }, onSaveSpritesheet: function(opts, groups) { return spritesOnSaveSpritesheet(true, opts, groups); } } });export function spritesGroupBy(image) {url
let groups = /\/images\/sprites\/(.*?)\/.*/gi.exec(image.url); let groupName = groups ? groups[1] : group; image.retina = true; image.ratio = 1; if (groupName) { let ratio = /@(\d+)x$/gi.exec(groupName); if (ratio) { ratio = ratio[1]; while (ratio > 10) { ratio = ratio / 10; } image.ratio = ratio; } } return Promise.resolve(groupName); } export function spritesOnUpdateRule(isDev, rule, comment, image){ var spriteUrl = image.spriteUrl; image.spriteUrl = '/public/' + spriteUrl; postcssSprites.updateRule(rule, comment, image); } export function spritesOnSaveSpritesheet(isDev, opts, groups) { let file = postcssSprites.makeSpritesheetPath(opts, groups); return file; }
--images --sprites --smiley@2x --smiley@3x 生成后的雪碧图sprite.smiley@2x.png,sprite.smiley@3x.png 假设原图片64*64,项目中想使用的大小是32*32,就把原图片放在@2x的文件夹下面 相关sass代码以下 @for $i from 1 through 4 { .icon-smiley-#{$i} { width: 24px; height: 24px; background-image: url('/images/sprites/smiley@2x/smiley_#{$i}.png'); } } 编译后 .icon-smiley-0 { width: 24px; height: 24px; background-position: -24px -48px; background-image: url('/public/sprite.smiley@2x.png'); }
原本css不想使用sass的,存粹使用postcss,可是postcss不能检测内部文件的改动,致使webpack不能自动编译
好比个人主文件main.css里面 @import 'page.css' 这时候我修改page.css后,webpack不会自动编译 可是修改main.css,webpack能够自动编译, 网上找了一些资料,也没有最终解决问题,
其余坑还没碰到。。。