我接管了使用Express在Node上运行的站点的开发。我应该注意到这是我第一次使用Node或Express。出于某种原因,原始开发人员必须不喜欢模板引擎,因为他已完全删除它们。我们在前端基本上都使用了Angular和Firebase,所以我理解为什么我们不会经常将数据注入服务器端的页面。尽管如此,它仍然会很好。
原始版本从未安装模板引擎。相反,他指示Node将views
文件夹视为静态目录。然后他将文件呈现为纯静态文件。例如:
摘自App.js文件:
app.use(express.static(path.join(__dirname, 'views')));
摘自路线档案:
router.get("/", function(request, response) {
response.render("index.html");
});
我真的不想在此时添加模板引擎并弄乱路线。虽然我严重怀疑我需要经常从服务器端注入数据,如果有的话,我想知道我会怎么做。
我唯一能想到的就是这样......
router.get("/", function(request, response) {
var data = request.query.someVariable;
var fileContents = fs.readFileSync('../views/index.html', 'utf8')
fileContents = fileContents.replace("$SomeDelim", data);
response.send(fileContents);
});
那不是那么漂亮。没有使用模板引擎有更好的方法吗?
答案 0 :(得分:5)
我不认为你的问题有正确的答案,但是让我作为一个沉重的Express / Node(和Angular)用户给你我的意见。
您似乎不想使用模板引擎,因为您的模板几乎是静态的,但并非完全如此。后者在Angular项目中非常常见,因为99.9%的视图逻辑发生在前端。我同意您有时需要在主要Angular引导页面或电子邮件模板中引入变量。
您对文件内容进行替换的建议不一定是坏的,但fs.readFileSync
是。这将阻止您的功能并阻止脚本的执行,等待文件系统。我会使用fs.readFile
代替回调函数。这样,Node的事件循环可以在文件系统打开文件时继续执行其他操作。
我还想注意,对整个文件进行替换会导致Node将整个文件加载到内存中(可能因为替换而导致两次),对于较大的文件应该避免使用。然后,您希望逐行进行。我现在不认为这对你来说真的很重要。
我的建议是添加一个简单的模板引擎。为什么?因为它运行良好,因为它已经记录,因为程序员知道如何使用它,因为它易于实现,并且因为一些较小的模板引擎完全符合您的建议。
我个人会推荐Hogan.js,这是一个简单的模板引擎,由各种语言的程序员知道,主要做一些你想要的简单替换。 Hogan基本上替换了这样的变量:<div>{{variable}}</div>
。它有一种非常简单的切换方式&#34; if / else&#34;和一些简单的循环。这基本上都是。
您可以更改Express应用以包含以下内容(并且您将删除现有的静态视图&#39;声明):
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hjs');
使用Hogan,您的视图文件将获得.hjs文件扩展名。
视图/ index.hjs
<section>
<div>{{variable}}</div>
</section>
路由/ index.js
route.get(function (req, res) {
res.render('index', {
variable: 'example',
});
});
添加此模板引擎并不是一件坏事,与您自己的解决方案类型相比,它不会影响您的性能。
如果您关心性能,请在您的Node应用程序前放置一个类似nginx的反向代理/网络服务器,并让它为所有静态文件提供服务。此外,在主模板路由中设置正确的http缓存标头,以避免在Node上受到太多影响。