API

全局配置

Vue.config 是一个对象,包含 Vue 的全局配置。

  • 源码位置:util/config.js
  • 搜索config 可以找到其源码地址,其中声明了config的类型和默认参数

    下面仅仅留下官方的几个配置项
  1. export type Config = {
  2. // user
  3. optionMergeStrategies: { [key: string]: Function }; //自定义合并策略的选项。
  4. silent: boolean; //关于日志和警告
  5. productionTip: boolean; //设置为 false 以阻止 vue 在启动时生成生产提示。
  6. performance: boolean;//设置为 true 以在浏览器开发工具的性能/时间线面板中启用对组件初始化、编译、渲染和打补丁的性能追踪。只适用于开发模式和支持 performance.mark API 的浏览器上。
  7. devtools: boolean; //配置是否允许 vue-devtools 检查代码。
  8. errorHandler: ?(err: Error, vm: Component, info: string) => void; //指定组件的渲染和观察期间未捕获错误的处理函数。这个处理函数被调用时,可获取错误信息和 Vue 实例。
  9. warnHandler: ?(msg: string, vm: Component, trace: string) => void; //为 Vue 的运行时警告赋予一个自定义处理函数。注意这只会在开发者环境下生效,在生产环境下它会被忽略。
  10. ignoredElements: Array<string | RegExp>; //使 Vue 忽略在 Vue 之外的自定义元素
  11. keyCodes: { [key: string]: number | Array<number> };//给 v-on 自定义键位别名
  12. // platform
  13. ..... 平台相关
  14. ......
  15. };
  16. export default ({默认项}: Config))
  • 分析: 可以看出来整个config是进行了单独的整体的举例,然后配置完默认项后暴露出去,那么我们又是如何能够使用vue.confige.XXX 使用呢。

  • 源码地址 core/global-api/index.js
  1. import config from '../config'
  2. ....
  3. export function initGlobalAPI (Vue: GlobalAPI) {
  4. // config
  5. const configDef = {}
  6. configDef.get = () => config
  7. if (process.env.NODE_ENV !== 'production') {
  8. configDef.set = () => {
  9. warn(
  10. 'Do not replace the Vue.config object, set individual fields instead.'
  11. )
  12. }
  13. }
  14. Object.defineProperty(Vue, 'config', configDef)
  15. ....
  16. }

-- 分析:,我们在这个文件中可以中看到,Vue在全局注入API 的时候将config注入.依然是用了Object.defineProperty()方法将其放在了Vue实例中。

综上我能感受到作为大框架对于各种功能的分散和聚合(用词不当,水平过低),是十分精炼的,组织结构清晰,明了。

那么接下来,看看vue提供的config暴露api大致都是如何工作的吧。

#silent

  • 源码地址:core/util/debug.js
  1. ...
  2. warn = (msg, vm) => {
  3. const trace = vm ? generateComponentTrace(vm) : ''
  4. if (config.warnHandler) {
  5. config.warnHandler.call(null, msg, vm, trace)
  6. } else if (hasConsole && (!config.silent)) { //判断slinet
  7. console.error(`[Vue warn]: ${msg}${trace}`)
  8. }
  9. }
  10. tip = (msg, vm) => {
  11. if (hasConsole && (!config.silent)) { // 判断slient
  12. console.warn(`[Vue tip]: ${msg}` + (
  13. vm ? generateComponentTrace(vm) : ''
  14. ))
  15. }
  16. }
  17. ...
  • 分析:我们可以看到再debug.js中vue对slient的使用,就是非常常规的判断,无需多说。

# optionMergeStrategies

  • 源码地址:core/util/option.js
  1. ...
  2. /**
  3. * Option overwriting strategies are functions that handle
  4. * how to merge a parent option value and a child option
  5. * value into the final value.
  6. */
  7. const strats = config.optionMergeStrategies
  8. ... 做了老多事情
  9. 合并各种数据,数据,方法,watch等等
  10. ...
  • 分析: optionMergeStrategies主要用于 mixin 以及 Vue.extend() 方法时对于子组件和父组件如果有相同的属性(option),我们可以看到optionMergeStrategies的使用是在potion中,里面进行了各种合并,因为其中各种类型的合并策略都能拿出来细说,次此梳理,近是浅尝即止,顾不深究,以后有机会再去讨论,Vue方面更深刻的源码分析,还是先以数据驱动和响应式部分为主。

# devtools

  • 源码地址:core/observer/scheduler.js & core/util/env.js
  1. /**
  2. * Flush both queues and run the watchers.
  3. */
  4. function flushSchedulerQueue () {
  5. ...
  6. // devtool hook
  7. /* istanbul ignore if */
  8. if (devtools && config.devtools) {
  9. devtools.emit('flush')
  10. }
  11. ....
  12. }
  1. // detect devtools
  2. export const devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__
  • 分析,可以看到devtools是声明或者定义是在env.js中其实就是window.VUE_DEVTOOLS_GLOBAL_HOOK 这个对象,如果你安装了这个工具,再控制台打印可以看到

    {_buffer: Array(0), Vue: ƒ, _replayBuffer: ƒ, on: ƒ, once: ƒ, …}。那么其中你就可以看到再scheduler.js中是用的emit的方法, 我们只看对于vue的支持,这个工具的具体实现不考虑;,可以看到他的使用是在flushSchedulerQueue()这个方法中使用,这个方法在注释中就很清晰,而且这个方法也是vue响应式中很关键的方法,这里大致说一下, 再数据派发更新过程中Vue会遍历我们引入一个队列概念,这也是 Vue 在做派发更新的时候的⼀个优化的点,它并不会每次数据改

    变都触发 watcher 的回调,⽽是把这些 watcher 先添加到⼀个队列⾥,然后在 nextTick 后执⾏flushSchedulerQueue 。其中先后进行了
  1. 队列排序,queue.sort((a, b) => a.id - b.id)
  2. 队列遍历在对 queue 排序后,接着就是要对它做遍历,拿到对应的 watcher ,执⾏ watcher.run()
  3. 状态恢复 执⾏ resetSchedulerState 函数,

大致如此,具体细节,又是很冗长繁琐,如有兴趣,可以看我的关于响应式的处理。


# errorHandler

  • 源码位置 core/util/error.js
  1. function globalHandleError (err, vm, info) {
  2. if (config.errorHandler) {
  3. try {
  4. return config.errorHandler.call(null, err, vm, info) //
  5. } catch (e) {
  6. // if the user intentionally throws the original error in the handler,
  7. // do not log it twice
  8. if (e !== err) {
  9. logError(e, null, 'config.errorHandler')
  10. }
  11. }
  12. }
  13. logError(err, vm, info)
  14. }
  • 这个API其实看官方的文档就很好理解。

指定组件的渲染和观察期间未捕获错误的处理函数。这个处理函数被调用时,可获取错误信息和 Vue 实例。

此处感觉没啥说的,,,,网上看到有分析的很多的,我就不细究了有兴趣可以

点击这里


# warnHandler

  • 源码位置 core/util/error.js
  1. warn = (msg, vm) => {
  2. const trace = vm ? generateComponentTrace(vm) : ''
  3. if (config.warnHandler) {
  4. config.warnHandler.call(null, msg, vm, trace)
  5. } else if (hasConsole && (!config.silent)) {
  6. console.error(`[Vue warn]: ${msg}${trace}`)
  7. }
  8. }
  • 分析?感觉自己水平有限,实际使用几乎为零,没啥分析的。有兴趣看看这个文章,作者算是再Vue异常处理方面进行研究,这里

# ignoredElements

  • 源码位置 core/dom/patch.js
  1. function isUnknownElement (vnode, inVPre) {
  2. return (
  3. !inVPre &&
  4. !vnode.ns &&
  5. !(
  6. config.ignoredElements.length &&
  7. config.ignoredElements.some(ignore => {
  8. return isRegExp(ignore)
  9. ? ignore.test(vnode.tag)
  10. : ignore === vnode.tag
  11. })
  12. ) &&
  13. config.isUnknownElement(vnode.tag)
  14. )
  15. }
  • 分析?官方文档提供的很好,

须使 Vue 忽略在 Vue 之外的自定义元素 (e.g. 使用了 Web Components APIs)。否则,它会假设你忘记注册全局组件或者拼错了组件名称,从而抛出一个关于 Unknown custom element 的警告。

代码也很清晰。可以看到报错点会出现在Vue进行数据驱动的核心方法creatElm中。


# keyCodes

  • 源码位置 core/instance/render-helpers/check-keycodes.js
  1. function isKeyNotMatch<T> (expect: T | Array<T>, actual: T): boolean {
  2. if (Array.isArray(expect)) {
  3. return expect.indexOf(actual) === -1
  4. } else {
  5. return expect !== actual
  6. }
  7. }
  8. /**
  9. * Runtime helper for checking keyCodes from config.
  10. * exposed as Vue.prototype._k
  11. * passing in eventKeyName as last argument separately for backwards compat
  12. */
  13. export function checkKeyCodes (
  14. eventKeyCode: number,
  15. key: string,
  16. builtInKeyCode?: number | Array<number>,
  17. eventKeyName?: string,
  18. builtInKeyName?: string | Array<string>
  19. ): ?boolean {
  20. const mappedKeyCode = config.keyCodes[key] || builtInKeyCode
  21. if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {
  22. return isKeyNotMatch(builtInKeyName, eventKeyName)
  23. } else if (mappedKeyCode) {
  24. return isKeyNotMatch(mappedKeyCode, eventKeyCode)
  25. } else if (eventKeyName) {
  26. return hyphenate(eventKeyName) !== key
  27. }
  28. }
  • 分析: 这个玩意,我专门实践了一下,其实就是自定义别名,看文档我当时有点懵逼,我改成了 如下
  1. Vue.config.keyCodes = {
  2. v: 86,
  3. // 取而代之的是 kebab-case 且用双引号括起来
  4. "media-play-pause": 86,
  5. }
  6. <input type="text" @keyup.media-play-pause="method($event)">

这里,你就会发现他就是定义自己的别名去对应专属的,keyCode个人感觉没啥用,

实现的话,就是源码方面的处理。随后又走了proxy,完成代理。不多赘述


# prformance

直接饮用官方说明

用法:

设置为 true 以在浏览器开发工具的性能/时间线面板中启用对组件初始化、编译、渲染和打补丁的性能追踪。只适用于开发模式和支持 performance.mark API 的浏览器上。

使用的话,需要安装一个插件,我一直安装不成功,不知道为啥,有一篇文章写得很好这里,可以查看。


# productionTip

  • 源码地址:platforms/web/runtime/index.js
  1. ...
  2. if (process.env.NODE_ENV !== 'production' &&
  3. process.env.NODE_ENV !== 'test' &&
  4. config.productionTip !== false &&
  5. typeof console !== 'undefined'
  6. ) {
  7. console[console.info ? 'info' : 'log'](
  8. `You are running Vue in development mode.\n` +
  9. `Make sure to turn on production mode when deploying for production.\n` +
  10. `See more tips at https://vuejs.org/guide/deployment.html`
  11. )
  12. ...

如官方说明

用法:

设置为 false 以阻止 vue 在启动时生成生产提示。


  • 关于全局配置部分总结:
  1. 个人将全局配置部分算是浅显的走了一遍,说实话,其中部分内容我几乎都没有用过,而且确实这个梳理,更多像是,CV一下文档和源码代码。其中细节没有去深究,
  2. 整个Vue api 梳理的想法就是让我重新对Vue进行了解一下,毕竟Vue是个很大的项目,对于每个API不可能都去研究源码的细节,但求,有个概念,实操有个印象,也算事我对Vue,进一步了解。
  3. 关于源码部分,我也在同时学习,主要还是准备针对性的对他数据驱动和响应式的核心 处理部分进行学习了解,当然这个Api系列,也是在个人有精力同时研究有意义的情况下,回去深入了解的,如果精力不够或是从未涉及,我会找相对应我觉得不错的博客放出链接。
  4. 本文全是个人向内容,希望对看到的你,有所帮助,也是我对Vue学习的一个梳理吧。

Vue-API之全局配置的更多相关文章

  1. 3.vue引入axios全局配置

    前言: Vue官方推荐使用axios来进行异步访问. axios文档参考:axios中文文档 开始搭建: 1.引入axios (1)打开终端 win+R (2)切换到项目路径: g: cd Webap ...

  2. vue项目中全局配置变量

    在项目中api管理需要用到全局变量,创建全局变量的方式也有很多. 1.通过export default const BASEURL = "http://localhost:3333/&quo ...

  3. 后台(一)vue+element-ui(全局配置)

    vue init webpack    项目名称 npm install axios                    //先安装! npm install --save axios vue-ax ...

  4. Vue基础(环境配置、内部指令、全局API、选项、内置组件)

    1.环境配置 安装VsCode 安装包管理工具:直接下载 NodeJS 进行安装即可,NodeJS自带 Npm 包管理工具,下载地址:https://nodejs.org/en/download/安装 ...

  5. Vue.js 2.x API 知识梳理(一) 全局配置

    Vue.js 2.x API 知识梳理(一) 全局配置 Vue.config是一个对象,包含Vue的全局配置.可以在启动应用之前修改指定属性. 这里不是指的@vue/cli的vue.config.js ...

  6. Vue基础二之全局API、实例属性和全局配置,以及组件进阶(mixins)的详细教程(案列实现,详细图解,附源码)

    本篇文章主要是写Vue.directive().Vue.use()等常用全局API的使用,vm.$props.vm.$options.vm.$slots等实例属性的使用,以及Vue全局配置.组件的mi ...

  7. vue入门全局配置

    全局配置 Vue.config 是一个对象,包含 Vue 的全局配置.可以在启动应用之前修改下列属性: silent 类型:boolean 默认值:false 用法: Vue.config.silen ...

  8. API(全局配置,全局API)

    全局配置 Vue.config是一个对象,包含Vue的全局配置 silent 类型:boolean 默认值:false 用法 Vue.config.silent=true 取消Vue所有的日志与警告 ...

  9. Vue.js 源码分析(二) 基础篇 全局配置

    Vue.config是一个对象,包含Vue的全局配置,可以在启动应用之前修改下列属性,如下: ptionMergeStrategies        ;自定义合并策略的选项silent         ...

  10. vue API 知识点(1)---全局 API 总结

    1.Vue.extend(options) 构造器,创建一个 子类 .参数是一个包含组件选项的对象 data 选项是特例,需要注意 在 Vue.extend() 中它必须是一个函数, <div ...

随机推荐

  1. JavaScript 的数据结构与算法

    1数组 1.1方法列表 数组的常用方法如下: concat: 链接两个或者更多数据,并返回结果. every: 对数组中的每一项运行给定的函数,如果该函数对每一项都返回true,则返回true. fi ...

  2. 用bosybox制作文件系统

    在orangepi_sdk/source/busybox-1.25.0目录里有源码. ). 先清除编译出来的文件及配置文件 make distclean ). 配置busybox make menuc ...

  3. django-cors设置

    MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware. ...

  4. 基础篇七:默认配置语法(/etc/nginx/nginx.conf)

    首选我们 vim nginx.conf 参照上图,我们看看nginx.conf 的个参数含义 我们再看看 /etc/nginx/conf.d/default.conf

  5. sql server 重命名表名,字段名

    重命名表名: exec sp_rename 'oldName','newName'; 重命名字段名: exec sp_rename 'tableName.[oldName]','newName','c ...

  6. scala编程(七)——内建控制结构

    几乎所有的 Scala 的控制结构都会产生某个值.这是函数式语言所采用的方式,程序被看成是计算值的活动,因此程序的控件也应当这么做.另外,指令式语言经常具有三元操作符(如 C,C++和 Java 的? ...

  7. the least-squares criterion|Sxx|Sxy|Syy|Regression Equation|Outliers|Influential Observations|curvilinear regression|linear regression

    4.2 The Regression Equation Because we could draw many different lines through the cluster of data p ...

  8. Mysql分区,分库和分表

    作者说的非常清楚了,感谢.地址为:http://haitian299.github.io/2016/05/26/mysql-partitioning/. 本人项目实践,使用sharding-jdbc进 ...

  9. DIP|PCN|CoevDB|PID|Y2H|RosettaDock Serve|元基因组学|微生物多样性

    生命组学: 比较真核生物有关呼吸链的gene是比较核外编码基因,因为与呼吸有关的功能在线粒体上,线粒体位于核外.想要查看两种基因是否具有相互作用,可以对不同物种的编码ATP6 和ATP8的直系同源基因 ...

  10. HTML table表头固定

    HTML table表头固定 说说我在最近项目中碰到的css问题吧,作为问题知识集合总结笔记: <!DOCTYPE html> <html> <head> < ...