res.render 確認など

なんか少し前にもごもごと確認入れたような気もするのですが構わず確認。
view.js で定義されてる res.render は直下で定義されている private な _render を呼び出します。

res.render = function(view, opts, fn, parent, sub){
  // support callback function as second arg
  if ('function' == typeof opts) {
    fn = opts, opts = null;
  }

  try {
    return this._render(view, opts, fn, parent, sub);
  } catch (err) {

で、_render 手続きでは compile して

  // View lookup
  options.hint = app.enabled('hints');
  view = exports.compile(view, app.cache, cid, options);

その中でセットされる view.fn を call します。

  // render
  var str = view.fn.call(options.scope, options);

compile 手続きの確信部分が以下。

  // compile
  options.filename = view.path;
  view.fn = view.templateEngine.compile(view.contents, options);
  cache[cid] = view;
  
  return view;
};

view.templateEngine.compile って何だ。とりあえず templateEngine で grep したら以下がナニ。

View.prototype.__defineGetter__('templateEngine', function(){
  var ext = this.extension;
  return cache[ext] || (cache[ext] = require(this.engine));
});

engine ってのが出てきた。コンストラクタなのかどうかな手続きで以下な初期化。

  this.engine = this.resolveEngine();

resolvEngine が以下、なのかなぁ。

View.prototype.resolveEngine = function(){
  // Explicit
  if (~this.basename.indexOf('.')) return extname(this.basename).substr(1);
  // Inherit from parent
  if (this.parent) return this.parent.engine;
  // Default
  return this.defaultEngine;
};

defaultEngine は以下らしい。

  this.defaultEngine = options.defaultEngine;

ぬ。defaultEngine で find-grep してみたら以下らしい。

find . -type f -print0 | xargs -0 -e grep -nH -e defaultEngine
./view.js:77: *   - `defaultEngine` default template engine
./view.js:382:  options.defaultEngine = app.set('view engine');
./view/view.js:45:  this.defaultEngine = options.defaultEngine;
./view/view.js:88:  return this.defaultEngine;

382 なナニは _render な記述らしい。'view engine' で find-grep してみたのが以下。

find . -type f -print0 | xargs -0 -e grep -nH -e 'view engine'
./view.js:256:    , viewEngine = app.set('view engine')
./view.js:268:  // utilize "view engine" option
./view.js:381:  // "view engine" setting
./view.js:382:  options.defaultEngine = app.set('view engine');
./view/view.js:76: * Resolve view engine.

'view engine' で example 配下を find-grep してみるか。

find . -type f -print0 | xargs -0 -e grep -nH -e 'view engine'
./route-separation/app.js:14:app.set('view engine', 'ejs');
./error-pages/app.js:13:app.set('view engine', 'jade');
./flash/app.js:18:app.set('view engine', 'ejs');
./auth/app.js:16:app.set('view engine', 'ejs');
./json-config/config.js:7:    'view engine': 'jade'
./jade/app.js:32:app.set('view engine', 'jade');
./ejs/app.js:17:app.set('view engine', 'html');
./blog/app.js:14:app.set('view engine', 'jade');
./github/app.js:14:app.set('view engine', 'jade');
./mvc/mvc.js:39:  app.set('view engine', 'html');
./partials/app.js:17:app.set('view engine', 'jade');
./markdown/app.js:29:app.set('view engine', 'md');
./extending-templates/app.js:17:app.set('view engine', 'html');
./layout-control/app.js:18:app.set('view engine', 'ejs');

を、成程。とは言え ejs とか jade とかな engine ってどこに記述されてるのだろう。って package.json 見てみたら devDepandencies に以下な記述がありますな。

  "devDependencies": {
    "connect-form": "0.2.1",
    "ejs": "0.4.2",
    "expresso": "0.9.2",
    "hamljs": "0.5.1",
    "jade": "0.16.2",
    "stylus": "0.13.0",
    "should": "0.3.2",
    "express-messages": "0.0.2",
    "node-markdown": ">= 0.0.1",
    "connect-redis": ">= 0.0.1"
  },

しかしこの devDepandencies というナニは一体どーゆー意味なのだろうか。ちょっと確認必要ッスな。