Включить блоки HTML с помощью node.js
Это то, что я хочу, но, вероятно, не могу иметь:
Используя 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, кажется, ближе всего. Может быть, один из них уже делает это, но я просто запутался в реализации.
Любые предложения будут великолепны!
5 ответов
Ладно, я понял...
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-файлах и в контексте, который напоминает веб-авторинг ванили.
++++ Упс +++++ Ну, я почти все это. Я забыл, что я также хотел иметь возможность передавать переменные во включаемые из шаблонов. Я еще не пробовал... есть идеи?
++++ Update +++++
Хорошо, я понял это.
Эта дискуссия прояснила, я думаю, я просто недостаточно знал о том, как работают ejs.
Я изменил index.html, чтобы начать с объявления переменных:
{{
var pageTitle = 'Project Page';
var projectName = 'Project Title';
}}
и затем вы можете вызывать эти переменные изнутри, независимо от того, насколько глубоко они вложены.
Так, например, index.html включает start.html, который включает header.html. В заголовке.html я могу вызвать {{= projectName}} внутри заголовка, даже если он был объявлен внутри index.html.
Я положил все это на GitHub.
Я бы порекомендовал nunjucks или pejs. Nunjucks вдохновлен цзиндзя, а pejs - просто ejs + наследование, блокировка и поддержка файлов.
У pejs на данный момент есть проблемы с пространственным чампингом, но он все еще довольно полезен. Из двух я предпочитаю разделительный слой, который поставляется с нуньюками.
Jade довольно крутой и имеет набор функций, который вы ищете, но у него очень уникальный синтаксис. Список литературы для Jade: шаблон наследования, блоки, включает в себя
Будьте проще, используйте 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
});
вы сделали. Шаблоны автоматически включают header.html и footer.html, все что вам нужно сделать, это отобразить заголовок страницы.
хорошую помощь можно найти здесь
- установка:
$ npm install templatesjs
Надеюсь это поможет
Ну, я могу предложить самый простой способ.
здесь будет проще всего использовать 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);
});
не могу найти ничего проще, чем это. установить шаблоны js
$ npm install templatesjs
Jade допускает включение на стороне сервера блоков HTML, и любая переменная области видимости будет передаваться во включенный шаблон Jade. Но оба файла должны быть в формате синтаксиса Jade, а не в формате HTML, если вы хотите это сделать.
Любая переменная, которую вы хотите передать, может быть просто добавлена в объект locals.
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, см. последнюю строку кода