ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-12-19 09:05:27  阅读:201  来源: 互联网

标签:CmsWing const extend require module controller context userAgent isMobile


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有