其他分享
首页 > 其他分享> > 【20211219】CmsWing代码分析 - src/controller/extend/context.js

【20211219】CmsWing代码分析 - src/controller/extend/context.js

作者:互联网

2021SC@SDUSC

目录

src/controller/extend/context.js

关于Context(上下文)的具体含义参见这一篇文章:揭秘Context(上下文)。但在这一段代码里,更多只是进行一部分上下文的判断和相应参数的设定,并不涉及其他方面。

const moment = require('moment');
const path = require('path');
moment.locale('zh-cn');

首先是两个require操作,关于importrequire在这一篇文章JS中的「import」和「require 」里讲述得比较详细,这里简单叙述:

require是赋值过程,结果是对象、数字、字符串、函数等,再把结果赋值给某个变量。它是普通的值拷贝传递。

在模块中,将所要导出的数据存放在moduleexport属性中,经过规范的处理,在需要的页面中使用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
}

标签:CmsWing,const,extend,require,module,controller,context,userAgent,isMobile
来源: https://blog.csdn.net/mu_qingyu/article/details/121844822