PostCSS の設定ファイル

PostCSS のビルドでは PostCSS CLI を使わず、gulp-postcss を使います。理由は後述。

gulpfile.js
const gulp = require('gulp')
const postcss = require('gulp-postcss')
const filter = require('gulp-filter')
const pump = require('pump')

gulp.task('build:css', cb => {
  pump(
    [
      gulp.src('src/**/*.css'),
      postcss({ modules: true }),
      filter(['**', '!**/_*.css']),
      gulp.dest('docs')
    ],
    cb
  )
})

Sass のように @import されるファイルには prefix として _ をつけて、出力しないような処理をしています。

出力したいファイルを src/main.css のように決め打ちしてしまうと、@import したファイルを doiusestylelint にかけることができません。postcss-import で結合後に LINT を実行することは可能ですが、結合してしまったあとでは、レポートされる行数が当然結合後の行数を示すことになり、使い物になりません。PostCSS CLI を使わないのはこれが理由です。

.postcssrc.js
const path = require('path')

module.exports = ctx => {
  const file = path.parse(ctx.file.path)

  // ファイル名が `_` から始まるものを判定し、
  // trueであればpostcss-import以降を実行しない
  const isPartial = file.name.startsWith('_')

  return {
    map: ctx.env !== 'production',
    plugins: Object.assign(
      {},
      {
        doiuse: {
          // なぜか一つ設定をいれておかないと.browserslistrcを読み込まない
          ignore: []
        },
        stylelint: {},
        'postcss-reporter': {
          clearReportedMessages: true
        }
      },
      isPartial
        ? {}
        : {
            'postcss-import': {},
            'postcss-flexbugs-fixes': {},
            'postcss-gap-properties': {},
            autoprefixer: {
              grid: true
            },
            cssnano: {
              'postcss-discard-unused': true,
              'postcss-merge-idents': true,
              'postcss-reduce-idents': true,
              'z-index': true
            }
          }
    )
  }
}

使用するプラグインは以下の通り。

フォーマッタには prettier を使うので、PostCSS ではフォーマットをしていません。

doiuse についてはコメントアウトでも書いていますが、何故か一つでも何かしらの設定がないと、.browserslistrc の設定を読み込んでくれないので注意が必要です(そのうち修正されると思いますが……)。