我正在写一篇关于Node.js with Express Framework的CMS.在我的CMS上,我有几个用于用户、页面等的模块.
我希望每个模块的文件都在separate folderincluding the view files上.
我使用swig作为我的模板引擎,但如果有帮助的话,我可以将其替换为其他内容.
我正在写一篇关于Node.js with Express Framework的CMS.在我的CMS上,我有几个用于用户、页面等的模块.
我希望每个模块的文件都在separate folderincluding the view files上.
我使用swig作为我的模板引擎,但如果有帮助的话,我可以将其替换为其他内容.
Last Update
The multiple view folders feature is supported by the framework since Express 4.10
只需将一组位置传递给views
属性,如下所示.
app.set('views', [__dirname + '/viewsFolder1', __dirname + '/viewsFolder2']);
Express 2.0
据我所知,express目前不支持多个视图路径或名称空间(就像静态中间件一样)
但您可以自己修改查找逻辑,使其按照您想要的方式工作,例如:
function enableMultipleViewFolders(express) {
// proxy function to the default view lookup
var lookupProxy = express.view.lookup;
express.view.lookup = function (view, options) {
if (options.root instanceof Array) {
// clones the options object
var opts = {};
for (var key in options) opts[key] = options[key];
// loops through the paths and tries to match the view
var matchedView = null,
roots = opts.root;
for (var i=0; i<roots.length; i++) {
opts.root = roots[i];
matchedView = lookupProxy.call(this, view, opts);
if (matchedView.exists) break;
}
return matchedView;
}
return lookupProxy.call(express.view, view, options)
};
}
通过调用上述函数并将express作为参数传递,可以启用新逻辑,然后可以为配置指定一组视图:
var express = require('express');
enableMultipleViewFolders(express);
app.set('views', [__dirname + '/viewsFolder1', __dirname + '/viewsFolder2']);
或者,如果愿意,可以直接修补框架(更新框架内的view.js文件)
这应该是work in Express 2.x,不确定新版本(3.x)是否会
UPDATE
不幸的是,上述解决方案在Express 3中不起作用.因为express.view等于undefined
另一种可能的解决方案是代理response.render函数,并设置views文件夹配置,直到找到匹配:
var renderProxy = express.response.render;
express.render = function(){
app.set('views', 'path/to/custom/views');
try {
return renderProxy.apply(this, arguments);
}
catch (e) {}
app.set('views', 'path/to/default/views');
return renderProxy.apply(this, arguments);
};
我还没有测试过它,不管怎么说,它让我感觉很不舒服,不幸的是,这个功能又被取消了:
UPDATE 2
此功能已添加到Express 4.10中,因为以下拉取请求已被合并: