【问题标题】:Render views and partials from multiple directories with Dust and Express使用 Dust 和 Express 从多个目录渲染视图和局部视图
【发布时间】:2014-11-14 01:30:33
【问题描述】:

我正在用 Node、Express 和 Dust 和 Consolidate 编写一个非常复杂的 CMS。 CMS 有模块和小部件:

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

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

我的文件夹结构如下:

    • 模块
      • 模块-1
      • 模块-n
        • module-n-controller.js
        • module-n-routes.js
        • module-n-view.dust
    • 小部件
      • 小部件 1
      • 小部件-n
        • 小部件-n-controller.js
        • widget-n-routes.js
        • widget-n-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.render 是正确的方法还是应该使用灰尘。渲染?

PS:我尝试了 dust.render,但路径的每个变体都出现“错误,找不到模板”。

【问题讨论】:

  • 您是否使用 Consolidate 将 Dust 连接到 Express?如果是这样,您将不得不更改其 read() 挂钩以添加您的自定义查找逻辑。
  • 是的!关于我应该如何做到这一点的任何想法?

标签: node.js express dust.js


【解决方案1】:

第 1 步

root/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', '.');

root/widgets/widget-n/widget-n-controller.js

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

root/modules/module-n/module-n-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 文件所必需的。 我不知道为什么,但是在渲染部分时,合并似乎只查找 .dust 文件,即使您已将 html 指定为应用程序和视图引擎。 如果您使用的是 .dust 扩展名,请跳过此步骤。

node_modules/consolidate/lib/consolidate.js

搜索此功能:

exports.dust.render

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

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

只需将其更改为:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多