Heim >Web-Frontend >js-Tutorial >Beispielanalyse einer Vue-Quellcode-Eintragsdatei

Beispielanalyse einer Vue-Quellcode-Eintragsdatei

小云云
小云云Original
2018-01-31 13:11:511572Durchsuche

In diesem Artikel wird hauptsächlich die Analyse von Vue-Quellcode-Eintragsdateien vorgestellt (empfohlen). Ich werde ihn jetzt mit Ihnen teilen und als Referenz verwenden. Folgen wir dem Herausgeber und schauen wir uns das an. Ich hoffe, es kann allen helfen.

Ich habe schon seit einiger Zeit Angularjs und dann Reactjs verwendet, aber damals hatte ich nie Zeit, meine Gedanken zum Betrachten des Quellcodes aufzuzeichnen Ich möchte dieses hart erkämpfte Denken nicht verschwenden. Ich möchte durchhalten! !

Ich persönlich bin sehr glücklich, wenn ich den Quellcode lese. Jedes Mal, wenn ich den vorherigen Absatz lese, frage ich mich, ob es Ihnen genauso geht wie mir.

Der Vue-Quellcode wird mithilfe des Rollup-Tools aus vielen Modulen zusammengeführt, was in package.json zu sehen ist. Laden wir nun das Vue-Projekt von Github herunter und beginnen wir noch heute mit dem „Denken“.

Die Quellcode-Version, die ich heruntergeladen habe, ist: „Version“: „2.5.7“,

Die Startposition des Quellcodes ist hier zu sehen


"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
 },

Wir haben die Startdatei „web/entry-runtime-with-compiler.js“ gefunden, dann nach dem Vue-Objekt gesucht und es schließlich in „instance/index“ gefunden .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)
}

Es scheint, als wäre hier alles vorbei, denn unser Ziel ist es, die Startposition zu finden, aber ich habe eine Frage, warum braucht Vue so viele Schichten?


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

Als ich mir den Quellcode genau ansah, wurde mir plötzlich klar, schauen wir uns zunächst an, was diese Dateien bewirken:

(1) Instanz/index.js

Einige Hinweise lassen sich aus der Benennung des Vue-Moduls, Instanz (Instanz) erkennen.

Diese Datei ist der Anfang des Vue-Objekts und gleichzeitig die zentralisierte Datei der Methoden der Vue-Prototypkette (Prototyp)


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

Diese Methoden können nur instanziiert und aufgerufen werden.

(2) core/index.js

Diese Datei wird nach der Erstellung und Vorverarbeitung von Instance/index.js erneut verarbeitet. Was hat er also hauptsächlich gemacht? Wir berücksichtigen nicht die laufende Umgebung


initGlobalAPI(Vue)

Ja, wir rufen diese Methode einfach auf, sie ist sehr einfach und klar --- „Globale Schnittstelle initialisieren“,

Kommen wir zur initGlobalAPI-Methode


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

, bei der es sich grundsätzlich um statische Methoden handelt, die in der Form von Vue xxx aufgerufen werden.

(3) runtime/index.js

Hier sind einige Erweiterungen und __patch__ und $mount (Montageelemente) zu Vue.prototype hinzugefügt.


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

Mach einfach eine Sache Die Sache besteht darin, $mount neu zu schreiben


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

je nach Betriebsumgebung An diesem Punkt haben wir die Datei gefunden, die ausgeführt werden soll, wozu jede Datei dient, wie sie konkret ausgeführt wird und was beim nächsten Mal darüber geschrieben wurde. Aber wir sollten uns am Anfang nicht zu sehr um jedes Detail kümmern und nicht jede Codezeile verstehen müssen. Wenn das der Fall ist, wird es wirklich ermüdend sein und wir haben möglicherweise nicht den Mut, durchzuhalten.

Verwandte Empfehlungen:


Detaillierte Erläuterung der Webpack-Dateiseitenverpackung mit mehreren Einträgen

Das obige ist der detaillierte Inhalt vonBeispielanalyse einer Vue-Quellcode-Eintragsdatei. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn