LineBotAPI+Heroku+docomoAPI+Node.jsでBotをつくるをやったときに、デプロイまでにいろいろつまづいたのでデプロイしてちゃんと動くようになったところまでのメモ。
ディレクトリ構成
app/
├ .babelrc
├ .eslintrc
├ .gitignore
├ Procfile
├ index.js
├ package.json
├ src/
│ └ index.js
├ webpack.config.base.js
ES2015+babel+webpackの構成。
app/src/index.js
をbuildしてapp/index.js
に吐き出すような感じ。
ファイルとして見慣れなかったのは、Procfileというファイルで、アプリケーションで管理するプロセスを記述する。また、アプリケーションのルートディレクトリに配置する必要がある。
Herokuでは、process type
にweb
を指定しないとダメ。
web: node index.js
参考
- https://devcenter.heroku.com/articles/getting-started-with-nodejs#define-a-procfile
- http://qiita.com/7kaji/items/6a59977d2ad85604e7fd
package.json
アプリで採用するNodeのバージョンや、使用モジュールをdependencies
に漏れなく記述してないとうまく実行されない。
{
"name": "app-name",
"version": "0.0.1",
"private": true,
"engines": {
"node": "v4.2.x",
"npm": "3.8.x"
},
...
"dependencies": {
...
"async": "^2.0.0-rc.3",
"body-parser": "^1.15.0",
"express": "^4.13.4",
"request": "^2.72.0"
}
}
webpack.config.base.js
webpackを使ってNode.js向けにjsを生成するときは、
module.exports = {
...
target: "node",
...
}
の記述が必要。記述がないと、
Error: no window object present
のエラーが出る。
また、requestを使っていると、
Module not found: Error: Cannot resolve module 'fs' ...
Module not found: Error: Cannot resolve module 'net' ...
Module not found: Error: Cannot resolve module 'tls' ...
みたいなエラーがたくさん出たので、下記を追加。
module.exports = {
...
node: {
fs: 'empty',
net: 'empty',
tls: 'empty'
},
...
}
参考:https://github.com/request/request/issues/1529
さらに、request関連で
Error: define cannot be used indirect
とエラーが出たので、以下を追加。
module: {
noParse: /node_modules\/json-schema\/lib\/validate\.js/,
...
}
参考: https://github.com/request/request/issues/1920
デプロイ方法
開発が終わったら、Herokuサイトにも書いて通り、
git add .
git commit -am 'make it better'
git push heroku master
でデプロイします。
うまくいったら、Heroku上でアプリが正しく動いているか確認します。
heroku logs --tail
ログを見ると、どこでエラーが起こっているかなど確認できるのでデバッグに使えます。