事態は突然に
公式通りに npx nuxt-create-app
して Nuxt2.9 に TypeScript を導入,試しに npm run nuxt-ts
すると当然のように成功した
ちょっと MacBook Air が熱っぽい気がしたけど空気は保温効果高いし仕方ない.
安心して今度はこう
npm run nuxt-ts generate
npm run nuxt-ts build
ーーいつもよりちょっとだけ賑やかな雰囲気の MacBook Airーー
ーー待つ私ーー
ーーついに喋り出したMacBook Airーー
ーー待つ私ーー
ーー唸り始めたAirーー
ーー待つ私ーー
ーー唸りをあげるAirーー
ーー待つ私ーー
ーーAirーー
ーー待っ
^C
^C
^C
バチバチバチ
(訳:ファン全開にしてプロセス走っているのにビルドが95%から全く進まなかったので怖くなって途中で止めた
何が起きていたのか
とりあえず中断したが,なんかまだ裏で動いているっぽくてファンがうるさい.空気の癖に.
うるさいので強制終了させた
$ ps
PID TTY TIME CMD
45314 ttys000 0:01.45 /bin/bash -l
35311 ttys000 0:37.78 /hogehoge/node/v12.14.0/bin/node --max-old-space-size=2048 /hogehoge/node_modules/fork-ts-checker-webpack
$ kill 35311
$ ps
PID TTY TIME CMD
45314 ttys000 0:01.46 /bin/bash -l
ググった
これっぽい https://blog.johnnyreilly.com/2019/05/typescript-and-high-cpu-usage-watch.html
記事にあるように,nuxt.config.jsに環境変数を追加
mode: 'universal',
+ env: {
+ TSC_WATCHFILE: 'UseFsEventsWithFallbackDynamicPolling'
+ },
head: {
もう一度 npm run nuxt-ts
.さっきよりは静かになったが,ps
で確認するとプロセスは動いてる.
npx run nuxt-ts build
はさっきと一緒で成功しない.
しかし,Nuxt2.9 + TypeScript でこの現象に遭遇している人はあまりいないようだ.変だ.
直るのも突然(原因不明)
ググっても見つからないエラーって,関係ないところに原因があったりするよね
とりあえずで node_modules/
と .nuxt/
を削除しました (追記: 多分 dist/
も消してた)
rm -r node_modules
rm -r .nuxt
んで .eslintrc.js
をこんな感じにした
module.exports = {
root: true,
env: {
browser: true,
node: true
},
extends: [
'@nuxtjs/eslint-config-typescript',
'plugin:prettier/recommended',
'prettier/vue',
],
plugins: ['vue']
}
んで npm install
してもう一回ビルドかけたら直った.
どれが原因でプロセスが死ななかったのかはわからなかったが,(自分含め) 誰かがいつか別のバージョンとかで引っかかるかもしれないので一応記事にしておく.
追記 (2020/1/2)
案の定引っかかりました.
今回は再現しやすかったので,ちょっと真面目に原因特定しようとしました.
こういうの(fork-ts-checker-webpack-plugin の issue についたコメント) も見つけましたが,少なくとも develop ブランチではビルド時に型チェックしたかったので,この方法は採用しないことにしました.
### 解決策(?原因は不明のまま(恐らくwebpackの設定)
dist/
フォルダを消す
build
にしろ generate
にしろ,nuxt-ts generate
で生成される dist/_nuxt
フォルダ内の js ファイルを見ているようで,それを消したら fork-ts-checker-webpack-plugin の暴走はとまりました.
webpack の設定真面目にしなくていいのが nuxt の売りの一つだと勝手に思ってたのですが,ちゃんと勉強しないといけないなと思いました.
ちゃんと理解したらまた追記します.
追記(2020/3/19) 原因特定
ありがたいことにコメントをいただきました。記事にしておくとこういうのが嬉しいですね。
typecheck に eslint を使っているのですが,eslint の ignorePath
を通していなかったため,生成された dist/_nuxt
や public/
,フォルダまで型チェックがなされており,そこで循環参照を起こして無限ループしていたようです。
上記で /dist
を消したり /node_modules
を消したりするとうまくいっているのはそのためでしょうね。
解決策
-
.eslintignore
ファイルにnode_modules/
,dist/
,public/
を記述してそれらフォルダを無視する -
.eslintrc
でignorePattern
にnode_modules/
,dist/
,public/
を設定してそれらフォルダを無視する
https://eslint.org/docs/user-guide/configuring#ignorepatterns-in-config-files
これで typecheck 時に無限ループに陥ることが防げるようです。