Pack same CSS media query rules into one media query rule.
Written with PostCSS.
A CSS file processed with a CSS pre-processor may have same queries that can merge:
.foo::before {
content: "foo on small";
}
@media screen and (min-width: 769px) {
.foo::before {
content: "foo on medium";
}
}
.bar::before {
content: "bar on small";
}
@media screen and (min-width: 769px) {
.bar::before {
content: "bar on medium";
}
}This PostCSS plugin packs exactly same queries (and optionally sorts) like this:
.foo::before {
content: "foo on small";
}
.bar::before {
content: "bar on small";
}
@media screen and (min-width: 769px) {
.foo::before {
content: "foo on medium";
}
.bar::before {
content: "bar on medium";
}
}$ npm install css-mqpacker
Of course, this package can be used as PostCSS plugin:
#!/usr/bin/env node
"use strict";
var fs = require("fs");
var postcss = require("postcss");
var css = fs.readFileSync("from.css", "utf8");
postcss([
require("autoprefixer-core")(),
require("css-mqpacker")()
]).process(css).then(function (result) {
console.log(result.css);
});Read from.css, process its content, and output processed CSS to STDOUT.
#!/usr/bin/env node
"use strict";
var fs = require("fs");
var mqpacker = require("css-mqpacker");
var original = fs.readFileSync("from.css", "utf8");
var processed = mqpacker.pack(original, {
from: "from.css",
map: {
inline: false
},
to: "to.css"
});
console.log(processed.css);This package also installs a command line interface.
$ node ./node_modules/.bin/mqpacker --help
Usage: mqpacker [options] INPUT [OUTPUT]
Description:
Pack same CSS media query rules into one media query rule.
Options:
-s, --sort Sort `min-width` queries.
--sourcemap Create source map file.
-h, --help Show this message.
-v, --version Print version information.
Use a single dash for INPUT to read CSS from standard input.
When PostCSS failed to parse INPUT, CLI shows a CSS parse error in GNU error format instead of Node.js stack trace.
The --sort option does not currently support a custom function.
By default, CSS MQPacker pack and order media queries as they are defined. If
you want to sort queries automatically, pass sort: true to this module.
postcss([
mqpacker({
sort: true
})
]).process(css);Currently, this option only supports min-width queries with specific units
(ch, em, ex, px, and rem). If you want to do more, you need to create
your own sorting function and pass it to this module like this:
postcss([
mqpacker({
sort: function (a, b) {
return a.localeCompare(b);
}
})
]).process(css);In this example, all your queries will sort by A-Z order.
This sorting function directly pass to Array#sort() method of an array of all
your queries.
Packs media queries in css.
The second argument is optional. The options is same as the second argument of
PostCSS’s process() method. This is useful for generating Source Map.
var fs = require("fs");
var mqpacker = require("css-mqpacker");
var css = fs.readFileSync("from.css", "utf8");
var result = mqpacker.pack(css, {
from: "from.css",
map: {
inline: false
},
to: "to.css"
});
fs.writeFileSync("to.css", result.css);
fs.writeFileSync("to.css.map", result.map);See also PostCSS document for more about this options.
var gulp = require('gulp');
var mqpacker = require("css-mqpacker").gulp;
gulp.task('css', function() {
gulp.src('**/*.css')
.pipe(mqpacker())
.pipe(gulp.dest('build'));
});