> 웹 프론트엔드 > JS 튜토리얼 > vue의 소스 코드 항목 파일에 대한 자세한 소개(자세한 튜토리얼)

vue의 소스 코드 항목 파일에 대한 자세한 소개(자세한 튜토리얼)

亚连
풀어 주다: 2018-06-08 18:13:57
원래의
2233명이 탐색했습니다.

이 글은 주로 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) 인스턴스 /index.js

Clues라는 이름을 붙인 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

내가 한 유일한 일은 $mount를 다시 쓰는 것뿐이었습니다. Vue는 다양한 운영 환경에 따라 다른 $mount를 다시 작성합니다

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

위는 제가 컴파일한 것입니다. , 앞으로 모든 사람에게 도움이되기를 바랍니다.

관련 기사:

vue-cli에서 babel 구성 파일을 구성하는 방법

babel 설치 및 구성 튜토리얼을 사용하는 방법

GM 자르기를 사용하여 Nodejs에서 이미지 합성

위 내용은 vue의 소스 코드 항목 파일에 대한 자세한 소개(자세한 튜토리얼)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿