warn 函数

let warn = noop
let generateComponentTrace = (noop: any) // work around flow check

if (process.env.NODE_ENV !== 'production') {
  const hasConsole = typeof console !== 'undefined'
  // [...]

  warn = (msg, vm) => {
    const trace = vm ? generateComponentTrace(vm) : ''

    if (config.warnHandler) {
      config.warnHandler.call(null, msg, vm, trace)
    } else if (hasConsole && (!config.silent)) {
      console.error(`[Vue warn]: ${msg}${trace}`)
    }
  }
}

默认情况下,warn 函数什么也不做:

function noop (a?: any, b?: any, c?: any) {}
// [. . . .]
let warn = noop

但是,当你处于开发环境时,warn 就有用了。然后是做了什么呢?

warn 函数接收两个参数 msgvmmsg 是一个字符串,vm 是一个 Vue 实例。例如:

warn(
  'Failed to mount component: template or render function not defined.', vm
)

warn 函数初始化一个变量 trace 。如果参数 vm 传递给了 warn 函数,trace 赋值为调用 generateComponentTrace 函数且参数为 vm 的返回值。若参数 vm 没传递给 warn 函数,trace 为一个空字符串。

对于 generateComponentTrace 的讨论,我们留到下次。


warn 函数然后检查下 config.warnHandler 是否已设置。根据 Vue.js 的 API,config.warnHandler 表示“一个 Vue 运行时警告的通用处理函数。仅在开发环境下生效,生产环境无效”。它的用法如下:

warnHandler: ?(msg: string, vm: Component, trace: string) => void;

正如上面所示,Vue.config.warnHandler 是一个函数,接收参数为一个信息字符串,一个 Vue 实例,和 trace,允许你用函数体自定义警告处理信息。


现在,我们继续回到 warn 函数。如果已设置了 config.warnHandler,就会用 call() 方法调用 config.warnHandlercall() 方法把 this 的值设为null ,并传递了3个参数: (1)一个信息字符串, (2)一个 Vue 实例, (3)trace

另一方面,如果没设置 config.warnHandlerwarn 函数检测 hasConsole 是否为 true,hasConsole 的定义如下:

const hasConsole = typeof console !== 'undefined'

接着,warn 函数检测 config.silent 为非真。如果这些条件都符合,就调用 console.error

console.error “在开发者工具里的 console 里输出错误信息”。在这,console.error 输出 “[Vue warn]: ” 和 msg trace 的连接字符。msg 来自 warn 函数的参数。trace 设置在 warn 函数里,用来描述以上更详细的信息。


我们回顾下,在开发环境下,warn 函数接收一个字符串和 Vue 实例作为参数,然后调用自定义的错误处理函数或者是默认的 console.error,以提示开发者某一个错误问题。默认的处理器提供了警告信息和溯源功能。

下一篇,我们将学习下 generateComponentTrace 函数。

上次更新: 2/2/2019, 2:42:16 PM