LoginSignup
4
0

More than 3 years have passed since last update.

スナップショットテストがなくてもrailsのwebpackerで、node-sassからdart-sassに安心して切り替える

Last updated at Posted at 2021-02-14

本記事のサマリ

node-sassでコンパイルした結果と、dart-sassでコンパイルした結果を、formatしてdiff確認すると、安心ですよというお話です。もちろん、cssのコンポーネント毎にスナップショットテストを実施していれば、そちらが崩れていないことを確認するほうがベターです。(両方やるとさらに安心ですね)

対象読者

  • node-sassは、非推奨になりdart-sassが推奨になったので、切り替えたいけど、ちょっと怖い人
  • @imortをやめて、@useを使うのに、dart-sassへの切り替えを行たいけど、ちょっと怖い人

動作確認バージョン

node-sass "^4.12.0"
sass@^1.32.7:

経緯

node-sassは、非推奨になっておりdart-sassを利用せよと公式にも記載されていました。RubyOnRailsでは、(今後は変わっていくと思いますが)標準では、node-sassが利用されていますが、dart-sassに切り替えることが望ましいですし、トランスパイルの速度や、@useといった新しい構文がりようできるなど、メリットも多く、早めに乗り換えたいと思いました。ただ、cssがそのまま動くのか?というのは、やってみないとわからない部分もあり、その検証の一部として、トランスパイル結果のdiffチェックをしようと考えました。
https://github.com/sass/node-sass#node-sass
https://github.com/sass/node-sass/commit/e2391c259167a9692f2c23b0c91caa37502334ca#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5

node-sassでトランスパイルしてもっておく

bin/webpack

# あとで使うので退避
mv public/packs public/packs_by_node_sass
# css以外は削除
find public/packs_by_node_sass -type f | grep  -v .*css$ | xargs rm

dart-sassを使うように変更

# とりあえず、dart-sassを入れる
yarn add sass fiber
# webpackerでdart-sassを利用するように設定を変更する。
# 参考:https://mentalized.net/journal/2019/10/19/use-sass-modules-in-rails/
const { environment } = require('@rails/webpacker')

const sassLoader = environment.loaders.get('sass');
// using dart-sass
const sassLoaderConfig = sassLoader.use.find(function(element) {
  return element.loader === 'sass-loader';
});
sassLoaderConfig.options.implementation = require('sass');
module.exports = environment

dart-sassでトランスパイルする

bin/webpack

mv public/packs public/packs_by_dart_sass
# css以外は削除
find public/packs_by_dart_sass -type f | grep  -v .*css$ | xargs rm

hash値がついていると、diffを取りづらいのでrenameする。

例えば、packs/css/application-a618018a.css を packs/css/application.css にリネームしておきます。

find public/packs_by_node_sass/ -type f -name "*.css" | xargs rename 's/-[0-9a-z]+.css/.css/g'
find public/packs_by_dart_sass/ -type f -name "*.css" | xargs rename 's/-[0-9a-z]+.css/.css/g'

綺麗にdiffをとるためにcssの整形ツール入れる

yarn add cssbeautify-cli

cssbeautify-cliで、cssを整形する

# node-sassで生成したやつの整形
# 整形したやつは、`-beautify.css` というsuffixをつけている
for file in `find public/packs_by_node_sass/ -type f -name "*.css"`
do
  write_file_path=`dirname ${file}`/`basename ${file} .css`-beautify.css
  echo ${write_file_path}
  ./node_modules/cssbeautify-cli/bin/cssbeautify-cli -f ${file} -w ${write_file_path}
  rm ${file} # 整形前のファイルは削除
done
# dart-sassで生成したやつの整形
# 整形したやつは、`-beautify.css` というsuffixをつけている
for file in `find public/packs_by_dart_sass/ -type f -name "*.css"`
do
  write_file_path=`dirname ${file}`/`basename ${file} .css`-beautify.css
  ./node_modules/cssbeautify-cli/bin/cssbeautify-cli -f ${file} -w ${write_file_path}
  rm ${file} # 整形前のファイルは削除
done

差分をチェック

diff -r public/packs_by_node_sass/ public/packs_by_dart_sass/
# ざっと差分を確認して気になるところは、個別にみやすいdiffツールを利用すると良いかと思います。
# 差分の例
84,85c84,85
<   .owl-carousel .owl-nav button.owl-next,
<   .owl-carousel button.owl-dot {
---
> .owl-carousel .owl-nav button.owl-next,
> .owl-carousel button.owl-dot {
1204c1205
<     grid-gap: .5em;
---
>     grid-gap: 0.5em;
1211c1212
<     content: "\f105";
---
>     content: "";

私の環境では、
- .5remのような表記がきっちり0.5rem のように0がつく(問題なし)
- インデントズレ(これは、formatがちゃんとできていないだけと思われるので問題なし)
- クラス名の指定順序が若干入れ替わる(h1,h2としていたものが、h2,h1になっているといったもの、問題なし)
- contentに指定していたfontawesomeの部分が壊れる -> 問題ありそう

といった感じでした。

以上、見た目の確認とあわせて、こんな感じで差分をとってチェックしていくと安心ですよというお話でした。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0