>  기사  >  웹 프론트엔드  >  Vue 소스 코드 입력 파일 예시 분석

Vue 소스 코드 입력 파일 예시 분석

小云云
小云云원래의
2018-01-31 13:11:511556검색

이 글은 주로 Vue 소스코드 입력 파일 분석(권장)을 소개합니다. 편집자는 꽤 좋다고 생각합니다. 이제 공유하고 참고하겠습니다. 편집자를 따라 살펴보겠습니다. 모두에게 도움이 되기를 바랍니다.

저는 한동안 Vue 프로젝트를 개발해왔습니다. 그 전에는Angularjs를 사용하다가 나중에 Reactjs를 사용했는데, 그 당시에는 소스 코드를 보면서 내 생각을 기록할 시간이 없었습니다. 이제는 이것을 낭비하고 싶지 않습니다. 더 이상 힘들게 얻은 생각을 지속하고 싶습니다! !

저는 개인적으로 소스코드를 읽을 때마다 매우 기분이 좋습니다. 이전 단락을 읽을 때마다 여러분도 저와 같은 마음일지 궁금해집니다.

vue 소스 코드는 package.json에서 볼 수 있는 롤업 도구를 사용하여 여러 모듈에서 병합됩니다. 이제 github에서 vue 프로젝트를 다운로드하고 오늘 "생각"을 시작해 보겠습니다.

내가 다운로드한 소스 코드 버전은 "version": "2.5.7",

소스 코드의 시작 위치는 여기에서 확인할 수 있습니다


"dev": "rollup -w -c build/config.js --environment TARGET:web-full-dev"

// 从build/config.js 中找到 TARGET: web-full-dev 这是运行和编译(支持现在的浏览器,由于里面大量应用了ES6-7)后的

 // Runtime+compiler development build (Browser)
 'web-full-dev': {
  entry: resolve('web/entry-runtime-with-compiler.js'),
  dest: resolve('dist/vue.js'),
  format: 'umd',
  env: 'development',
  alias: { he: './entity-decoder' },
  banner
 },

찾은 시작 파일은 "web/entry"입니다. -runtime-with" -compiler.js", 그런 다음 Vue 개체를 끝까지 검색하여 마침내 "instance/index.js"에서 찾았습니다.


// 这是Vue 的开始位置
function Vue (options) {
 // 判断如果是不是生产环境,且不是通过new关键字来创建对象的话,就在控制台打印一个warning
 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)
}

여기서 끝나는 것 같습니다. 목적은 시작 위치를 찾는 것인데, Vue에 왜 이렇게 많은 레이어가 필요한지 궁금합니다.


entry-runtime-with-compiler.js
->
runtime/index.js
->
core/index.js
->
instance/index.js

소스 코드를 자세히 살펴보니 문득 떠오른 생각이 들었습니다. 이 파일들이 먼저 하는 일:

(1) instance/index.js

Vue 모듈의 이름인 인스턴스(인스턴스)에서 몇 가지 단서를 볼 수 있습니다.

이 파일은 Vue 객체의 시작 부분이자 Vue 프로토타입 체인(프로토타입) 메서드의 중앙 파일이기도 합니다


// _init
initMixin(Vue)
// $set、$delete、$watch
stateMixin(Vue)
// $on、$once、$off、$emit
eventsMixin(Vue)
// _update、$forceUpdate、$destroy
lifecycleMixin(Vue)
// $nextTick、_render、以及多个内部调用的方法
renderMixin(Vue)

이 메서드는 인스턴스화된 후에만 호출할 수 있습니다.

(2) core/index.js

이 파일은 Instance/index.js 생성 및 초기 처리 후 다시 처리됩니다. 그럼 그 사람은 주로 무슨 일을 했나요? 우리는 실행 환경을 고려하지 않습니다


initGlobalAPI(Vue)

예, 방금 이 메서드를 호출했습니다. 매우 간단하고 명확합니다---"전역 인터페이스 초기화",

initGlobalAPI 메서드로 들어가 보겠습니다


export function initGlobalAPI (Vue: GlobalAPI) {
 // config
 const configDef = {}
 configDef.get = () => config
 // 在 非生产环境,如何修改了配置文件config里面的内容会提示警告
 if (process.env.NODE_ENV !== 'production') {
  configDef.set = () => {
   warn(
    'Do not replace the Vue.config object, set inpidual fields instead.'
   )
  }
 }
 // 定义config 属性, 监听变化
 Object.defineProperty(Vue, 'config', configDef)

 // exposed util methods.
 // NOTE: these are not considered part of the public API - avoid relying on
 // them unless you are aware of the risk.
 Vue.util = {
  warn,
  extend,
  mergeOptions,
  defineReactive
 }

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

 Vue.options = Object.create(null)
 // 给vue 创建 ASSET_TYPES 的 空对象
 ASSET_TYPES.forEach(type => {
  Vue.options[type + 's'] = Object.create(null)
 })

 // this is used to identify the "base" constructor to extend all plain-object
 // components with in Weex's multi-instance scenarios.
 Vue.options._base = Vue

 extend(Vue.options.components, builtInComponents)
 // Vue.use
 initUse(Vue)
 // Vue.mixin
 initMixin(Vue)
 // Vue.extend
 initExtend(Vue)
 // Vue.component, Vue.directive, Vue.filter
 initAssetRegisters(Vue)
}

기본적으로 모든 것입니다. 정적 메소드, 즉 Vue.xxx 형태로 호출되는 메소드입니다.

(3) Runtime/index.js

여기에 몇 가지 확장이 있으며 __patch__ 및 $mount(마운팅 요소)가 Vue.prototype에 추가됩니다.


// Vue.options.directives(model和show)和 Vue.options.components(Transition和TransitionGroup)
extend(Vue.options.directives, platformDirectives)
extend(Vue.options.components, platformComponents)

// 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)
}

(4) Entry-runtime-with-compiler.js

Vue는 $mount를 다른 실행 환경에 따라 다른 $mount를 다시 작성합니다


const mount = Vue.prototype.$mount
Vue.prototype.$mount = function (
 el?: string | Element,
 hydrating?: boolean
): Component {
 ...
 return mount.call(this, el, hydrating)
}

요약:

이 시점에서 우리는 실행을 시작할 파일을 찾았고, 각 파일의 용도, 구체적으로 수행 방법, 수행된 작업에 대해서는 다음에 작성하겠습니다. 하지만 처음부터 모든 세부 사항에 너무 신경을 써서는 안 되며, 코드의 모든 줄을 이해할 필요도 없습니다. 그렇다면 정말 피곤할 것이고, 지속할 용기가 없을 수도 있습니다.

관련 추천:

웹팩 다중 항목 파일 페이지 패키징에 대한 자세한 설명

위 내용은 Vue 소스 코드 입력 파일 예시 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.