13

これは私が欲しいものですが、おそらく持つことはできません:

node.jsとexpress、そしておそらくejsを使用して、クライアントディレクトリに通常のHTMLファイルを書きながら、HTMLのテンプレートブロックをサーバー側にインクルードしたいと思います。また、HTML ドキュメントからインクルードに変数を渡すことができればすばらしいと思います。

すっごく次のようなもの:

 <!doctype html>
 <html>
   <head>
    <%include head, ({title: "Main Page"}) %>   
   </head>
   <body>
      <% include header, ({pageName: "Home", color: "red"}) %>
    ...
      <<% include footer%>>
   </body>
 </html>

ノードの世界でこのように機能するものはありますか? または、近いもので、この機能に適応できるものはありますか? ここに示されている方法で正確に使用することはありませんが、これは私が探している機能です。

ジェイド、ハンドルバー、エンバー、ejs を調べたところ、ejs が最も近いようです。たぶん、これらの1つはすでにこれを行っていますが、実装について混乱しています。

どんな提案も素晴らしいでしょう!

4

4 に答える 4

14

はい、分かりました...

サーバー.js

 var express =      require('express');
 var server  =      express();
 var ejs = require('ejs'); 
 ejs.open = '{{'; 
 ejs.close = '}}';


 var oneDay = 86400000;
 server.use(express.compress());

 server.configure(function(){
   server.set("view options", {layout: false});  
   server.engine('html', require('ejs').renderFile); 
   server.use(server.router);
   server.set('view engine', 'html');
   server.set('views', __dirname + "/www");
 });


 server.all("*", function(req, res, next) {
     var request = req.params[0];

         if((request.substr(0, 1) === "/")&&(request.substr(request.length - 4) === "html")) {
         request = request.substr(1);
         res.render(request);
     } else {
         next();
     }

 });

 server.use(express.static(__dirname + '/www', { maxAge: oneDay }));

 server.listen(process.env.PORT || 8080);

/www には、次の .html ファイルがあります。

index.html

      {{include head.html}}
 {{include header.html}}

 <p class="well">Hello world!</p>

 {{include footer.html}}

head.html

 <!DOCTYPE html>
 <!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
 <!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
 <!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
 <!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
     <head>
         <meta charset="utf-8">
         <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
         <title></title>
         <meta name="description" content="">
         <meta name="viewport" content="width=device-width">

         {{include include.css.html}}

         <script src="js/vendor/modernizr-2.6.2.min.js"></script>
     </head>
     <body>     

include_css.html

      <link rel="stylesheet" href="css/normalize.css">
      <link rel="stylesheet" href="css/bootstrap.css">
      <link rel="stylesheet" href="css/bootstrap-responsive.css">
      <link rel="stylesheet" href="css/main.css">

header.html

 <div class="well">
      <h1>HEADER</h1>
 </div>

footer.html

         <div class="well">
             <h1>FOOTER</h1>
         </div>


         <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
         <script>window.jQuery || document.write('<script src="js/vendor/jquery-1.9.1.min.js"><\/script>')</script>
         <script src="js/plugins.js"></script>
         <script src="js/bootstrap.min.js"></script>
         <script src="js/main.js"></script>

         <!-- Google Analytics: change UA-XXXXX-X to be your site's ID. -->
         <script>
             var _gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']];
             (function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
             g.src='//www.google-analytics.com/ga.js';
             s.parentNode.insertBefore(g,s)}(document,'script'));
         </script>
     </body>
 </html>

インクルードや静的コンテンツに含まれていても、すべてが通過します。それはすべて html ファイルで実行され、バニラの Web オーサリングのようなコンテキストで実行されます。

++++おっと++++++まあ、ほとんどすべてです。テンプレートからインクルードに変数を渡せるようにしたいことも忘れていました。私はまだそれを試していません...何かアイデアはありますか?

++++アップデート+++++

わかりました。

この議論で明らかになったのは、ejs がどのように機能するかについて十分に知らなかっただけだと思います。

変数宣言から始めるように index.html を変更しました。

 {{
    var pageTitle = 'Project Page';
    var projectName = 'Project Title';
 }}

そして、これらの変数がどれほど深くネストされていても、インクルード内からこれらの変数を呼び出すことができます。

たとえば、index.html には、header.html を含む start.html が含まれます。ヘッダー .html 内では、ヘッダー内で {{= projectName}} を呼び出すことができますが、それは index.html 内で宣言されています。

全体をgithubに置きました。

于 2013-05-04T09:11:33.017 に答える
0

Jade では、HTML ブロックのサーバー側インクルードが許可されており、ローカル スコープの変数はインクルードされた jade テンプレートに渡されます。ただし、これを行う場合は、両方のファイルを生の HTML ではなく、jade 構文形式にする必要があります。

渡したい変数はすべて locals オブジェクトに追加できます。

于 2013-05-04T08:53:10.293 に答える