使用Dust和Express从多个目录渲染视图和分支

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

  • 模块是响应路由和呈现页面的东西
  • 小部件是这些页面的片段。

问题是每个Module和Widget都有你自己的视图文件夹,Express只允许你设置一个“views目录”,而在Dust文档中,我甚至找不到Dust在哪个目录中查找模板。

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

    • 模块
      • 模块-1
      • 模块-N
        • 模块正controller.js
        • 模块正routes.js
        • 模块正view.dust
    • 小部件
      • 小部件-1
      • 小部件-N
        • 窗口小部件正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} 

所以问题是 :我如何设置这些视图的path,是res .render正确的方法来做到这一点,或者我应该使用dust.render?

PS:我尝试过灰尘。我发现每一个path的变化都有“错误,无法find模板”。

步骤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文件!

在渲染partials时,这对于巩固查找.html文件是非常必要的。 我不知道为什么,但是当渲染partials时,合并似乎只查找.dust文件,即使你已经指定了html作为app和view引擎。 如果您使用.dust扩展名,请跳过此操作。

node_modules /巩固/ lib中/ consolidate.js

search这个function:

 exports.dust.render 

在这个函数里面你会发现以下内容:

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

只需将其更改为:

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

这真的很难弄清楚,我真的希望能帮助别人。