从Sass中消除未使用的选择器
#css #sass #purgecss #sourcemap

对于CSS,有https://purgecss.com

但是sass呢?
您不仅要从构建结果中消除未使用的选择器,还要从SASS源代码中消除选择。

我尝试了。 cc-kawakami/uchini: Find unused Sass codes

npm i -g uchini

(“ 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)

接下来,我们识别purgecss未使用的CSS选择器。

const rejectedCSS = await new PurgeCSS().purge({
  content: [content],
  css: [{ raw: css }],
  rejected: true
})[0].rejected

然后,消费者可以使用源地图遍历与给定的CSS线相对应的SASS线。

const position = this.consumer.originalPositionFor({
  line: 1, // since the source map is a single line in compressed
  column: startOfSelector
})

就是这样。

谢谢您的阅读。