expressモジュールのexpressコマンドでテンプレートを作った場合に、なぜ「node app.js」コマンドで動かないのか。それは、express4の場合、bin/wwwというファイルを起動することでこのアプリケーションが動くようになっているからである。
package.jsonの中にはこう書かれている。つまり、bin/wwwを最初に起動するという指示がされている。(なお、このままでもherokuで動くので書き換える必要はない。)
“scripts”: {
“start”: “node ./bin/www”
},
ではwwwファイルは何をしているのか?最初に次のjsが記されている。このjsはつまり、アプリケーションのルートディレクトリ内のapp.jsをrequireしている。
var app = require(‘../app’);
requireされる先のapp.jsファイルには何が書かれているか。重要なのは最後に書かれている次の一文である。
module.exports = app;
exportは簡単にいうとreturnに近い。ここではapp.jsがrequireされたときに最後の部分でappを返すのである。これがどこに返されるか?元のbin/wwwを再度見てみる。
var app = require(‘../app’);
つまり、appという変数に、app.jsの中で様々処理を行ったappインスタンスを入れている。
そしてその後、wwwファイル内ではappに対して、大きく次の3つの処理をしている。httpサーバーを作成し、app(これはexpressアプリケーションだ)と結びつけ、そして、できたサーバーにポートを指定している。
var http = require(‘http’);
var server = http.createServer(app);
server.listen(port);
まとめ
なぜアプリケーションのルートディレクトリにあるapp.jsをいつもどおりにnode app.jsと動かしても正常な動きをしないのか。つまり、サーバーを作って、htmlをレンダリングして…という一連の動作が起きないのか。それはこのアプリケーションがwwwを起動することが前提の作りになっているからである。そしてwwwはapp.jsの中で作られるexpressアプリケーションにhttpサーバーを関連付けている。
今後の開発は基本的にapp.jsを更新していけばいい。ただしapp.jsに全てを書くのではなくて、app.jsではリクエストに対する処理をrouteの中にあるjsを起動することを指定する。そしてそのjsがjadeファイルをrenderすることでクライアント側にhtmlファイルを返す。
One comment