考える: HTML はタグ言語であり、判定やループを実装できるのは JS だけです。テンプレートには命令、補間、JS 式があり、判定やループなどを実装できます。したがって、テンプレートは HTML ではないため、テンプレートを何らかの JS コードに変換する必要があります。このコンパイルはどのように行われるのでしょうか? 分析: テンプレートのコンパイルは、テンプレートをレンダリング関数にコンパイルするプロセスです。このプロセスは、おおまかに次の 3 つの段階に分けられます。 1. 解析するパーサーは主にテンプレート文字列を テンプレート文字列: <div> <p>{{メッセージ}}</p> </div> 要素 AST AST は抽象構文ツリーを指し、 { タグ: "div" // ノードタイプ (1 ラベル、2 リテラル式を含むテキストノード、3 通常のテキストノードまたはコメントノード) タイプ: 1, // 静的ルートノード staticRoot: false, // 静的ノード static: false, 平易: 真実、 // 親ノード要素の説明オブジェクトへの参照 parent: undefined, // ノードタイプが 1 の場合のみ、attrsList 属性が存在します。これは、元の HTML 属性名と値を格納するオブジェクト配列です。attrsList: [], // 上記と同じですが、違いは attrsMap が HTML 属性名と値をキーと値のペアで保存することです: attrsMap: {}, //このノードのすべての子ノードの要素記述オブジェクトを格納します。children: [ { タグ: "p" タイプ: 1, 静的ルート: false、 静的: false、 平易: 真実、 親: {タグ: "div", ...}, 属性リスト: [], 属性マップ: {}, 子供たち: [{ タイプ: 2, テキスト: "{{メッセージ}}", 静的: false、 // ノードタイプが 2 の場合、オブジェクトには式式: "_s(message)" が含まれます。 }] } ] } 1.1 傍受のルール主にテンプレート内の html.indexof('<') の値を判断して、タグをインターセプトするかテキストをインターセプトするかを決定します。 傍受プロセス: 文字列部分 `<div><p>{{メッセージ} } <p></div>` 1.2 傍受プロセス部分最初の迎撃
/** まとめると、タグを一致させ、属性を抽出し、階層を確立します*/ // 上記のマッチング後、残りの文字列は次のようになります: `<p>{{メッセージ} } <p></div>` 2回目のインターセプト /** 同上*/ // 上記のマッチング後、残りの文字列は次のようになります: `{{メッセージ}}</p></div>` 3回目のインターセプト
例えば:
/** 要約すると、タイプを判別してテキストを傍受する*/ // 上記のマッチング後、残りの文字列は次のようになります: </p></div>` 4回目のインターセプト
/** まとめると、ラベルを合わせてレベルを決定します*/ // 上記のマッチング後、残りの文字列は次のようになります: </div>` </div>` 5回目のインターセプト/** 同上*/ 仕上げる 1.3 パーサーの概要
2. 最適化するオプティマイザの主な機能は、生成された AST の静的コンテンツを最適化し、静的ノードをマークすることです。毎回再レンダリングするために、静的サブツリーに新しいノードを作成する必要がなく、仮想 DOM での 2.1 静的ノードAST構文ツリーをトラバースし、すべての静的ノードを見つけてマークします。 関数isStatic(ノード) { // 表現 ノードタイプ === 2 の場合 { 偽を返す } //文章 ノードタイプが3の場合 真を返す } /** 1. 動的バインディング構文は使用できません。つまり、タグに v-、@、または : で始まる属性を含めることはできません。 指定できるのは、 */ 戻り値 !!(node.pre || ( !node.hasBindings && !node.if && !node.for && !isBuiltInTag(ノードタグ) && プラットフォーム予約タグ(node.tag) && !isDirectChildOfTemplateFor(ノード) && Object.keys(ノード).every(isStaticKey) )) } 2.2 静的ルートノード上記の手順の後にツリーをトラバースし、静的ルートノードを見つけてマークします。 2.3 オプティマイザの概要
3. コードジェネレーターを生成するコード ジェネレーターの機能は、AST 構文ツリーを介してコード文字列を生成することです。コード文字列はレンダリング関数にパッケージ化されます。レンダリング関数が実行されると、vnode を取得できます。 3.1 構文付きJS with を使用すると、 {} 内の自由変数の検索方法を変更したり、 {} 内の自由変数を 定数オブジェクト = {a: 100, b: 200} (obj) で { コンソールログ(a) コンソールログ(b) // console.log(c) // エラーを報告します} コード文字列 parseによって生成された要素ASTを解析し、文字列に連結します。 (これ){_c('div',_c('p',[_v(message)])]) を返します} レンダリング関数を取得します。 /** コード文字列は、new Function('code string') を通じて現在のコンポーネントのレンダリング関数を取得できます。*/ const stringCode = `with(this){return _c('div',_c('p',[_v(message)])])}` const render = 新しい関数(文字列コード) さまざまな命令、補間、JS式を表示するには、 const コンパイラ = require('vue-template-compiler') // 補間 const template = `<p>{{message}}</p>` const 結果 = コンパイラ.コンパイル(テンプレート) console.log(結果.レンダリング) // with(this){return _c('p',[_v(_s(message))])} 略語関数の意味を調べるためのVueソースコード テンプレートコンパイルのソースコードは`vue-template-compiler` [2]パッケージにあります。 関数 installRenderHelpers(ターゲット) { target._c = 要素を作成します // タグ v-once target._o = 一度だけマーク // 数値型に変換 target._n = toNumber // 文字列に変換 target._s = toString // v-for をレンダリングする target._l = レンダリングリスト // 通常のスロットとスコープ付きスロットをレンダリングする target._t = renderSlot // staticRenderFns を通じて静的ノードをレンダリングする target._m = renderStatic // フィルターターゲットを取得します。_f = resolveFilter // キーボードイベントのキーコードをチェックする target._k = チェックキーコード ターゲット._b = バインドオブジェクトプロパティ // テキスト vnode を作成する ターゲット._v = テキストVノードを作成します // 空のvnodeを作成する target._e = 空のVノードを作成します target._u = スコープ付きスロットを解決する ターゲット._g = バインドオブジェクトリスナー // 処理修飾子 target._p = prependModifier } まとめ: Vue スキャフォールディングは、開発環境でテンプレートをコンパイルするために 解析プロセスでは、文字列を小さなセグメントに分割し、スタックを維持して DOM の深さを保存します。すべての文字列がインターセプトされると、完全な AST が解析されます。 最適化プロセスでは、すべてのノードを再帰的にマークして静的ノードであるかどうかを示し、次に静的ルート ノードを再度再帰的にマークします。 コード生成ステージでは、関数実行コードの文字列を再帰的に生成します。再帰プロセスでは、異なるノード タイプに応じて異なる生成メソッドが呼び出されます。 これで、vue テンプレートコンパイルの詳細に関するこの記事は終了です。より関連性の高い vue テンプレートコンパイルのコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
>>: Docker Compose マルチコンテナデプロイメントの実装
MySQLキーワードDistinctの使い方の紹介DDL SQLを準備します: テーブルテストを作成...
1. 建設1. htpasswd.txtファイルを準備するファイルには、パッケージを倉庫にアップロー...
目次1. 材料を準備する2. Linuxカーネルファイルをダウンロードする3. コンパイル4. TF...
序文ご存知のとおり、bash (Bourne-Gain Shell) は、ほとんどの Linux デ...
MySQLマスタースレーブを設定した後、スレーブの状態が正常かどうかわからないことが多く、例外が発生...
コンピュータに初めて MySQL をインストールする場合、通常このエラー メッセージは表示されません...
目次ミキシンMixin ノート (重複名)ローカルミックスイングローバル ミックスイン定義とグローバ...
誰もが自分の Web ページの背景にふさわしい画像を見つけることに悩むことが多いと思います。これは事...
最近、C# を使用して Web プログラムを作成していたときに、次のような問題が発生しました。 Te...
データベース アプリケーションは、アプリケーション システムに不可欠な部分です。リレーショナル デー...
MySQL は、スウェーデンの会社 MySQL AB によって開発されたリレーショナル データベース...
序文元のプロジェクトは、パブリックネットワークgitlabに配置されていました。セキュリティ上の理由...
必要な効果: 確認コードを送信するためにクリックした後、ボタンは無効になり、5 秒後に無効解除されま...
目次まとめ環境とツールの準備サーバー仮想化のインストール VMware ESXi仮想マシンのオペレー...
WSLとはBaidu 百科事典からの一節を引用します。 Windows Subsystem for ...