2021SC@SDUSC
目录
src/controller/extend/context.js
关于Context(上下文)的具体含义参见这一篇文章:揭秘Context(上下文)。但在这一段代码里,更多只是进行一部分上下文的判断和相应参数的设定,并不涉及其他方面。
const moment = require('moment');
const path = require('path');
moment.locale('zh-cn');
首先是两个require
操作,关于import
和require
在这一篇文章JS中的「import」和「require 」里讲述得比较详细,这里简单叙述:
require
是赋值过程,结果是对象、数字、字符串、函数等,再把结果赋值给某个变量。它是普通的值拷贝传递。
在模块中,将所要导出的数据存放在module
的export
属性中,经过规范的处理,在需要的页面中使用require
指定到该模块,即可导出模块中的export
属性并执行赋值操作(值拷贝)。结合之前博客中提到的module.exports
,我们终于可以推断出使用方法了。正如所见,接下来就是一段使用module.exports
的操作——
module.exports = {
get isMobile() {
if (Number(this.config('setup.ISM')) === 0) {
return false;
}
const userAgent = this.userAgent.toLowerCase();
const mList = ['iphone', 'android'];
return mList.some(item => userAgent.indexOf(item) > -1);
},
moment: moment,
cmswing: require(path.join(think.ROOT_PATH, 'package.json'))
};
之前获取的是moment以及path,还将文字设置为简体中文。ismobile()
方法在之前有所提及,在官方文档中的extend/扩展部分也有描述。
比如:我们想给ctx添加个isMobile
方法来判断当前请求是不是手机访问,可以通过下面的方式:
// src/extend/context.js
module.exports = {
isMobile(){
const userAgent = this.userAgent.toLowerCase();
const mList = ['iphone', 'android'];
return mList.some(item => userAgent.indexOf(item) > -1);
}
}
这样后续就可以通过ctx.isMobile()
来判断是否是手机访问了。当然这个方法没有任何的参数,我们也可以变成一个getter
。
// src/extend/context.js
module.exports = {
get isMobile(){
const userAgent = this.userAgent.toLowerCase();
const mList = ['iphone', 'android'];
return mList.some(item => userAgent.indexOf(item) > -1);
}
}
这样在ctx中就可以直接用this.isMobile
来使用,其他地方通过ctx.isMobile
使用,如: 在controller
中用this.ctx.isMobile
。
如果在 controller 中也想通过 this.isMobile 使用,怎么办呢? 可以给 controller 也扩展一个 isMobile 属性来完成。
// src/extend/controller.js
module.exports = {
get isMobile(){
return this.ctx.isMobile;
}
}
通过也给controller
扩展isMobile
属性后,后续在controller
里可以直接使用this.isMobile
了。
当然这样扩展后,只能在当前项目里使用这些功能,如果要在其他项目中使用,可以将这些扩展发布为一个npm模块。发布的模块在入口文件里需要定义对应的类型的扩展,如:
const controllerExtend = require('./controller.js');
const contextExtend = require('./context.js');
// 模块入口文件
module.exports = {
controller: controllerExtend,
context: contextExtend
}