使用Dust和Express从多个目录中渲染视图和局部视图

时间:2014-11-12 21:23:09

标签: node.js express dust.js

我用一个非常复杂的CMS,使用Node,Express和Dust with Consolidate。 CMS具有模块和小部件:

  • 模块是响应路线和呈现网页的内容
  • 小工具是这些网页的片段。

问题是每个模块和窗口小部件都有自己的视图文件夹,而Express只允许您设置一个" views目录",而在Dust文档中,我无法' ;甚至找到Dust在哪个目录中查找模板。

我的文件夹结构如下所示:

    • 模块
      • 模块-1
      • 模块正
        • 模块正controller.js
        • 模块正routes.js
        • 模块正view.dust
    • 窗口小部件
      • 插件-1
      • 插件 - 正
        • 插件 - 正controller.js
        • 插件 - 正routes.js
        • 插件 - 正view.dust

所以, module-n-controller.js 就是这样的:

// just pretend that this data came from the widget-n-controller.js
var data = {
   "widget" : {
      "view": "./widgets/widget-n/widget-n-view",
      "data": widgetNData
   }
}

res.render('./modules/module-n/module-n-view', data);

然后,在我的 module-n-view.dust 中,我想做这样的事情:

{#widget}
    {>"{view}" data=data/}
{/widget}

所以问题是:如何设置这些视图的路径,并且 res 。渲染正确的方法来执行此操作,还是应该使用灰尘。呈现?

PS:我尝试了灰尘。渲染,我得到了#34;错误,无法找到模板"随着路径的每一个变化。

1 个答案:

答案 0 :(得分:3)

第1步

<强>根/ app.js

var app = require("express")(),
    cons = require("consolidate");

// Do this to get DustJS rendering .html files
// So, in the file structure above, you can rename the views extensions from .dust to .html
app.engine('html', cons.dust);
app.set('view engine', 'html');

// Set the views directory to the root directory of the application
// This way you can access views into any directory inside your application
app.set('views', '.');

<强>根/部件/插件正/插件 - 正controller.js

module.exports.index = function (req, res, next) {
    return {
        "widget" : {
             "view": __dirname + '/widget-n-view',
             "data": widgetNDataFromDB()
        }
    };
}

<强>根/模块/模块正/模块正controller.js

module.exports.index = function(req, res, next){
    var data = require("../../widgets/widget-n/widget-n-controller").index(req, res, next);
    res.render(__dirname +'/module-n-view', data);
}

第2步 - 非常重要.HTML文件!

在呈现部分时,必须进行整合查找.html文件。 我不知道为什么,但是,当渲染局部时,整合似乎只查找.dust文件,即使你已经指定html作为应用程序和视图引擎。 如果您使用.dust扩展名,请跳过此步骤。

<强> node_modules /巩固/ LIB / consolidate.js

搜索此功能:

exports.dust.render

在此功能的内部,您将找到以下内容:

var ext = 'dust'
,   views = '.';

只需将其更改为:

var ext = 'html'
, views = '.';

很难弄明白......我真的希望它可以帮助其他人。