import vue经历了哪些完成初始化过程

import vue经历了哪些完成初始化过程

1-5提到的Vue.js源码构建过程在web应用下,分析的是Runtime+Compiler构建出来的Vue.js,它的入口是src/platforms/web/entry-runtime-with-compiler.js

1、entry-runtime-with-compiler.js文件解析

最终导出的是vue对象

export default Vue

vue是通过import导入

import Vue from './runtime/index'

然后挂载了一个$mount方法

const mount = Vue.prototype.$mount
Vue.prototype.$mount = function (
    //.......
)

2、runtime/index.js文件解析

最后也是导出vue

export default Vue

vue是从core/index引入

import Vue from 'core/index'

定义vue的静态的全局配置

// install platform specific utils
Vue.config.mustUseProp = mustUseProp
Vue.config.isReservedTag = isReservedTag
Vue.config.isReservedAttr = isReservedAttr
Vue.config.getTagNamespace = getTagNamespace
Vue.config.isUnknownElement = isUnknownElement

定义原型的patch$mount方法

// install platform patch function
Vue.prototype.__patch__ = inBrowser ? patch : noop

// public mount method
Vue.prototype.$mount = function (
  el?: string | Element,
  hydrating?: boolean
): Component {
  el = el && inBrowser ? query(el) : undefined
  return mountComponent(this, el, hydrating)
}

3、core/index.js文件解析

最后也是导出vue

export default Vue

vue是从instance/index引入

import Vue from './instance/index'

初始化API,也就是在vue上挂载一些静态属性

import { initGlobalAPI } from './global-api/index'

initGlobalAPI(Vue)

4、instance/index.js文件解析(主要)

找到了vue的定义,在定义vue必须要通过一个new的方法去实例化,这是es5实现class的一种方式

function Vue (options) {
  if (process.env.NODE_ENV !== 'production' &&
    !(this instanceof Vue)
  ) {
    warn('Vue is a constructor and should be called with the `new` keyword')
  }
  this._init(options)
}

问:为什么要通过function实现vue
答:调用了很多mixin的方法,initMixin实际上就是往Vue.prototype上挂了一个init方法,其他也是类似,也就是说每一个mixin就是往vue的原型上混入一些定义在原型上的方法

initMixin(Vue)
stateMixin(Vue)
eventsMixin(Vue)
lifecycleMixin(Vue)
renderMixin(Vue)

问:为什么不用es6用es5?
答:es5可以往vue的原型上挂很多方法,并且把这些方法按代码模块组织关系拆分到不同文件下,方便代码管理,es6比较难实现

总结:因此vue实际上就是一个function,是用函数实现的一个类,可以理解为vue就是一个类,类上挂了很多原型的方法,除了mixin混入的方法,前面./runtime/index下也会往原型上挂方法,包括入口entry-runtime-with-compiler.js也会挂一些方法,除了原型上的方法,还有全局方法global-api,看5、global-api/index.js文件解析

5、global-api/index.js文件解析(挂载静态方法)

vueconfig上定义了configDefconfig来源是../config,定义了很多vue的全局config,具体可以看vue官网的api

import config from '../config'

Object.defineProperty(Vue, 'config', configDef)

定义了vueutil方法,这个方法官网不建议外面的库去使用,因为里面的方法的实现可能不稳定

Vue.util = {
  warn,
  extend,
  mergeOptions,
  defineReactive
}

还提供了setdeletenextTick方法,options实际上是可以合并一些方法,ASSET_TYPES6、shared/constants.js文件解析

import { ASSET_TYPES } from 'shared/constants'


Vue.set = set
Vue.delete = del
Vue.nextTick = nextTick

Vue.options = Object.create(null)
ASSET_TYPES.forEach(type => {
  Vue.options[type + 's'] = Object.creat(null)
})

定义了base指向vuebuiltInComponents是内置组件,看7、components/index.js文件解析keep-alive通过extend方法扩展到components

import builtInComponents from '../components/index'

Vue.options._base = Vue
extend(Vue.options.components, builtInComponents)

定义了一个全局Vue.useVue.mixinVue.extend程序方法,总而言之在初始化过程中,完成了全局方法的定义,定义之后我们就可以在代码中进行使用

import { initUse } from './use'
import { initMixin } from './mixin'
import { initExtend } from './extend'
import { initAssetRegisters } from './assets'

//(挂载原型方法)
initUse(Vue)
initMixin(Vue)
initExtend(Vue)
initAssetRegisters(Vue)

6、shared/constants.js文件解析

ASSET_TYPES是定义了全局的componentdirectivefilter这些方法

export const SSR_ATTR = 'data-server-rendered'

export const ASSET_TYPES = [
  'component',
  'directive',
  'filter'
]

7、components/index.js文件解析

导出了一个KeepAlivekeep-alive是内置组件,

import KeepAlive from './keep-alive'

export default {
  KeepAlive
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue初始化cytoscape.js可以通过以下步骤实现: 1. 在项目的`main.js`文件中引入cytoscape库,可以使用两种方式进行全局引入。第一种方式是使用`import`语句引入cytoscape并将其赋值给Vue的原型属性`cytoscape`,如所示。第二种方式是使用`import`语句引入cytoscape并将其赋值给Vue的`$cytoscape`属性,如所示。 2. 定义一个Vue组件,在该组件中使用cytoscape.js来创建和展示图形。在组件的`mounted`生命周期钩子函数中,通过`this.$cytoscape`或`this.cytoscape`来调用cytoscape库进行初始化。你可以通过传递一个容器元素、元素数据和样式信息来创建并渲染图形。其中,容器元素可以通过`$refs`来获取,元素和样式信息可以根据实际需求自定义或从后端获取,布局信息可以选择使用cytoscape.js提供的布局算法或自定义布局。 以下是一个示例代码,展示了如何在Vue初始化cytoscape.js: ```javascript <template> <div ref="cyContainer" style="width: 100%; height: 100%;"></div> </template> <script> import cytoscape from 'cytoscape'; export default { mounted() { const container = this.$refs.cyContainer; const elements = [ // 插入元素数据 ]; const style = [ // 定义样式信息 ]; const layout = { // 定义布局信息 }; this.$cytoscape({ container, elements, style, layout }); } } </script> ``` 请根据你的具体项目需求进行相应的配置和调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [vue内使用 cytoscape.js学习(一)](https://blog.csdn.net/weixin_43753330/article/details/95620160)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [网络图库Cytoscape.js的使用(一):初始化配置](https://blog.csdn.net/weixin_44001906/article/details/127513117)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值