BackboneJSで使うテンプレートをJSTテンプレート化して、外部管理してみた。Grunt + Bowerも使ってるよ
Backboneを使ってると、underscoreのテンプレートを外部ファイル化したいと思う時があります。 html内に書いてると、ファイル容量も増えるし、見た目もあれだし。。 使わない可能性もあるし、、ということで、JSTテンプレートと呼ばれるものを使ってみようと思いました。 また、同時にbowerでjsライブラリを読み込み、gruntでJSTテンプレートへコンパイルするなどしてみました。
npm パッケージインストール
$ npm install -g grunt-cli $ npm install bower grunt-contrib-js
javascript モジュールインストール
$ vim bower.json { "name": "sample", "version": "0.0.0", "dependencies": { "jquery": "~2.0.0", "underscore": "latest", "backbone": "latest" } }
$ ./node_modules/.bin/bower install
これで、以下をhtmlに書く事で、jquery等が使えるようになります。
<script src='/src/javascripts/vender/jquery/jquery.min.js'></script> <script src='/src/javascripts/vender/underscore/underscore-min.js'></script> <script src='/src/javascripts/vender/backbone/backbone-min.js'></script>
grunt 実行準備
$ vim package.json { "name": "my-project-name", "version": "0.1.0", "devDependencies": { "grunt": "~0.4.2", "grunt-contrib-jst": "~0.5.1" } }
jstコンパイル設定
$ vim Gruntfile.js module.exports = function(grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), jst: { compile: { options: { templateSettings: { interpolate : /\{\{(.+?)\}\}/g }, processName: function(filename) { return filename.replace(/(src\/templates\/|.html)/g, ''); } }, files: { 'src/javascripts/templates/templates.js': [ 'src/templates/**/*.html' ] } } } }); grunt.loadNpmTasks('grunt-contrib-jst'); }
src/templates以下に作成したhtmlテンプレートを src/javascripts/templates/templates.jsとしてコンパイルすると設定完了。 あとは、htmlテンプレートを準備して、コンパイルを実行するだけ
JSTテンプレートとして使いたい、HTMLテンプレートを準備する
$ cat src/templates/test.html <h1>JSTを使ってみた</h1> <p>やぁ <%- name %>さん</p>
grunt実行
$ grunt jst
コンパイル後のファイル
$ cat src/javascripts/templates/templates.js this["JST"] = this["JST"] || {}; this["JST"]["test"] = function(obj) { obj || (obj = {}); var __t, __p = '', __e = _.escape; with (obj) { __p += '<h1>JSTを使ってみた</h1>\n<p>やぁ ' + __e( name ) + '</p>'; } return __p };
こんな感じになるのか、まぁこれで src/javascripts/templates/templates.jsが作成されますので、htmlで読み込む設定を書くと使えるようになります。
JSTテンプレートを使う
準備しただけでは、まだ使えないので Backbone,Underscoreで、JSTテンプレートを使う記述をします。
$ cat src/javascripts/test.js var helloView = Backbone.View.extend({ template: JST['test'], //JST template test render: function() { //templateに渡した、nameの値が、先ほどのテンプレート内の<%- name %>に展開されます。 $('body').html(this.template({name: 'shinofara'})); } });
サンプルHTML準備
$ cat index.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <link rel="stylesheet" href="css/bass.css" /> </head> <body> テストだよ <script src='/src/javascripts/vender/jquery/jquery.min.js'></script> <script src='/src/javascripts/vender/underscore/underscore-min.js'></script> <script src='/src/javascripts/vender/backbone/backbone-min.js'></script> <script src='/src/javascripts/templates/templates.js'></script> <script src='/src/javascripts/test.js'></script> <script> $(function() { var hellow = new helloView(); hellow.render(); }); </script> </body> </html>
ブラウザで確認
http://localhost すると、テストだよが表示された後、JSTテンプレートに書いた内容に置き換わるはず