이 글은 주로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!