这是我想要的,但可能不会:
使用node.js和express以及ejs,我想在我的客户端目录中编写常规HTML文件时,服务器端包含HTML模板块。如果我可以将变量传递给HTML文档中的包含,那也很酷。
Sooo之类的东西:
<!doctype html>
<html>
<head>
<%include head, ({title: "Main Page"}) %>
</head>
<body>
<% include header, ({pageName: "Home", color: "red"}) %>
...
<<% include footer%>>
</body>
</html>
节点世界中有没有像这样工作的东西?或者任何接近但可能适合此功能的东西?我不会完全按照这里指出的方式使用它,但这是我正在寻找的功能。
我已经研究过玉器,车把,灰烬和ejs,而且ejs似乎最接近。也许其中一个已经这样做了,但我只是对实现感到困惑。
任何建议都会很棒!
答案 0 :(得分:14)
好的,我明白了......
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'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 authoring的上下文中执行。
++++ +++++糟糕 好吧,我几乎全部。我忘记了我也希望能够将变量传递给模板中的include。我还没试过......有什么想法吗?
++++ +++++更新
好的我明白了。
This讨论明确表示,我想我对ejs的运作方式还不太了解。
我已将index.html更改为以变量声明开头:
{{
var pageTitle = 'Project Page';
var projectName = 'Project Title';
}}
然后你可以在include中调用这些变量,无论它们嵌套的程度如何。
例如,index.html包含start.html,其中包含header.html。在标题.html中我可以在标题内调用{{= projectName}},即使它是在index.html中声明的。
我把整件事放在github上。
答案 1 :(得分:3)
我建议nunjucks或pejs。 Nunjucks受到jinja的启发,而pejs只是ejs +继承,阻止和文件支持。
pejs目前在空间咀嚼方面存在一些问题,但它仍然非常有用。在这两者中,我更喜欢nunjucks附带的分离层。
Jade非常酷,并且具有您正在寻找的功能集,但它具有非常独特的语法。 jade参考:template inheritance,blocks,includes
答案 2 :(得分:2)
保持简单,使用 templatesjs
这可以使用 templatesjs
轻松完成html文件[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将自动包含header.html和footer.html所有你需要做的就是渲染页面标题。
可以找到一个很好的帮助here
$ npm install templatesjs
强> 希望这有助于
答案 3 :(得分:0)
Jade允许服务器端包含HTML块,任何本地范围的变量都将传递给包含的jade模板。但是如果你想这样做,这两个文件必须是jade语法格式而不是原始HTML。
您想要传递的任何变量都可以添加到locals对象中。
答案 4 :(得分:0)
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,请参阅最后 代码行