この記事では主に vue ソース コード エントリ ファイルの分析を紹介します (推奨)。参考として共有します。
私はしばらく Vue プロジェクトを開発していて、以前は angularjs を使用していましたが、その時はソース コードを見て自分の考えを記録する時間がありませんでした。 -もう考え続けたいです! !
私自身、ソースコードを読むたびにとても幸せな気分になります。あなたも私と同じでしょうか。
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
Vue.prototypeにいくつかの拡張機能と__patch__と$mount(マウント要素)が追加されています。
// 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) }
上記は私がコンパイルしたものです, 今後皆さんのお役に立てれば幸いです。
関連記事:
gm Croppingを使用してNodejsで画像を合成する
以上がvue のソース コード エントリ ファイルの詳細な紹介 (詳細なチュートリアル)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。