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
がなくエラーになっていた。