2016年2月29日月曜日

node express ectにbootstrapを組み入れてみる

node express ectにbootstrapを組み入れてみる。

まず、次のサイトにアクセスする。

http://getbootstrap.com/


"Download Bootstrap"ボタンを押す。


"Download Bootstra"ボタンを押すとzipファイル(自分がダウンロード時のファイル名は、"bootstrap-3.3.6-dist.zip"でした。) をダウンロードする。

そして、ダウンロードしたzipファイルを解凍する。


この解凍されたcss、fonts、jsのフォルダをnodeのプロジェクトのpublicフォルダにコピーする。
nodeのプロジェクトのpublicフォルダには、はじめからjs及びcss用のフォルダとして、それぞれjavascripts、stylesheetsフォルダがあるが、今回はbootstrapのために、これらのフォルダは使用せず、ダウンロードしたzipファイルから解凍されたcss、fonts、jsのフォルダをそのまま、コピーすることにする。


コピー後


そして、今回は組み込んだbootstrapの動作確認のために、bootstrapのExsamplesにあるBootstrap themeのButtonsの部分を取り込んで正しく表示できるようにする。
* Examplesの中身を確認する方法は以下の記事を参照のこと。
  Bootstrapのサンプルを見る

Bootstrap themeのButtons部分のコードは次の通り。
これをindex.ectファイル内に組み込む。

  1. <div class="page-header">
  2. <h1>Buttons</h1>
  3. </div>
  4. <button class="btn btn-lg btn-default" type="button">Default</button>
  5. <button class="btn btn-lg btn-primary" type="button">Primary</button>
  6. <button class="btn btn-lg btn-success" type="button">Success</button>
  7. <button class="btn btn-lg btn-info" type="button">Info</button>
  8. <button class="btn btn-lg btn-warning" type="button">Warning</button>
  9. <button class="btn btn-lg btn-danger" type="button">Danger</button>
  10. <button class="btn btn-lg btn-link" type="button">Link</button>
  11. <button class="btn btn-default" type="button">Default</button>
  12. <button class="btn btn-primary" type="button">Primary</button>
  13. <button class="btn btn-success" type="button">Success</button>
  14. <button class="btn btn-info" type="button">Info</button>
  15. <button class="btn btn-warning" type="button">Warning</button>
  16. <button class="btn btn-danger" type="button">Danger</button>
  17. <button class="btn btn-link" type="button">Link</button>
  18.  
  19. <button class="btn btn-sm btn-default" type="button">Default</button>
  20. <button class="btn btn-sm btn-primary" type="button">Primary</button>
  21. <button class="btn btn-sm btn-success" type="button">Success</button>
  22. <button class="btn btn-sm btn-info" type="button">Info</button>
  23. <button class="btn btn-sm btn-warning" type="button">Warning</button>
  24. <button class="btn btn-sm btn-danger" type="button">Danger</button>
  25. <button class="btn btn-sm btn-link" type="button">Link</button>
  26.  
  27. <button class="btn btn-xs btn-default" type="button">Default</button>
  28. <button class="btn btn-xs btn-primary" type="button">Primary</button>
  29. <button class="btn btn-xs btn-success" type="button">Success</button>
  30. <button class="btn btn-xs btn-info" type="button">Info</button>
  31. <button class="btn btn-xs btn-warning" type="button">Warning</button>
  32. <button class="btn btn-xs btn-danger" type="button">Danger</button>
  33. <button class="btn btn-xs btn-link" type="button">Link</button>


いよいよ、動作確認。
ブラウザで表示すると次のようになった。組み込んだbootstrapが、正しく動いている。



今回のbootstrapの動作確認に関連あるソースコードは以下の通り。

=== app.js ===
変更部分はexpressコマンドでプロジェクト生成後にect用に変更した13〜18行目

  1. var express = require('express');
  2. var path = require('path');
  3. var favicon = require('serve-favicon');
  4. var logger = require('morgan');
  5. var cookieParser = require('cookie-parser');
  6. var bodyParser = require('body-parser');
  7.  
  8. var routes = require('./routes/index');
  9. var users = require('./routes/users');
  10.  
  11. var app = express();
  12.  
  13. // ECT view engine setup
  14. var ECT = require('ect');
  15. var ectRenderer = ECT({ watch: true, root: __dirname + '/views', ext: '.ect'});
  16. app.set('views', path.join(__dirname, 'views'));
  17. app.set('view engine', 'ect');
  18. app.engine('ect', ectRenderer.render);
  19.  
  20. // uncomment after placing your favicon in /public
  21. //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
  22. app.use(logger('dev'));
  23. app.use(bodyParser.json());
  24. app.use(bodyParser.urlencoded({ extended: false }));
  25. app.use(cookieParser());
  26. app.use(express.static(path.join(__dirname, 'public')));
  27.  
  28. app.use('/', routes);
  29. app.use('/users', users);
  30.  
  31. // catch 404 and forward to error handler
  32. app.use(function(req, res, next) {
  33.     var err = new Error('Not Found');
  34.     err.status = 404;
  35.     next(err);
  36. });
  37.  
  38. // error handlers
  39.  
  40. // development error handler
  41. // will print stacktrace
  42. if (app.get('env') === 'development') {
  43.     app.use(function(err, req, res, next) {
  44.         res.status(err.status || 500);
  45.         res.render('error', {
  46.             message: err.message,
  47.             error: err
  48.         });
  49.     });
  50. }
  51.  
  52. // production error handler
  53. // no stacktraces leaked to user
  54. app.use(function(err, req, res, next) {
  55.     res.status(err.status || 500);
  56.     res.render('error', {
  57.         message: err.message,
  58.         error: {}
  59.     });
  60. });
  61.  
  62. module.exports = app;


=== index.js ===
変更部分はなし。expressコマンドでプロジェクト生成後のそのまま。ただ載せているだけ。

  1. var express = require('express');
  2. var router = express.Router();
  3.  
  4. /* GET home page. */
  5. router.get('/', function(req, res, next) {
  6.     res.render('index', { title: 'Express' });
  7. });
  8.  
  9. module.exports = router;


=== error.ect ===
ectのエラー出力のためのテンプレート。bootstrapとは関係ない。ただ載せているだけ。

  1. <html>
  2. <head>
  3.     <title>Error <%= @error.status %>>/title>
  4. </head>
  5. <body>
  6. <span>
  7.     Error Status: <%= @error.status %>
  8.     <hr />
  9.     <pre><%= @error.stack %></pre>
  10. </span>
  11. </body>
  12. </html>


=== footer.ect ===
ectのフッター部分のテンプレート。bootstrapとは関係ない。ただ載せているだけ。

  1. <div id="footer">
  2. <div class="left">
  3. Generated by ECT</div>
  4. <% content 'footer-info' %>
  5. </div>


=== index.ect ===
また、ExapmlesのButtons部分を取り込んでいる。8〜46行目

  1. <% extend 'layout' %>
  2.  
  3. <%= "This is sample" %>
  4.  
  5. <h1>
  6. <%= @title %></h1>
  7. Welcome to <%= @title %>
  8.  
  9.  
  10.  
  11. <div class="page-header">
  12. <h1>
  13. Buttons</h1>
  14. </div>
  15. <button class="btn btn-lg btn-default" type="button">Default</button>
  16. <button class="btn btn-lg btn-primary" type="button">Primary</button>
  17. <button class="btn btn-lg btn-success" type="button">Success</button>
  18. <button class="btn btn-lg btn-info" type="button">Info</button>
  19. <button class="btn btn-lg btn-warning" type="button">Warning</button>
  20. <button class="btn btn-lg btn-danger" type="button">Danger</button>
  21. <button class="btn btn-lg btn-link" type="button">Link</button>
  22.  
  23. <button class="btn btn-default" type="button">Default</button>
  24. <button class="btn btn-primary" type="button">Primary</button>
  25. <button class="btn btn-success" type="button">Success</button>
  26. <button class="btn btn-info" type="button">Info</button>
  27. <button class="btn btn-warning" type="button">Warning</button>
  28. <button class="btn btn-danger" type="button">Danger</button>
  29. <button class="btn btn-link" type="button">Link</button>
  30.  
  31. <button class="btn btn-sm btn-default" type="button">Default</button>
  32. <button class="btn btn-sm btn-primary" type="button">Primary</button>
  33. <button class="btn btn-sm btn-success" type="button">Success</button>
  34. <button class="btn btn-sm btn-info" type="button">Info</button>
  35. <button class="btn btn-sm btn-warning" type="button">Warning</button>
  36. <button class="btn btn-sm btn-danger" type="button">Danger</button>
  37. <button class="btn btn-sm btn-link" type="button">Link</button>
  38.  
  39. <button class="btn btn-xs btn-default" type="button">Default</button>
  40. <button class="btn btn-xs btn-primary" type="button">Primary</button>
  41. <button class="btn btn-xs btn-success" type="button">Success</button>
  42. <button class="btn btn-xs btn-info" type="button">Info</button>
  43. <button class="btn btn-xs btn-warning" type="button">Warning</button>
  44. <button class="btn btn-xs btn-danger" type="button">Danger</button>
  45. <button class="btn btn-xs btn-link" type="button">Link</button>
  46.  
  47. <% block 'footer-info' : %>
  48. <div class="right">
  49. page: sample</div>
  50. <% end %>


=== layout.ect ===
ectのレイアウト外枠。
以下のbootstrapのテンプレート部分(http://getbootstrap.com/getting-started/#download に載っている。)を取り込んでいる。5、6、8〜10行目


  1. <!DOCTYPE html>
  2. <html>
  3.     <head>
  4.         <meta charset="utf-8">
  5.         <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6.         <meta name="viewport" content="width=device-width, initial-scale=1">
  7.         <title><%- @title %></title>
  8.         <link href="css/bootstrap.min.css" rel="stylesheet">
  9.         <% include 'script' %>
  10.         <script src="js/bootstrap.min.js"></script>
  11.     </head>
  12.     <body>
  13.         <% content %>
  14.         <% include 'footer' %>
  15.     </body>
  16. </html>


=== script.ect ===
ectのscriptタグ部分箇所。bootstrapを動作させるために必要なjqueryの読み込みを定義。また、bootstrapsのjsの定義より前の行に定義する必要あり。

  1. <script src="./javascripts/jquery-2.1.4.min.js"></script>


=== package.json ===
bootstrapとは関係ない。ただ載せているだけ。

  1. {
  2.     "name": "bootstrap",
  3.     "version": "0.0.0",
  4.     "private": true,
  5.     "scripts": {
  6.         "start": "node ./bin/www"
  7.     },
  8.     "dependencies": {
  9.         "body-parser": "~1.13.2",
  10.         "cookie-parser": "~1.3.5",
  11.         "debug": "~2.2.0",
  12.         "express": "~4.13.1",
  13.         "jade": "~1.11.0",
  14.         "morgan": "~1.6.1",
  15.         "serve-favicon": "~2.3.0"
  16.     }
  17. }

0 件のコメント :

コメントを投稿