Включить блоки HTML Использование node.js

Это то, что я хочу, но, вероятно, не могу:

Используя node.js и express и, возможно, ejs, я хотел бы, при написании обычного файла HTML в моем клиенте dir, server-side-include блок шаблонов HTML. Было бы здорово, если бы я мог передавать переменные в include из документа HTML.

Сооо что-то вроде:

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

Есть ли что-нибудь в мире node, который работает так? Или любая вещь, которая приближается и может быть адаптирована для этой функции? Я бы не использовал его точно так, как указано здесь, но это функциональность, которую я ищу.

Я изучил нефрит, рули, ember и ejs, и ejs, кажется, ближе всего. Возможно, один из них делает это уже, но я просто запутался в реализации.

Любые предложения были бы замечательными!

Ответ 1

ОК, я понял...

server.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 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 файлах и в контексте, который похож на создание веб-браузера.

++++ К сожалению +++++ Ну, я почти все это. Я забыл, что я также хотел иметь возможность передавать переменные в include из шаблонов. Я еще не пробовал... какие-нибудь идеи?

++++ Update +++++

Хорошо, я понял это.

В этом обсуждении было ясно, что я просто не знал достаточно о том, как работали ejs.

Я изменил index.html, чтобы начать с объявлений переменных:

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

а затем вы можете вызывать эти переменные изнутри включений, независимо от того, насколько глубоко они вложены.

Так, например, index.html включает start.html, который включает header.html. В заголовке .html я могу вызвать {{= projectName}} в заголовке, даже если он был объявлен внутри index.html.

Я положил все это на github.

Ответ 2

Я бы порекомендовал nunjucks или pejs. Nunjucks вдохновлен джиньей, а pejs - это только поддержка ejs + наследования, блока и файлов.

В настоящее время у pejs есть некоторые проблемы с пространственным клонированием, но это все еще очень полезно. Из двух я предпочитаю разделительный слой, который поставляется с nunjucks.

Jade довольно круто и имеет набор функций, который вы ищете, но имеет очень уникальный синтаксис. Ссылки на jade: наследование шаблонов, блоки, includes

Ответ 3

Держите его простым, используйте templatesjs

это можно сделать легко, используя templatesjs

html file [index.html]:

   <head>
    <title> <%title%> </tile>
</head>

<body>
    <%include header.html%>
    ........
    <%include footer.html%>
</body>
</html>

теперь в node.js файле:

var tjs = require("templatesjs")
fs.readFile("./index.html", function(err,data){ // provided the file above is ./ index.html
    if(err) throw err;
    tjs.set(data); // invoke it
    tjs.render("title", "home");//render the page title

});

все готово. templatesjs witll автоматически включает в себя header.html и footer.html все, что вам нужно сделать, это отобразить заголовок страницы.

можно найти хорошую помощь здесь

  • установка: $ npm install templatesjs

Надеюсь, что это поможет

Ответ 4

Ну, я могу предложить самый простой способ.

использование templatesjs будет самым простым вариантом здесь, это новый модуль, который делает такие вещи такими легкими

предположим, что мы хотим включить header.html внутри index.html

HTML

<body>
    <%include header.html%>
</body>

node.js

var temp = require('templatesjs');
fs.readFile("./index/html), function(err,data){
    if(err) throw err;
    var output = temp.set(data);
    res.end(output);
 });

не может найти ничего проще, чем это. установить templatesjs

$ npm install templatesjs

Ответ 5

Jade позволяет серверной стороне включать в себя HTML-блоки, и любая переменная с локальными областями будет передана включенному шаблону нефрита. Но оба файла должны быть в формате синтаксиса jade, а не необработанном HTML, если вы хотите это сделать.

Любая переменная, которую вы хотели бы передать, может быть добавлена ​​только к объекту locals.