linebotづくりでHerokuを使っていた。
現象
ある日herokuにpushしたらlinebotが動かなくなった。
heroku logs --tail
でログを確認すると以下のエラー。
internal/modules/cjs/loader.js:582
throw err;
^
Error: Cannot find module 'react-dev-utils/crossSpawn'
...
自身のコードを実績あるところまで戻しても同様。ナニモシテナイのに!!
原因
npm install --save-dev "request"
でインストールしたrequest
モジュールが動かなくなってた。
解決
npm uninstall --save-dev request
npm install --save request
としたら動くようになった。
追いログ
herokuのNode.jsトラブルシューティングを見ると、ヒントになる記事があった。
記事曰く、herokuはpushのたびに以下のコマンドを実施するらしい。
$ rm -rf node_modules
$ npm install --quiet --production
$ npm start
これをローカル環境で実施すると、確かに同じ現象が発生した。
`npm install --quiet --production`
としていて、これだと`devDependencies`(--save-devでインストールしてるほう)のインストールをしてくれないらしい。
## なんである日動かなくなったのか
~~正直謎。~~
~~動作で使うモジュールを`--save-dev`していたのは問題だ。でも最初はそれでも動作していたのに、ある日動かなくなった。~~
~~気づいたのは、ローカルのnodeがversion 8でherokuも同じだったが、herokuのmasterが11月1日にnodeのversion 10に上がってた。(この前後で動く・動かないが変わっていた)~~
~~>Author: Jeremy Morrell <morrell.jeremy@gmail.com>~~
~~>Date: Thu Nov 1 10:37:28 2018 -0700~~
~~>~~
~~> Update to the latest LTS version of Node~~
~~これが影響している気もしたのだが、`npm`の`production`オプションは前からある。~~
~~結局**突然動かなくなった原因**はわからなかった。~~
~~ただログから追うことができたので、追い方は分かった。~~
分かった。私のせいだ(当然)。
Herokuのサンプルをそのまま改変して使っていたが、Herokuのサンプルでは`request`が`devDependencies`に入っている。
`npm install`して開発を開始したが、途中`require(request)`する修正を入れた。
ローカル環境では`npm install`してあるのでnode_modules配下に`request`が存在するから何もせず使えていたが、リモート環境は`npm install --quiet --production`でやるから`request`がなくエラーになっていた。