【问题标题】:Include HTML blocks Using node.js使用 node.js 包含 HTML 块
【发布时间】:2013-04-28 11:46:58
【问题描述】:

这是我想要的,但可能没有:

使用 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>

在节点世界中是否有像这样工作的任何东西?或者任何接近并且可能适合此功能的东西?我不会完全按照此处指示的方式使用它,但这是我正在寻找的功能。

我研究过玉、车把、ember 和 ejs,ejs 似乎是最接近的。也许其中之一已经这样做了,但我只是对实现感到困惑。

任何建议都会很棒!

【问题讨论】:

    标签: node.js include express templating 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>
    

    页脚.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 文件上执行的,并且在感觉就像 vanilla web 创作的上下文中执行。

    ++++糟糕+++++ 嗯,我几乎所有的。我忘记了我还希望能够将变量从模板传递到包含中。我还没有尝试过……有什么想法吗?

    ++++更新+++++

    好的,我想通了。

    This 讨论清楚了,我想我只是对 ejs 是如何工作的了解不够。

    我已将 index.html 更改为以变量声明开头:

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

    然后您可以从包含中调用这些变量,无论它们嵌套多深。

    例如,index.html 包含 start.html,而 start.html 又包含 header.html。在 header .html 中,我可以在 header 中调用 {{= projectName}},即使它是在 index.html 中声明的。

    我已经把整个事情放在github上。

    【讨论】:

    • 你必须使用
    【解决方案2】:

    我会推荐nunjuckspejs。 Nunjucks 受 jinja 启发,而 pejs 只是 ejs + 继承、块和文件支持。

    pejs 目前在空间占用方面存在一些问题,但它仍然非常有用。两者中,我更喜欢 nunjucks 自带的分离层。

    Jade 非常酷,并且具有您正在寻找的功能集,但它具有非常独特的语法。玉参考:template inheritanceblocksincludes

    【讨论】:

      【解决方案3】:

      Jade 确实允许服务器端包含 HTML 块,并且任何本地范围的变量都将传递给包含的翡翠模板。但是如果你想这样做,这两个文件必须是jade语法格式而不是原始HTML。

      您想传递的任何变量都可以添加到 locals 对象中。

      【讨论】:

        【解决方案4】:
        var express = require('express');
        var app = express();
        var path = require('path');
        
        app.get("/" ,(req,res) => {
             res.sendFile(path.join(__dirname+'../../templates/index.html')); 
        });
        app.use(express.static(path.join(__dirname+'../../templates/public')));
        

        通过这种方式,您可以在包含 HTML 的文件夹中调用 HTML。 如果你想包含 CSS 和 Javascript 使用 express.static 看最后 一行代码

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-07
          • 2014-02-18
          • 1970-01-01
          • 1970-01-01
          • 2017-12-22
          • 2014-07-17
          • 2013-04-10
          • 1970-01-01
          相关资源
          最近更新 更多