teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

ローカルで挙動を見返した結果、回答内容を大幅変更

2021/07/24 09:14

投稿

attakei
attakei

スコア2740

answer CHANGED
@@ -1,20 +1,72 @@
1
- > "message:js"と"message:css"それぞれ別に実行すると動作します。
1
+ ## 前提
2
- > ただ"message"を実行すると、"message:js"だけが動作し、さらにもともと存在していたindex.cssもbuildフォルダから消えてしまいます。
3
2
 
4
- 2点を念頭に置くと、おらく直近問題解決として最短手法は以下のように、「ワイルドカード用いずに、明示的に順番指定しnpm-run-allする」なではないかと思います。
3
+ れぞれnpm scripts内容踏まえ、それぞれ目的が
5
4
 
5
+ - `message:js`: 開発時に`src`配下のjsファイルが編集されるたびにコンパイルする
6
+ - `message:css`: 開発時に`src`配下のscssファイルが編集されるたびにコンパイルする
7
+ - `message`: 上記2個のnpm-scriptsを同時に動かして、開発時にjs/scssのどちらかが編集されるたびに適切にコンパイルする
8
+
9
+ という想定で回答します。
10
+
11
+ ## 対応方法例(作業的にわかりやすいもの)
12
+
13
+ 次の2個を実施する必要があります。
14
+
15
+ - 1回だけ: `package.json`内の`message`の定義に`-p`オプションをつける
16
+ - 都度: `npm run message`実行後に、`scss`ファイルを何もせずに保存だけする
17
+
18
+ ```diff
19
+ - "message": "npm-run-all message:*"
20
+ + "message": "npm-run-all -p message:*"
6
21
  ```
7
- "scripts": {
8
- "message:js": "wp-scripts start blocks/message/src/index.js --output-path=blocks/message/build/",
9
- "message:css": "node-sass --include-path scss blocks/message/src/index.scss blocks/message/build/index.css -w --output-style compressed",
10
- "message": "npm-run-all message:js message:css"
11
- }
12
- ```
13
22
 
14
- 各スクリプトの実装などまでは追っているわけではないですが、書かれている事象からすると
23
+ ## 解説
15
24
 
16
- - `message:js`内処理では`build`フォルダまっさらにしていている
25
+ ※手元挙動確認前提にした原因説明です
17
- - `npm-run-all`でワイルドカードを指定した場合は、文字列の昇順でnpm-scriptを実行する
18
- - `message:css` -> `message:js`の順に実行するため、CSSの生成後にbuildフォルダを空にしてjsを生成する
19
26
 
27
+ ### wp-scripts startの挙動について
28
+
29
+ `message:js`で呼び出しているこのコマンドは、
30
+
31
+ - --output-pathで指定した出力先フォルダをまっ更にして
32
+ - 指定したファイルをコンパイルしして
20
- と言っ挙動起きている可能性があります。
33
+ - 指定しファイルに変更かを監視し続け
34
+
35
+ いうものです。
36
+ つまり、1回限りのコンパイルコマンドではないため、利用者側が止めない限りは終了しません。
37
+
38
+ ### node-sass
39
+
40
+ こちらは通常だと1回だけSCSSファイルをCSSにコンパイルするものです。
41
+ ただし、`-w`オプションが指定されているため、こちらも指定したファイルに変化がないかを監視し続けます。
42
+
43
+ ### npm-run-allの挙動について
44
+
45
+ `npm-run-all`はパラメータなしに呼び出すと、順番に並んでいるコマンドを順番に実行します。
46
+
47
+ 前述の通り`message:js`で定義しているコマンドはファイルを監視し続けるタイプのもののため、`Ctrl-C`などで自分の手で止める必要が出てきます。
48
+ しかしこの状況下で`Ctrl-C`でプロセスを止めても、`npm-run-all`へのプロセス終了シグナルにしかならないようです。
49
+ そのため、「`message:js`が終了→続けて`message:css`を実行」という流れにはなりません。
50
+
51
+ `message:js`の中身が`build`フォルダをまっさらにしてしまう関係上、仮に順番をきちんと定義してもcssが生成されることはありません。(最初の回答が正しくない理由がここです)
52
+
53
+ そこで、どちらのプロセスも同時に動いて、それぞれの監視をしてもらう必要があります。
54
+ こういった用途などのために`npm-run-all`には`-p`という並列実行を行うパラメータがあります。
55
+
56
+ ### `npm-run-all -p` での挙動概要と、毎回CSSの保存が必要な理由
57
+
58
+ `message:*`のそれぞれで定義したコマンドはいずれも「コンパイルして監視する」ものです。
59
+ これらを`-p`で同時に実行することで、それぞれの変更を検知してコンパイルが動くようになります。
60
+
61
+ ただし、並列実行のためにどちらが先に最初のコンパイルをするかが不明であり、`message:js`が最初にbuildフォルダをまっさらにしてしまうため、何かしらの形式でscss側に変更を検知させてコンパイルし直させる必要があります。
62
+
63
+ ※これは直接的な編集である必要はなく、ファイルをエディタで開いて何もせず`Ctrl-S`で保存すれば問題ないはずです
64
+
65
+ ## 余談
66
+
67
+ 回答例として上記のことを書いてはみたものの、「`message`実行のたびにscssと何もしなくていいから保存だけする」のはあまり効率出来ではないです。
68
+ (「作業的にわかりやすいもの」と注釈をつけたのはこれが理由です)
69
+
70
+ もし余裕があるのであれば、wp-scriptsが参照可能な`webpack.config.js`に変更を加えて、scssのビルドもwp-scriptsに任せるようにすることを推奨したいです。
71
+
72
+ ※[wp-scripts内でsassコンパイルまでしようとしていそうなサイト例](https://webutubutu.com/webdesign/7779#toc_H3-6)