vue-logger.js

/**
 * @file vue日志打印器
 * @author lisfan <goolisfan@gmail.com>
 * @version 2.1.0
 * @licence MIT
 */

/**
 * VueLogger继承自Logger模块,API请参考[Logger文档](https://lisfan.github.io/logger/)
 *
 * @external Logger
 * @see {@link https://lisfan.github.io/logger/|Logger}
 */

import Logger from '@~lisfan/logger'

// 私有方法
const _actions = {
  /**
   * 代理运行打印方法
   *
   * @since  2.0.0
   *
   * @param {function} superMethod - 要调用Logger的方法
   * @param {VueLogger} self - VueLogger 实例
   * @param {...*} args - 其他参数
   *
   * @returns {VueLogger}
   */
  proxyRun(self, superMethod, ...args) {
    // 若不存在vue实例时,则直接打印内容
    if (!self.$vm || self.$vm._isVue !== true) {
      return superMethod.call(self, ...args)
    }

    // 获取当的组件文件名称
    // vue组件实例[文件名]会有两种存在方式
    // 1.一种是游离独立的(通过new Vue创建的独立片断):取self.$vm.$options.__file
    // 2.另一种是作为某个vue实例的子组件实例存在:取self.$vm.$options._parentVnode.componentOptions.Ctor.options.__file
    let filename = 'unknow'

    try {
      if (self.$vm.$options.__file) {
        filename = self.$vm.$options.__file
      } else if (self.$vm.$options.$vnode) {
        filename = self.$vm.$options.$vnode.componentOptions.Ctor.options.__file
      } else if (self.$vm.$options._parentVnode) {
        filename = self.$vm.$options._parentVnode.componentOptions.Ctor.options.__file
      }
    } catch (e) {
      // 错误捕获
    }

    // 获取路由名称
    // vue组件实例[路由名]会有两种存在方式
    // 1. 一种是游离独立的(通过new Vue创建的独立片断),游离在外的无法
    // 2. 另一种是作为某个vue实例的子组件实例存在:self.$vm.$route && self.$vm.$route.name
    const routeName = (self.$vm.$route && self.$vm.$route.name) || 'unknow'

    superMethod.call(self, ...args, '@' + filename.toString(), '#' + routeName.toString())

    return self
  }
}

/**
 * @extends external:Logger
 *
 * @description
 * 继承自[Logger类]{@link https://lisfan.github.io/logger/}:针对于vue实例,支持打印内容的同时再打印出调用打印方法的组件文件名称(具体到子组件)和路由名称
 * 该文档只展示了覆盖的四个实例方法(`log`、`warn`、`error`、`trace`),且仅这四个方法支持打印输出,
 * 其他方法功能与Logger实例方法一致,API请参考[Logger文档]{@link https://lisfan.github.io/logger/}
 *
 * @classdesc Vue日志打印类
 *
 * @class
 */
class VueLogger extends Logger {
  /**
   * 打印器命名空间规则配置项
   * - 可以配置整个命名空间是否输出日志
   * - 也可以配置命名空间下某个实例方法是否输出日志
   *
   * [注]:内部始终读取Logger.rules
   *
   * @since 2.0.0
   *
   * @static
   * @getter
   * @readonly
   * @memberOf VueLogger
   *
   * @type {object} - 打印器命名空间规则配置集合
   */
  static get rules() {
    return Logger.rules
  }

  /**
   * 更改命名空间规则配置项
   * [注]从`localStorage`的`LOGGER_RULES`键中读取规则配置优先级最高,始终会覆盖其他规则
   *
   * [注]:内部始终调用Logger.configRules
   *
   * @since 2.0.0
   **
   * @param {object} rules - 打印器命名空间规则配置集合
   *
   * @returns {VueLogger}
   */
  static configRules(rules) {
    Logger.configRules(rules)

    return this
  }

  /**
   * 默认配置选项
   *
   * [注]:内部始终读取Logger.options
   *
   * @since 2.0.0
   *
   * @static
   * @getter
   * @memberOf VueLogger
   *
   * @type {object}
   * @property {string} name='vue-logger' - 日志器命名空间
   * @property {boolean} debug=true - 调试模式是否开启
   */
  static options = {
    name: 'vue-logger',
    debug: true,
    // vm: viewModel,
  }

  /**
   * 更新默认配置选项
   *
   * [注]:内部始终调用Logger.config
   *
   * @since 2.0.0
   *
   * @static
   *
   * @see VueLogger.options
   *
   * @param {object} options - 其他配置选项见{@link VueLogger.options}
   *
   * @returns {VueLogger}
   */
  static config(options) {
    // 以内置配置为优先
    VueLogger.options = {
      ...VueLogger.options,
      ...options
    }

    return this
  }

  /**
   * 构造函数
   *
   * @see VueLogger.options
   *
   * @param {object} options - 其他配置选项见{@link VueLogger.options}
   * @param {Vue} [options.vm] - vue实例
   */
  constructor(options) {
    super({
      ...VueLogger.options,
      ...options
    })
  }

  /**
   * 获取实例配置的vue实例
   *
   * @since 2.1.0
   *
   * @getter
   * @readonly
   *
   * @type {Vue}
   */
  get $vm() {
    return this.$options.vm
  }

  /**
   * 针对vue实例的log打印
   *
   * @since 2.0.0
   *
   * @override
   *
   * @param {...*} args - 其他参数
   *
   * @returns {VueLogger}
   */
  log(...args) {
    return _actions.proxyRun(this, super.log, ...args)
  }

  /**
   * 针对vue实例的warn打印
   *
   * @since 2.0.0
   *
   * @override
   *
   * @param {...*} args - 其他参数
   *
   * @returns {VueLogger}
   */
  warn(...args) {
    return _actions.proxyRun(this, super.warn, ...args)
  }

  /**
   * 针对vue实例的error打印
   *
   * @since 2.0.0
   *
   * @override
   *
   * @param {...*} args - 其他参数
   *
   * @returns {VueLogger}
   */
  error(...args) {
    return _actions.proxyRun(this, super.error, ...args)
  }

  /**
   * 针对vue实例的trace打印
   *
   * @since 2.0.0
   *
   * @override
   *
   * @param {...*} args - 其他参数
   *
   * @returns {VueLogger}
   */
  trace(...args) {
    return _actions.proxyRun(this, super.trace, ...args)
  }
}

export default VueLogger