最后更新
自 Express 4.10 起,框架支持多视图文件夹功能
只需将一系列位置传递给views
财产,就像这样。
app.set('views', [__dirname + '/viewsFolder1', __dirname + '/viewsFolder2']);
快递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文件在里面)
这应该在 Express 2.x 中工作,不确定新版本(3.x)是否会这样
UPDATE
不幸的是,上述解决方案在 Express 3.x 中不起作用,因为表达视图将会不明确的
另一种可能的解决方案是代理响应.渲染函数并设置视图文件夹配置,直到获得匹配:
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);
};
我还没有测试过它,无论如何,它对我来说感觉很hacky,不幸的是这个功能又被推迟了:https://github.com/visionmedia/express/pull/1186 https://github.com/visionmedia/express/pull/1186
UPDATE 2
Express 4.10 中添加了此功能,因为合并了以下拉取请求:https://github.com/strongloop/express/pull/2320 https://github.com/strongloop/express/pull/2320