postcss.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. const postcss = require('postcss');
  2. const cssnext = require('postcss-preset-env');
  3. const cssnested = require('postcss-nested');
  4. const cssmqpacker = require('css-mqpacker');
  5. const cssprettify = require('postcss-prettify');
  6. const cssclean = require('clean-css');
  7. const path = require('path');
  8. const fs = require('fs');
  9. function postcssCompiler(config) {
  10. const { file, dest, minify = true } = config;
  11. const fileName = path.basename(file);
  12. const from = path.join(__dirname, '../', file);
  13. const to = path.join(__dirname, '../', dest, fileName);
  14. const fileNameMin = path.extname(fileName);
  15. const min = path.join(__dirname, '../', dest, fileName.replace(fileNameMin, `.min${fileNameMin}`));
  16. const css = fs.readFileSync(from, 'utf8');
  17. return new Promise((resolve, reject) => {
  18. return postcss([
  19. cssnested(),
  20. cssnext({
  21. stage: 0,
  22. browsers: ['last 2 version'],
  23. features: {
  24. calc: false
  25. }
  26. }),
  27. cssmqpacker({
  28. sort: true
  29. }),
  30. cssprettify()
  31. ])
  32. .process(css, {
  33. from,
  34. to
  35. })
  36. .then((result) => {
  37. if (result && result.css) {
  38. fs.writeFile(to, result.css, 'utf8', (err) => reject(err));
  39. if (minify) {
  40. const minified = new cssclean({}).minify(result.css);
  41. fs.writeFile(min, minified.styles, 'utf8', (err) => reject(err));
  42. if (result.map) {
  43. fs.writeFile(to + '.map', result.map, 'utf8', (err) => reject(err));
  44. }
  45. }
  46. resolve(to);
  47. } else {
  48. reject(result);
  49. }
  50. })
  51. .catch((err) => {
  52. console.log(err);
  53. reject(err);
  54. });
  55. });
  56. }
  57. module.exports = postcssCompiler;