久々にパッケージガーデニングしたら stylelint から Scss 関連や rgb
の指定で怒られるようになってしまったので対処。
現象
$ stylelint ./src/scss/**/*.scss
src/scss/global/_scssVariables.scss
19:19 ✖ Unexpected unknown function "color.scale" function-no-unknown
21:19 ✖ Unexpected unknown function "color.adjust" function-no-unknown
22:17 ✖ Unexpected unknown function "color.adjust" function-no-unknown
23:19 ✖ Unexpected unknown function "color.scale" function-no-unknown
24:20 ✖ Unexpected unknown function "color.scale" function-no-unknown
src/scss/object/component/_c-button.scss
19:31 ✖ Expected modern color-function notation color-function-notation
src/scss/_plugins/articlesns/_articlesns.scss
40:16 ✖ Unexpected unknown function "color.scale" function-no-unknown
53:31 ✖ Unexpected unknown function "map.get" function-no-unknown
57:35 ✖ Unexpected unknown function "color.scale" function-no-unknown
57:47 ✖ Unexpected unknown function "map.get" function-no-unknown
57:81 ✖ Unexpected unknown function "map.get" function-no-unknown
npmパッケージをアップデートした際に stylelint やそれに関連するパッケージ等をアップデートしたところ、いくつかの項目で怒られるようになってしまいました。
この中で特に気になったのが Expected modern color-function notation color-function-notation
のエラー。
検索したところ、このツイートがヒット。
stylelint-config-standard
のアップデートで色指定が引っかかるようになったようです。これは css level 4 の構文に対応したもののようです。
構文としては次のように変更になります。
/* 旧来 */
.hoge {
background-color: rgba(48, 48, 48, 0.5);
}
/* 新 */
.hoge {
background-color: rgb(48 48 48 / 50%);
}
rgb()
とrgba()
からrgb()
へ統一- RGB値はカンマ区切りからスペース区切りへ
- RGB値とアルファ値の区切りはカンマからスラッシュへ
一方、 Scss でも独自に rgb()
が存在しています。このおかげで、 Scss で次のように色の指定でRGB値ではなく16進数や変数を使用しても問題が発生しないわけですね。
$black: #333;
.hoge {
background-color: rgba($black, 0.5);
}
ただ、 Scss 側ではまだカンマ区切りしか対応していなさそうです。そのため、仮に css level 4 の構文を使用して Scss のトランスパイルを走らせると、次のようにエラーになってしまいます。
[hh:ii:ss] gulp-notify: [sass] Error: src\scss\object\component\_c-newscards.scss
Error: Missing element $blue.
╷
128 │ box-shadow: inset 2px 2px 5px 0 rgb(g.$us-main-color 0.5);
│ ^^^^^^^^^^^^^^^^^^^^^^^^^
╵
src\scss\object\component\_c-newscards.scss 128:37 @use
src\scss\contents.scss 36:1 root stylesheet
19:31 ✖ Expected modern color-function notation color-function-notation
Scss の構文にすると stylelint でコケて、 stylelint のデオフォルトに従って css level 4 の構文にすると Scss のトランスパイルが通らない、と。
対処
仕方ないので、上述引用のツイートと同様に color-function-notation
のパラメータを legacy
にすることで回避することにしました。
.stylelint.json
"rules": {
// 略
"color-function-notation": "legacy",
// 略
}
余談
上述対処の前に他の回避方法がないか試す中で、一通りパッケージをアップデートしたりしましたがかえって Scss の関数等のエラーが出てしまったのは冒頭の通り。
そこでそれらへの対応として次のようにしました。
package.json
"devDependencies": {
// 略
"stylelint-config-standard-scss": "3.0.0", // 追加
// 略
}
.stylelint.json
"extends": [
"stylelint-config-standard",
"stylelint-config-standard-scss", // 追加
"stylelint-config-recommended-scss",
"stylelint-config-prettier"
],
まず stylelint-config-standard-scss
を追加。
.stylelint.json
"rules": {
// 略
"at-rule-no-unknown": null, // Scss関数は stylelint-config-standard-scss に任せるようにしたため独自で追加していた設定は削除
"function-no-unknown": [
true, // map.get や color.scale 等 Dart Sass の関数は引っかかってしまうのでルールを追加
{
"ignoreFunctions": [
"/^map\\..+/",
"/^color\\..+/"
]
}
],
"scss/at-rule-no-unknown": true, // Scssのデフォルト関数以外は引っかかるようにする
"scss/dollar-variable-pattern": "^(([a-z][a-zA-Z0-9_]+)|([a-z][a-z0-9]*)(-[a-zA-Z0-9_]+)*)$", // 互換性のためケバブケース強制は除去
"scss/at-mixin-pattern": "^(([a-z][a-zA-Z0-9_]+)|([a-z][a-z0-9]*)(-[a-zA-Z0-9_]+)*)$", // 互換性のためケバブケース強制は除去
"scss/at-mixin-argumentless-call-parentheses": "always" // 互換性のため引数なしのmixin呼び出しの際は括弧強制
"stylelint-config-standard-scss": "3.0.0", // 追加
// 略
}
その上で .stylelint.json
のルールをいくつか変更しました。
これで stylelint を走らせてエラーが出なくなったことを確認。
参考
color-function-notation
- color-function-notation | Stylelint
- かじさんはTwitterを使っています 「stylelint-config-standard の 23.0.0 アップデートで、 color-function-notation が ‘modern’ で追加された。 従来のコンマ区切りだったrgb()、rgba()をスペース区切りに揃えるもの。ついでにrgbaをrgbに揃えている。 https://t.co/yHFngFOS8J」 / Twitter
css level 4
- CSS Color Module Level 4 (日本語訳)
- Getting error in CSS with
rgb\(0 0 0 \/ 15%\)
– Stack Overflow- 似たようなケース
Scss 周りへの対応
- Stylelint 14.0.0 で Sass ファイルを lint させる方法 – Qiita
- GitHub – stylelint-scss/stylelint-config-standard-scss: The standard shareable SCSS config for Stylelint.
- at-rule-no-unknown | Stylelint
- function-no-unknown | Stylelint
- stylelint-scss/README.md at master · stylelint-scss/stylelint-scss · GitHub
- stylelint-config-sass-guidelinesの内容をメモする – Qiita
- stylelint-scss/README.md at master · stylelint-scss/stylelint-scss · GitHub
marked
パースする関数が marked
から marked.parse
メソッドに変更になっていた。