我正在使用Express Framework在Node.js上编写CMS .在我的CMS上,我有几个用户,页面等模块.
我希望每个模块都将他的文件放在单独的文件夹中,包括视图文件.任何人都知道如何实现这一目标?
我正在使用swig作为我的模板引擎但如果有帮助我可以将其替换为其他内容.
BFi*_*Fil 43
最后更新
自Express 4.10起,框架支持多视图文件夹功能
只需将一系列位置传递给views属性,就像这样.
app.set('views', [__dirname + '/viewsFolder1', __dirname + '/viewsFolder2']);
Run Code Online (Sandbox Code Playgroud)
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)
};
}
Run Code Online (Sandbox Code Playgroud)
您将通过调用上面的函数并将express作为参数传递来启用新逻辑,然后您将能够为配置指定视图数组:
var express = require('express');
enableMultipleViewFolders(express);
app.set('views', [__dirname + '/viewsFolder1', __dirname + '/viewsFolder2']);
Run Code Online (Sandbox Code Playgroud)
或者,如果您愿意,可以直接修补框架(更新其中的view.js文件)
这应该适用于Express 2.x,不确定它是否适用于新版本(3.x)
UPDATE
不幸的是,上述解决方案在Express 3.x中不起作用,因为express.view将是未定义的
另一种可能的解决方案是代理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);
};
Run Code Online (Sandbox Code Playgroud)
我没有对它进行过测试,无论如何我觉得非常hacky,不幸的是这个功能再次被推回:https: //github.com/visionmedia/express/pull/1186
更新2
此功能已在Express 4.10中添加,因为以下拉取请求已合并:https: //github.com/strongloop/express/pull/2320
Ban*_*cid 11
除@ user85461答案外,require视图部分对我不起作用.我做了什么:删除路径的东西,并将其全部移动到我可能需要的模块,patch.ViewEnableMultiFolders.js(与当前快递一起使用):
function ViewEnableMultiFolders(app) {
// Monkey-patch express to accept multiple paths for looking up views.
// this path may change depending on your setup.
var lookup_proxy = app.get('view').prototype.lookup;
app.get('view').prototype.lookup = function(viewName) {
var context, match;
if (this.root instanceof Array) {
for (var i = 0; i < this.root.length; i++) {
context = {root: this.root[i]};
match = lookup_proxy.call(context, viewName);
if (match) {
return match;
}
}
return null;
}
return lookup_proxy.call(this, viewName);
};
}
module.exports.ViewEnableMultiFolders = ViewEnableMultiFolders;
Run Code Online (Sandbox Code Playgroud)
和使用:
var Patch = require('patch.ViewEnableMultiFolders.js');
Patch.ViewEnableMultiFolders(app);
app.set('views', ['./htdocs/views', '/htdocs/tpls']);
Run Code Online (Sandbox Code Playgroud)
这是Express 3.x的解决方案.它使用猴子补丁来表达3.x的"视图"对象,以执行与上面的@ ShadowCloud解决方案相同的查找技巧.不幸的是,View对象的路径查找不太干净,因为3.x没有将它暴露给express- 所以你必须挖掘node_modules的内容.
function enable_multiple_view_folders() {
// Monkey-patch express to accept multiple paths for looking up views.
// this path may change depending on your setup.
var View = require("./node_modules/express/lib/view"),
lookup_proxy = View.prototype.lookup;
View.prototype.lookup = function(viewName) {
var context, match;
if (this.root instanceof Array) {
for (var i = 0; i < this.root.length; i++) {
context = {root: this.root[i]};
match = lookup_proxy.call(context, viewName);
if (match) {
return match;
}
}
return null;
}
return lookup_proxy.call(this, viewName);
};
}
enable_multiple_view_folders();
Run Code Online (Sandbox Code Playgroud)
但是,您可以将所有视图文件放在“view”文件夹中,但将每个模块的视图分离到“view”文件夹内的自己的文件夹中。所以,结构是这样的:
views
--moduleA
--moduleB
----submoduleB1
----submoduleB2
--moduleC
Run Code Online (Sandbox Code Playgroud)
像往常一样设置视图文件:
app.set('views', './views');
Run Code Online (Sandbox Code Playgroud)
当为每个模块渲染时,包括模块的名称:
res.render('moduleA/index', ...);
Run Code Online (Sandbox Code Playgroud)
甚至子模块的名称:
res.render('moduleB/submoduleB1/index', ...);
Run Code Online (Sandbox Code Playgroud)
此解决方案也适用于 4.x 版之前的 express,
| 归档时间: |
|
| 查看次数: |
24063 次 |
| 最近记录: |