回答編集履歴

1

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

2021/07/24 09:14

投稿

attakei
attakei

スコア2740

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