Для CSS есть https://purgecss.com.

А как же Сасс?
Вы хотите удалить неиспользуемые селекторы не только из созданного результата, но и из исходного кода Sass.

Я пробовал. cc-kawakami/uchini: поиск неиспользуемых кодов Sass

npm i -g uchini
Войти в полноэкранный режим

Выйти из полноэкранного режима

(«Учини» в переводе с японского означает разгрузка груза с корабля, который вот-вот затонет.)

$ uchini ls --help
List CSS selectors usage

USAGE
  $ uchini ls --scss <value> --content <value> [--output
    <value>] [--unusedOnly]

FLAGS
  --content=<value> (required) Path to content file
  --output=<value> Path to output file
  --scss=<value> (required) Path to CSS file
  --unusedOnly Unused selectors only

DESCRIPTION
  List CSS selectors usage

EXAMPLES
  $ uchini ls --css path/to/css --content path/to/content --output path/to/output --unusedOnly
Войти в полноэкранный режим

Выйти из полноэкранного режима

uchini ls --scss path/to/scss --content 'path/**/*.html' --output output.json
Войти в полноэкранный режим

Выйти из полноэкранного режима

[
  {
    "selector": ".header",
    "positions": [
      "frontend/stylesheets/_layout.scss:20:2"
    ]
  },
  {
    "selector": ".card",
    "positions": [
      "frontend/stylesheets/_card.scss:1:0"
    ]
  }
]
Войти в полноэкранный режим

Выйти из полноэкранного режима

Внутренне мы используем следующее.

Сначала скомпилируйте Sass.

const compiled = sass.compile(
  scss,
  {
   style: 'compressed',
   sourceMap: true,
    logger: sass.Logger.silent
  }
)
Войти в полноэкранный режим

Выйти из полноэкранного режима

Затем исходная карта создает потребителя.

const consumer = await new sourceMap.SourceMapConsumer(compiled.sourceMap)
Войти в полноэкранный режим

Выйти из полноэкранного режима

Затем мы определяем селекторы CSS, которые не используются purgecss.

const rejectedCSS = await new PurgeCSS().purge({
  content: [content],
  css: [{ raw: css }],
  rejected: true
})[0].rejected
Войти в полноэкранный режим

Выйти из полноэкранного режима

Затем потребитель может использовать исходную карту для обхода строк Sass, соответствующих заданной строке CSS.

const position = this.consumer.originalPositionFor({
  line: 1, // since the source map is a single line in compressed
  column: startOfSelector
})
Войти в полноэкранный режим

Выйти из полноэкранного режима

Вот и все.

Спасибо за чтение.