이 글은 주로 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 구성 파일을 구성하는 방법
위 내용은 vue의 소스 코드 항목 파일에 대한 자세한 소개(자세한 튜토리얼)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!