模板渲染就是GET请求的处理过程.这之前要先理解其中的view.showRoot方法,也就是/server/utils/view.js文件,三个方法show/showOne/showRoot。
show
/**
* @param path 主路径,默认会在此参数前带上/templates就是实际模板文件路径
* @param params 页面参数,默认带上页面title参数
* @param pathList 页面组件路径列表,
* 可以是数组,默认第1个作为herder.html,第2个为footer.html,并将path插入中间
* @returns 返回合并后的html页面代码
*/
function show(path,params,pathList) {
return function *(){
var output =[],
ctx = this;
params = params || {};
pathList = setPathList(path,pathList);
params = setParams(params,ctx);
// 页面拼接
for (var i = 0; i < pathList.length; i++) {
var page = yield render(pathList[i],params);
output.push(page);
}
}
}
show方法主要用于高鸣项目下,比如一次调用:
this.body = yield view.show('/home/index', {banners:[]});
show方法的三个参数分别是将要渲染的页面地址,参数与页面片段(数组)。
pathList = setPathList(path,pathList);
上述代码得到将要渲染的页面的一个数组,如果pathlist存在,则把path的路径插入pathlist中并返回来,否则则使用的默认的:
pathList = ['/public/header',path,'/public/footer'];
然后遍历这个数组,使用render渲染路径页面得到返回的页面数据,然后放到output中拼接返回。
setPathList
function setPathList(path,pathList) {
if(pathList && Array.isArray(pathList)) { /*自定义页面合成*/
pathList.splice(1, 0, path);
}else if(path.indexOf('/webview/') > -1){ /*webview页面合成*/
pathList = ['/webview/public/header',path,'/webview/public/footer'];
}else{
pathList = ['/public/header',path,'/public/footer']; /*默认页面合成*/
}
return pathList;
}
如果pathlist存在并是一个数组,则把path插入第一个位置。
如果路径包括webview,则使用webview的header与footer,否则使用public下的。
setParams
这个方法主要目的是进行参数的处理,假如我们执行
setParams({ startRouter: '/account/login'})
则返回的是:
{
startRouter: '/account/login',
manifest: 0,
appFrom: 'wutong',
publicKey: '',
title: '梧桐理财',
ctrlName: 'accountLogin',
moduleName: 'login',
isCompile: false,
host: '192.168.1.213:2020',
route: '/account/login',
path: '/account/login'
}
showOne
// == 单页面输出,不带任何头部、尾部等组件
function showOne(path,params) {
return function* (){
var ctx = this;
params = params || {};
params = setParams(params,ctx);
return yield render(path,params);
}
}
只输出不带头部的模板
showRoot
其实showRoot与showOne代码基本上完全一致。除了showRoot会自动在路径加上/templates。
此时,我们再看get请求的代码。
var startRouter = this.path || config.app.startRouter,
indexName = config.app.index || 'index',
subIndexName = 'index',
isSubapp = config.subapp && pathName in config.subapp;//是否为子应用
this.body = isSubapp
? yield view.showRoot('/subapp/' + pathName + '/' + subIndexName, {startRouter: startRouter})
: yield view.showRoot('/' + indexName, {startRouter: startRouter});
return;
此处会判断是否子应用,来命中不同文件的文件。
我们以命名wap应用为例
this.body = yield view.showRoot('/index', {})
也就是说所有的页面都是渲染index.html,然后通过参数传到前端应该访问的模块,通过前端路由来调到对应的页面。