Node.js 关于partials的新手问题

Node.js 关于partials的新手问题,node.js,express,ejs,Node.js,Express,Ejs,我有一个简单的标题,菜单,内容和页脚页面。我需要把它们分成不同的文件。在阅读了express文档之后,我(创建了4个模板)写了如下内容: app.get('/', function(req, res) { var response = [null, null, null, null] , everyNotNull = function(elem) { return (elem !== null); }, sendResponse = function(ty

我有一个简单的标题,菜单,内容和页脚页面。我需要把它们分成不同的文件。在阅读了express文档之后,我(创建了4个模板)写了如下内容:

app.get('/', function(req, res) {
    var response = [null, null, null, null]
    , everyNotNull = function(elem) {
        return (elem !== null);
    }, sendResponse = function(type, str) {
        switch (type) {
            case 'head' : response[0] = str; break;
            case 'menu' : response[1] = str; break;
            case 'content' : response[2] = str; break;
            case 'footer' : response[3] = str; break;
        }

        if (response.every(everyNotNull)) {
            res.send(response.join(''));
        }
    };

    res.partial('head', {'title' : 'page title'}, function(err, str) {
        sendResponse('head', str);
    });

    res.partial('menu', {'active' : '/'}, function(err, str) {
        sendResponse('menu', str);
    });

    res.partial('index', {'title' : 'Home'}, function(err, str) {
        sendResponse('content', str);
    });

    res.partial('footer', {'nowdate' : (new Date()).getFullYear()}, function(err, str) {
        sendResponse('footer', str);
    });
});

虽然有效,但我觉得有点脏。是否有更好的方法使用部分模板?

您怀疑缺少某些内容是对的,您在那里做了不必要的工作

Express将为您缝合模板,只需调用res.render()和要调用的视图的名称。布局和分区应自动拉入

在我的应用程序中,我通常使用如下部分。只要用您正在使用的模板引擎(Jade、moustach等)替换对EJS的引用即可:

/lib/app.js

app.get('/', function(req, res) {
    var model = {
        layout:'customLayout', // defaults to layout.(ejs|jade|whatever)
        locals:{
            foo:'bar'
        }
    };
    res.render('index',model);
});
<html>
    <head><%- partial('partials/head') %></head>
    <body>
<%- partial('partials/menu') %>
<%- body %>
<%- partial('partials/footer') %>
    </body>
</html>
<h1>Index page</h1>
<div><a href='... </div>
<script>...</script>
etc.
/views/layout.ejs

app.get('/', function(req, res) {
    var model = {
        layout:'customLayout', // defaults to layout.(ejs|jade|whatever)
        locals:{
            foo:'bar'
        }
    };
    res.render('index',model);
});
<html>
    <head><%- partial('partials/head') %></head>
    <body>
<%- partial('partials/menu') %>
<%- body %>
<%- partial('partials/footer') %>
    </body>
</html>
<h1>Index page</h1>
<div><a href='... </div>
<script>...</script>
etc.

/views/index.ejs

app.get('/', function(req, res) {
    var model = {
        layout:'customLayout', // defaults to layout.(ejs|jade|whatever)
        locals:{
            foo:'bar'
        }
    };
    res.render('index',model);
});
<html>
    <head><%- partial('partials/head') %></head>
    <body>
<%- partial('partials/menu') %>
<%- body %>
<%- partial('partials/footer') %>
    </body>
</html>
<h1>Index page</h1>
<div><a href='... </div>
<script>...</script>
etc.
索引页
/views/partials/menu.ejs

app.get('/', function(req, res) {
    var model = {
        layout:'customLayout', // defaults to layout.(ejs|jade|whatever)
        locals:{
            foo:'bar'
        }
    };
    res.render('index',model);
});
<html>
    <head><%- partial('partials/head') %></head>
    <body>
<%- partial('partials/menu') %>
<%- body %>
<%- partial('partials/footer') %>
    </body>
</html>
<h1>Index page</h1>
<div><a href='... </div>
<script>...</script>
etc.

啊哈,有些问题。部分功能是否以同步方式执行?可以从任何部分模板访问“foo”变量吗?如何将变量传递给局部视图(只能使用集合或多个变量)?我认为同步性的级别取决于模板引擎。Express在生产环境中使用模板缓存,因此无论怎样性能都非常好。您可以使用与res.render()相同的方式将变量传递到分部中,即分部('name',{locals:{foo:'bar'})顺便问一下,分部是否返回“text/plain”数据?有没有办法改变这种行为?不知道你在问什么。Partial返回分部模板输出的任何文本(这就是为什么您需要未scaped代码块来正确呈现分部)。你想完成什么?似乎这是另一个错误: