国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

深入了解 Vue3 模板編譯原理

共 365字,需瀏覽 1分鐘

 ·

2020-11-29 20:17

Vue 的編譯模塊包含 4 個(gè)目錄:

compiler-corecompiler-dom // 瀏覽器compiler-sfc // 單文件組件compiler-ssr // 服務(wù)端渲染

其中 compiler-core 模塊是 Vue 編譯的核心模塊,并且是平臺(tái)無(wú)關(guān)的。而剩下的三個(gè)都是在 compiler-core 的基礎(chǔ)上針對(duì)不同的平臺(tái)作了適配處理。

Vue 的編譯分為三個(gè)階段,分別是:parse、transform、codegen。

其中 parse 階段將模板字符串轉(zhuǎn)化為語(yǔ)法抽象樹(shù) AST。transform 階段則是對(duì) AST 進(jìn)行了一些轉(zhuǎn)換處理。codegen 階段根據(jù) AST 生成對(duì)應(yīng)的 render 函數(shù)字符串。

Parse

Vue 在解析模板字符串時(shí),可分為兩種情況:以?<?開(kāi)頭的字符串和不以?<?開(kāi)頭的字符串。

不以?<?開(kāi)頭的字符串有兩種情況:它是文本節(jié)點(diǎn)或?{{ exp }}?插值表達(dá)式。

而以?<?開(kāi)頭的字符串又分為以下幾種情況:

1.元素開(kāi)始標(biāo)簽?

2.元素結(jié)束標(biāo)簽?
3.注釋節(jié)點(diǎn)?4.文檔聲明?

用偽代碼表示,大概過(guò)程如下:

while (s.length) {    if (startsWith(s, '{{')) {        // 如果以 '{{' 開(kāi)頭        node = parseInterpolation(context, mode)    } else if (s[0] === '<') {        // 以 < 標(biāo)簽開(kāi)頭        if (s[1] === '!') {            if (startsWith(s, '

AST 節(jié)點(diǎn)

所有的 AST 節(jié)點(diǎn)定義都在 compiler-core/ast.ts 文件中,下面是一個(gè)元素節(jié)點(diǎn)的定義:

export interface BaseElementNode extends Node {  type: NodeTypes.ELEMENT // 類型  ns: Namespace // 命名空間 默認(rèn)為 HTML,即 0  tag: string // 標(biāo)簽名  tagType: ElementTypes // 元素類型  isSelfClosing: boolean // 是否是自閉合標(biāo)簽 例如 

props: Array // props 屬性,包含 HTML 屬性和指令 children: TemplateChildNode[] // 字節(jié)點(diǎn)}

一些簡(jiǎn)單的要點(diǎn)已經(jīng)講完了,下面我們?cè)購(gòu)囊粋€(gè)比較復(fù)雜的例子來(lái)詳細(xì)講解一下 parse 的處理過(guò)程。

{{ test }}

一個(gè)文本節(jié)點(diǎn)
good job!

上面的模板字符串假設(shè)為 s,第一個(gè)字符 s[0] 是?<?開(kāi)頭,那說(shuō)明它只能是剛才所說(shuō)的四種情況之一。這時(shí)需要再看一下 s[1] 的字符是什么:

1.如果是?!,則調(diào)用字符串原生方法?startsWith()?看看是以?'

{{ test }}

一個(gè)文本節(jié)點(diǎn)
good job!

注釋文本和普通文本節(jié)點(diǎn)解析規(guī)則都很簡(jiǎn)單,直接截?cái)?,生成?jié)點(diǎn)。注釋文本調(diào)用?parseComment()?函數(shù)處理,文本節(jié)點(diǎn)調(diào)用?parseText()?處理。

雙花插值的字符串處理邏輯稍微復(fù)雜點(diǎn),例如示例中的?{{ test }}

1.先將雙花括號(hào)中的內(nèi)容提取出來(lái),即?test,再對(duì)它執(zhí)行?trim(),去除空格。2.然后會(huì)生成兩個(gè)節(jié)點(diǎn),一個(gè)節(jié)點(diǎn)是?INTERPOLATION,type 為 5,表示它是雙花插值。3.第二個(gè)節(jié)點(diǎn)是它的內(nèi)容,即?test,它會(huì)生成一個(gè)?SIMPLE_EXPRESSION?節(jié)點(diǎn),type 為 4。

return {  type: NodeTypes.INTERPOLATION, // 雙花插值類型  content: {    type: NodeTypes.SIMPLE_EXPRESSION,    isStatic: false, // 非靜態(tài)節(jié)點(diǎn)    isConstant: false,    content,    loc: getSelection(context, innerStart, innerEnd)  },  loc: getSelection(context, start)}

剩下的字符串解析邏輯和上文的差不多,就不解釋了,最后這個(gè)示例解析出來(lái)的 AST 如下所示:

3fbb17a5d7e82491b00c3751ac26087a.webp

從 AST 上,我們還能看到某些節(jié)點(diǎn)上有一些別的屬性:

1.ns,命名空間,一般為 HTML,值為 0。2.loc,它是一個(gè)位置信息,表明這個(gè)節(jié)點(diǎn)在源 HTML 字符串中的位置,包含行,列,偏移量等信息。3.{{ test }}?解析出來(lái)的節(jié)點(diǎn)會(huì)有一個(gè) isStatic 屬性,值為 false,表示這是一個(gè)動(dòng)態(tài)節(jié)點(diǎn)。如果是靜態(tài)節(jié)點(diǎn),則只會(huì)生成一次,并且在后面的階段一直復(fù)用同一個(gè),不用進(jìn)行 diff 比較。

另外還有一個(gè) tagType 屬性,它有 4 個(gè)值:

export const enum ElementTypes {  ELEMENT, // 0 元素節(jié)點(diǎn)  COMPONENT, // 1 組件  SLOT, // 2 插槽  TEMPLATE // 3 模板}

主要用于區(qū)分上述四種類型節(jié)點(diǎn)。

Transform

在 transform 階段,Vue 會(huì)對(duì) AST 進(jìn)行一些轉(zhuǎn)換操作,主要是根據(jù)不同的 AST 節(jié)點(diǎn)添加不同的選項(xiàng)參數(shù),這些參數(shù)在 codegen 階段會(huì)用到。下面列舉一些比較重要的選項(xiàng):

cacheHandlers

如果 cacheHandlers 的值為 true,則表示開(kāi)啟事件函數(shù)緩存。例如?@click="foo"?默認(rèn)編譯為?{ onClick: foo },如果開(kāi)啟了這個(gè)選項(xiàng),則編譯為

{ onClick: _cache[0] || (_cache[0] = e => _ctx.foo(e)) }

hoistStatic

hoistStatic 是一個(gè)標(biāo)識(shí)符,表示要不要開(kāi)啟靜態(tài)節(jié)點(diǎn)提升。如果值為 true,靜態(tài)節(jié)點(diǎn)將被提升到?render()?函數(shù)外面生成,并被命名為?_hoisted_x?變量。

例如?一個(gè)文本節(jié)點(diǎn)?生成的代碼為?const _hoisted_2 = /*#__PURE__*/_createTextVNode(" 一個(gè)文本節(jié)點(diǎn) ")。

下面兩張圖,前者是?hoistStatic = false,后面是?hoistStatic = true。大家可以在網(wǎng)站[1]上自己試一下。

fada6b933927af9f361efd5ec3ceea43.webp

fe4e6df023e1947fd734d6af7a5ed800.webp

prefixIdentifiers

這個(gè)參數(shù)的作用是用于代碼生成。例如?{{ foo }}?在 module 模式下生成的代碼為?_ctx.foo,而在 function 模式下是?with (this) { ... }。因?yàn)樵?module 模式下,默認(rèn)為嚴(yán)格模式,不能使用 with 語(yǔ)句。

PatchFlags

transform 在對(duì) AST 節(jié)點(diǎn)進(jìn)行轉(zhuǎn)換時(shí),會(huì)打上 patchflag 參數(shù),這個(gè)參數(shù)主要用于 diff 比較過(guò)程。當(dāng) DOM 節(jié)點(diǎn)有這個(gè)標(biāo)志并且大于 0,就代表要更新,沒(méi)有就跳過(guò)。

我們來(lái)看一下 patchflag 的取值范圍:

export const enum PatchFlags {  // 動(dòng)態(tài)文本節(jié)點(diǎn)  TEXT = 1,
// 動(dòng)態(tài) class CLASS = 1 << 1, // 2
// 動(dòng)態(tài) style STYLE = 1 << 2, // 4
// 動(dòng)態(tài)屬性,但不包含類名和樣式 // 如果是組件,則可以包含類名和樣式 PROPS = 1 << 3, // 8
// 具有動(dòng)態(tài) key 屬性,當(dāng) key 改變時(shí),需要進(jìn)行完整的 diff 比較。 FULL_PROPS = 1 << 4, // 16
// 帶有監(jiān)聽(tīng)事件的節(jié)點(diǎn) HYDRATE_EVENTS = 1 << 5, // 32
// 一個(gè)不會(huì)改變子節(jié)點(diǎn)順序的 fragment STABLE_FRAGMENT = 1 << 6, // 64
// 帶有 key 屬性的 fragment 或部分子字節(jié)有 key KEYED_FRAGMENT = 1 << 7, // 128
// 子節(jié)點(diǎn)沒(méi)有 key 的 fragment UNKEYED_FRAGMENT = 1 << 8, // 256
// 一個(gè)節(jié)點(diǎn)只會(huì)進(jìn)行非 props 比較 NEED_PATCH = 1 << 9, // 512
// 動(dòng)態(tài) slot DYNAMIC_SLOTS = 1 << 10, // 1024
// 靜態(tài)節(jié)點(diǎn) HOISTED = -1,
// 指示在 diff 過(guò)程應(yīng)該要退出優(yōu)化模式 BAIL = -2}

從上述代碼可以看出 patchflag 使用一個(gè) 11 位的位圖來(lái)表示不同的值,每個(gè)值都有不同的含義。Vue 在 diff 過(guò)程會(huì)根據(jù)不同的 patchflag 使用不同的 patch 方法。

下圖是經(jīng)過(guò) transform 后的 AST:

5cc89f0e14d4810be33231433944eef8.webp

可以看到 codegenNode、helpers 和 hoists 已經(jīng)被填充上了相應(yīng)的值。codegenNode 是生成代碼要用到的數(shù)據(jù),hoists 存儲(chǔ)的是靜態(tài)節(jié)點(diǎn),helpers 存儲(chǔ)的是創(chuàng)建 VNode 的函數(shù)名稱(其實(shí)是 Symbol)。

在正式開(kāi)始 transform 前,需要?jiǎng)?chuàng)建一個(gè) transformContext,即 transform 上下文。和這三個(gè)屬性有關(guān)的數(shù)據(jù)和方法如下:

helpers: new Set(),hoists: [],
// methodshelper(name) { context.helpers.add(name) return name},helperString(name) { return `_${helperNameMap[context.helper(name)]}`},hoist(exp) { context.hoists.push(exp) const identifier = createSimpleExpression( `_hoisted_${context.hoists.length}`, false, exp.loc, true ) identifier.hoisted = exp return identifier},

我們來(lái)看一下具體的 transform 過(guò)程是怎樣的,用?

{{ test }}

?來(lái)做示例。

這個(gè)節(jié)點(diǎn)對(duì)應(yīng)的是?transformElement()?轉(zhuǎn)換函數(shù),由于?p?沒(méi)有綁定動(dòng)態(tài)屬性,沒(méi)有綁定指令,所以重點(diǎn)不在它,而是在?{{ test }}?上。{{ test }}?是一個(gè)雙花插值表達(dá)式,所以將它的 patchFlag 設(shè)為 1(動(dòng)態(tài)文本節(jié)點(diǎn)),對(duì)應(yīng)的執(zhí)行代碼是?patchFlag |= 1。然后再執(zhí)行?createVNodeCall()?函數(shù),它的返回值就是這個(gè)節(jié)點(diǎn)的 codegenNode 值。

node.codegenNode = createVNodeCall(    context,    vnodeTag,    vnodeProps,    vnodeChildren,    vnodePatchFlag,    vnodeDynamicProps,    vnodeDirectives,    !!shouldUseBlock,    false /* disableTracking */,    node.loc)

createVNodeCall()?根據(jù)這個(gè)節(jié)點(diǎn)添加了一個(gè)?createVNode?Symbol 符號(hào),它放在 helpers 里。其實(shí)就是要在代碼生成階段引入的幫助函數(shù)。

// createVNodeCall() 內(nèi)部執(zhí)行過(guò)程,已刪除多余的代碼context.helper(CREATE_VNODE)
return { type: NodeTypes.VNODE_CALL, tag, props, children, patchFlag, dynamicProps, directives, isBlock, disableTracking, loc}

hoists

一個(gè)節(jié)點(diǎn)是否添加到 hoists 中,主要看它是不是靜態(tài)節(jié)點(diǎn),并且需要將 hoistStatic 設(shè)為 true。

// 屬性靜態(tài)節(jié)點(diǎn)

{{ test }}

一個(gè)文本節(jié)點(diǎn) // 靜態(tài)節(jié)點(diǎn)
good job!
// 靜態(tài)節(jié)點(diǎn)

可以看到,上面有三個(gè)靜態(tài)節(jié)點(diǎn),所以 hoists 數(shù)組有 3 個(gè)值。并且無(wú)論靜態(tài)節(jié)點(diǎn)嵌套有多深,都會(huì)被提升到 hoists 中。

type 變化

74a23dfe826ba0cdafe90eb1c0ee5240.webp

從上圖可以看到,最外層的 div 的 type 原來(lái)為 1,經(jīng)過(guò) transform 生成的 codegenNode 中的 type 變成了 13。這個(gè) 13 是代碼生成對(duì)應(yīng)的類型?VNODE_CALL。另外還有:

// codegenVNODE_CALL, // 13JS_CALL_EXPRESSION, // 14JS_OBJECT_EXPRESSION, // 15JS_PROPERTY, // 16JS_ARRAY_EXPRESSION, // 17JS_FUNCTION_EXPRESSION, // 18JS_CONDITIONAL_EXPRESSION, // 19JS_CACHE_EXPRESSION, // 20

剛才提到的例子?{{ test }},它的 codegenNode 就是通過(guò)調(diào)用?createVNodeCall()?生成的:

return {  type: NodeTypes.VNODE_CALL,  tag,  props,  children,  patchFlag,  dynamicProps,  directives,  isBlock,  disableTracking,  loc}

可以從上述代碼看到,type 被設(shè)置為 NodeTypes.VNODE_CALL,即 13。

每個(gè)不同的節(jié)點(diǎn)都由不同的 transform 函數(shù)來(lái)處理,由于篇幅有限,具體代碼請(qǐng)自行查閱。

Codegen

代碼生成階段最后生成了一個(gè)字符串,我們把字符串的雙引號(hào)去掉,看一下具體的內(nèi)容是什么:

const _Vue = Vueconst { createVNode: _createVNode, createCommentVNode: _createCommentVNode, createTextVNode: _createTextVNode } = _Vue
const _hoisted_1 = { name: "test" }const _hoisted_2 = /*#__PURE__*/_createTextVNode(" 一個(gè)文本節(jié)點(diǎn) ")const _hoisted_3 = /*#__PURE__*/_createVNode("div", null, "good job!", -1 /* HOISTED */)
return function render(_ctx, _cache) { with (_ctx) { const { createCommentVNode: _createCommentVNode, toDisplayString: _toDisplayString, createVNode: _createVNode, createTextVNode: _createTextVNode, openBlock: _openBlock, createBlock: _createBlock } = _Vue
return (_openBlock(), _createBlock("div", _hoisted_1, [ _createCommentVNode(" 這是注釋 "), _createVNode("p", null, _toDisplayString(test), 1 /* TEXT */), _hoisted_2, _hoisted_3 ])) }}

代碼生成模式

可以看到上述代碼最后返回一個(gè)?render()?函數(shù),作用是生成對(duì)應(yīng)的 VNode。

其實(shí)代碼生成有兩種模式:module 和 function,由標(biāo)識(shí)符 prefixIdentifiers 決定使用哪種模式。

function 模式的特點(diǎn)是:使用?const { helpers... } = Vue?的方式來(lái)引入幫助函數(shù),也就是是?createVode()?createCommentVNode()?這些函數(shù)。向外導(dǎo)出使用?return?返回整個(gè)?render()?函數(shù)。

module 模式的特點(diǎn)是:使用 es6 模塊來(lái)導(dǎo)入導(dǎo)出函數(shù),也就是使用 import 和 export。

靜態(tài)節(jié)點(diǎn)

另外還有三個(gè)變量是用?_hoisted_?命名的,后面跟著數(shù)字,代表這是第幾個(gè)靜態(tài)變量。再看一下 parse 階段的 HTML 模板字符串:

{{ test }}

一個(gè)文本節(jié)點(diǎn)
good job!

這個(gè)示例只有一個(gè)動(dòng)態(tài)節(jié)點(diǎn),即?{{ test }},剩下的全是靜態(tài)節(jié)點(diǎn)。從生成的代碼中也可以看出,生成的節(jié)點(diǎn)和模板中的代碼是一一對(duì)應(yīng)的。靜態(tài)節(jié)點(diǎn)的作用就是只生成一次,以后直接復(fù)用。

細(xì)心的網(wǎng)友可能發(fā)現(xiàn)了?_hoisted_2?和?_hoisted_3?變量中都有一個(gè)?/*#__PURE__*/?注釋。

這個(gè)注釋的作用是表示這個(gè)函數(shù)是純函數(shù),沒(méi)有副作用,主要用于 tree-shaking。壓縮工具在打包時(shí)會(huì)將未被使用的代碼直接刪除(shaking 搖掉)。

再來(lái)看一下生成動(dòng)態(tài)節(jié)點(diǎn)?{{ test }}?的代碼:?_createVNode("p", null, _toDisplayString(test), 1 /* TEXT */)。

其中?_toDisplayString(test)?的內(nèi)部實(shí)現(xiàn)是:

return val == null    ? ''    : isObject(val)      ? JSON.stringify(val, replacer, 2)      : String(val)

代碼很簡(jiǎn)單,就是轉(zhuǎn)成字符串輸出。

而?_createVNode("p", null, _toDisplayString(test), 1 /* TEXT */)?最后一個(gè)參數(shù) 1 就是 transform 添加的 patchflag 了。

幫助函數(shù) helpers

在 transform、codegen 這兩個(gè)階段,我們都能看到 helpers 的影子,到底 helpers 是干什么用的?

// Name mapping for runtime helpers that need to be imported from 'vue' in// generated code. Make sure these are correctly exported in the runtime!// Using `any` here because TS doesn't allow symbols as index type.export const helperNameMap: any = {  [FRAGMENT]: `Fragment`,  [TELEPORT]: `Teleport`,  [SUSPENSE]: `Suspense`,  [KEEP_ALIVE]: `KeepAlive`,  [BASE_TRANSITION]: `BaseTransition`,  [OPEN_BLOCK]: `openBlock`,  [CREATE_BLOCK]: `createBlock`,  [CREATE_VNODE]: `createVNode`,  [CREATE_COMMENT]: `createCommentVNode`,  [CREATE_TEXT]: `createTextVNode`,  [CREATE_STATIC]: `createStaticVNode`,  [RESOLVE_COMPONENT]: `resolveComponent`,  [RESOLVE_DYNAMIC_COMPONENT]: `resolveDynamicComponent`,  [RESOLVE_DIRECTIVE]: `resolveDirective`,  [WITH_DIRECTIVES]: `withDirectives`,  [RENDER_LIST]: `renderList`,  [RENDER_SLOT]: `renderSlot`,  [CREATE_SLOTS]: `createSlots`,  [TO_DISPLAY_STRING]: `toDisplayString`,  [MERGE_PROPS]: `mergeProps`,  [TO_HANDLERS]: `toHandlers`,  [CAMELIZE]: `camelize`,  [CAPITALIZE]: `capitalize`,  [SET_BLOCK_TRACKING]: `setBlockTracking`,  [PUSH_SCOPE_ID]: `pushScopeId`,  [POP_SCOPE_ID]: `popScopeId`,  [WITH_SCOPE_ID]: `withScopeId`,  [WITH_CTX]: `withCtx`}
export function registerRuntimeHelpers(helpers: any) { Object.getOwnPropertySymbols(helpers).forEach(s => { helperNameMap[s] = helpers[s] })}

其實(shí)幫助函數(shù)就是在代碼生成時(shí)從 Vue 引入的一些函數(shù),以便讓程序正常執(zhí)行,從上面生成的代碼中就可以看出來(lái)。而 helperNameMap 是默認(rèn)的映射表名稱,這些名稱就是要從 Vue 引入的函數(shù)名稱。

另外,我們還能看到一個(gè)注冊(cè)函數(shù)?registerRuntimeHelpers(helpers: any(),它是干什么用的呢?

我們知道編譯模塊 compiler-core 是平臺(tái)無(wú)關(guān)的,而 compiler-dom 是瀏覽器相關(guān)的編譯模塊。為了能在瀏覽器正常運(yùn)行 Vue 程序,就得把瀏覽器相關(guān)的 Vue 數(shù)據(jù)和函數(shù)導(dǎo)入進(jìn)來(lái)。?registerRuntimeHelpers(helpers: any()?正是用來(lái)做這件事的,從 compiler-dom 的 runtimeHelpers.ts 文件就能看出來(lái):

registerRuntimeHelpers({  [V_MODEL_RADIO]: `vModelRadio`,  [V_MODEL_CHECKBOX]: `vModelCheckbox`,  [V_MODEL_TEXT]: `vModelText`,  [V_MODEL_SELECT]: `vModelSelect`,  [V_MODEL_DYNAMIC]: `vModelDynamic`,  [V_ON_WITH_MODIFIERS]: `withModifiers`,  [V_ON_WITH_KEYS]: `withKeys`,  [V_SHOW]: `vShow`,  [TRANSITION]: `Transition`,  [TRANSITION_GROUP]: `TransitionGroup`})

它運(yùn)行?registerRuntimeHelpers(helpers: any(),往映射表注入了瀏覽器相關(guān)的部分函數(shù)。

helpers 是怎么使用的呢?

在 parse 階段,解析到不同節(jié)點(diǎn)時(shí)會(huì)生成對(duì)應(yīng)的 type。

在 transform 階段,會(huì)生成一個(gè) helpers,它是一個(gè) set 數(shù)據(jù)結(jié)構(gòu)。每當(dāng)它轉(zhuǎn)換 AST 時(shí),都會(huì)根據(jù) AST 節(jié)點(diǎn)的 type 添加不同的 helper 函數(shù)。

例如,假設(shè)它現(xiàn)在正在轉(zhuǎn)換的是一個(gè)注釋節(jié)點(diǎn),它會(huì)執(zhí)行?context.helper(CREATE_COMMENT),內(nèi)部實(shí)現(xiàn)相當(dāng)于?helpers.add('createCommentVNode')。然后在 codegen 階段,遍歷 helpers,將程序需要的函數(shù)從 Vue 里導(dǎo)入,代碼實(shí)現(xiàn)如下:

// 這是 module 模式`import { ${ast.helpers  .map(s => `${helperNameMap[s]} as _${helperNameMap[s]}`)  .join(', ')} } from ${JSON.stringify(runtimeModuleName)}\n`

如何生成代碼?

從 codegen.ts 文件中,可以看到很多代碼生成函數(shù):

generate() // 代碼生成入口文件genFunctionExpression() // 生成函數(shù)表達(dá)式genNode() // 生成 Vnode 節(jié)點(diǎn)...

生成代碼則是根據(jù)不同的 AST 節(jié)點(diǎn)調(diào)用不同的代碼生成函數(shù),最終將代碼字符串拼在一起,輸出一個(gè)完整的代碼字符串。

老規(guī)矩,還是看一個(gè)例子:

const _hoisted_1 = { name: "test" }const _hoisted_2 = /*#__PURE__*/_createTextVNode(" 一個(gè)文本節(jié)點(diǎn) ")const _hoisted_3 = /*#__PURE__*/_createVNode("div", null, "good job!", -1 /* HOISTED */)

看一下這段代碼是怎么生成的,首先執(zhí)行?genHoists(ast.hoists, context),將 transform 生成的靜態(tài)節(jié)點(diǎn)數(shù)組 hoists 作為第一個(gè)參數(shù)。genHoists()?內(nèi)部實(shí)現(xiàn):

hoists.forEach((exp, i) => {    if (exp) {        push(`const _hoisted_${i + 1} = `);        genNode(exp, context);        newline();    }})

從上述代碼可以看到,遍歷 hoists 數(shù)組,調(diào)用?genNode(exp, context)genNode()?根據(jù)不同的 type 執(zhí)行不同的函數(shù)。

const _hoisted_1 = { name: "test" }

這一行代碼中的?const _hoisted_1 =?由?genHoists()?生成,{ name: "test" }?由?genObjectExpression()?生成。同理,剩下的兩行代碼生成過(guò)程也是如此,只是最終調(diào)用的函數(shù)不同。

References

[1]?網(wǎng)站:?https://vue-next-template-explorer.netlify.app/#%7B%22src%22%3A%22%5Cr%5Cn%22%2C%22options%22%3A%7B%22mode%22%3A%22module%22%2C%22prefixIdentifiers%22%3Afalse%2C%22optimizeImports%22%3Afalse%2C%22hoistStatic%22%3Afalse%2C%22cacheHandlers%22%3Afalse%2C%22scopeId%22%3Anull%2C%22ssrCssVars%22%3A%22%7B%20color%20%7D%22%2C%22bindingMetadata%22%3A%7B%22TestComponent%22%3A%22setup%22%2C%22foo%22%3A%22setup%22%2C%22bar%22%3A%22props%22%7D%7D%7D


瀏覽 42
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 大香蕉在线75| 黑种人配中国少妇HD| 国产成人无码精品久在线观看| 亚洲欧美婷婷五月色综合| 色婷婷在线视频| 天天操人人射| 免费的操逼视频| 国产麻豆剧传媒精品国产AV| 91精品人妻少妇无码影院| 国产成人免费| 18禁看网站| 国产精品女人777777| 日韩日韩日韩日韩| 天堂网址激情网址| 丁香五月婷婷六月| 亚洲影院第一页| 操逼网址大全| 人人草人人操| 91超碰在线| 国产免费性爱视频| 欧美午夜网站| 日本成人A片| 人人精品| 亚洲视频天天射| 国产精品在线看| 一区二区三区日本| 热久久这里只有精品| 国产AV无码高清| 俺来也在线视频| 日韩激情无码一区二区| 国产精品黄色视频| 日本无码嫩草一区二区| 人人妻人人爱| 91嫩草久久久久久久| 日本成人黄色| 996热re视频精品视频| 熟女少妇一区二区| 亚洲AV无一区二区三区久久| 丁香五月色| 黄色一区二区三区| 久热精品在线| 激情白浆| 九色首页| 91探花视频在线观看| 日韩无码性爱| 蜜桃秘一二三区最新| 久久99精品国产.久久久久| 国产a一级a毛一级视频| 国精自拍| 2026国产精品视频| 奇米一区| 国产精品一二三区| 少妇熟女视频一区二区三区| 人成免费在线视频| 丰满人妻一区二区三区视频在线不卡| 天天舔九色婷婷| AV电影在线观看| 青娱乐国产AV| 亚洲1234区| 作爱网站| 久久爆乳一区二区三区| 中文字幕乱码免费综合久久| 国产av小电影| 激情五月天丁香| 99精品视频在线播放免费| 欧美色综合| 中文字幕亚洲中文字幕| 中文字幕亚洲无码视频| 91国语又粗又大对白| 久久穴| 成人性爱在线观看| 丁香五月婷婷五月| 人人人人摸| 日本免费无码| 91乱子伦国产乱子伦!| AAA激情| 色欲成人网| 久久伊人精品| 北条麻妃视频在线观看| 国产激情精品视频| 少妇搡BBBB搡BBB搡HD(| aa无码| 人妻精品一卡二卡| 东京热第一页| 日本综合视频| 免费a在线观看| 高清无码片| 日韩精品A片| 日本高潮视频| i美女福利视频| 一区二区三区四区成人| 亚洲AV无码精品成人| 成人无码专区| 影音先锋91视频| 亚洲AV高清| 夜夜骚av.一区二区三区四区| 色男天堂| 免费无码婬片AAAA片直播| 青草伊人av| 四川BBB搡BBB爽爽爽电影| 中文字幕乱码人妻二区三区| AV中文字幕电影| 91抽插| 黄片视频免费在线观看| 欧美激情色色| 亚洲色天堂网| 在线高清无码视频| 婷婷五月天影院| 中文字幕不卡视频| 北条麻妃精品在线| 国产精品啪啪啪| 波多野结衣在线观看一区二区 | 久久视频免费| 国产高清激情| 国产精品无码在线| 91看片看婬黄大片| 中文字幕在线观看日本| 丰满人妻一区二区三区免费| 奇米影视77777| 97午夜福利视频| 日韩在线国产| av亚洲波多野结衣白嫩水多波| 久久无码人妻精品一区二区三区| 天天干天天肏| 国产精品国产三级囯产普通话2 | 色999在线播放视频| 日本高清一区二区高清免费视频 | 日逼小视频| 久热中文在线观看精品视频 | 免费AV观看| 狠狠的操| 爆操太妹| 亚卅毛片| 99久久婷婷国产综合精品青牛牛| 亚洲精品鲁一鲁一区二区三区| 亚洲内射网| 国产搡BBB爽爽爽视频| 久久五月天视频| 99精品一区二区三区| 日本一区二区精品| 亚洲黄色在线播放| 欧美综合婷婷| 日韩视频91| 五月丁香色播| 色综合久久久无码中文字幕999| 在线日韩AV| 欧美XXX视频| 亚洲爱爱网| 日韩欧美内射| 一级特黄大片录像i| 一级A片60分钟免费看| 狠狠久| 国产伦精品一区二区三区妓女| 欧美a在线| 国产欧美一区二区| 小草久久95| 日韩99热| 亚洲操逼图片| 操逼视频在线免费看| 福利一区在线观看| 69福利网| 熟妇人妻丰满久久久久久久无码 | 色婷婷色99国产综合精品| 色综合一区二区| 四川女人毛多水多A片| 人人摸人人干人人操| 免费一级无码婬片A片APP直播| 8050网午夜| 国产成人一区| 中文字幕视频一区日日骚| 蜜臀久久99精品久久一区二区| 日本人妻中出| 亚洲国产成人精品激情在线| 91AV天天在线观看| 激情另类视频| 国产乱子伦一区二区三区在线观看| 久久婷婷色| 日韩在线中文字幕视频| AV三级片在线观看| 日韩操逼网| 国产福利小视频| 成人性生活A级毛片网站| 亚洲免费无码| 91丨豆花丨成人熟女| 欧美日韩加勒比| 色中色av| 日韩图色| 熟妇人妻丰满久久久久久久无码 | 国产三级在线播放| 黄色一区在线| 中文字幕免费中文| 欧美一级黃色A片免费看蜜桃熟了 一级a一级a免费观看免免黄‘/ | 久久99精品久久久久| 无码电影视频| 青娱乐在线精品| 偷拍亚洲色图| 亚洲午夜精品视频| 91婷婷五月天| 日韩无码免费| 久久伊人在线| 免费人成在线观看视频播放| 亚洲性爱在线视频| 91成人导航| 欧美成人无码A片免费| 蜜桃一区二区视频在线观看| 久久久久久无码视频| 西西人体444www| www.97av| 再深点灬好爽灬轻点久久国产| 人人妻人人爽人人精品| 无码内射视频| 日韩精品无码av| 美日韩一区| 久久婷婷国产麻豆91天堂| 欧美性综合| 婷婷av在线| 九九免费视频| 欧美日韩三级在线| 国产免费观看视频| 日韩一区二区在线视频| 欧美日本在线| 羽月希在线播放| 国产aaaaaaaaaaaaa| 成人免费在线电影| 亚洲黄片免费在线观看| 爱爱视频免费看| 欧美色色色网| 日韩不卡视频在线观看| 黄色视频毛片| 护士小雪的yin荡高日记H视频| 91在线亚洲| 亚洲日韩中文字幕无码| 1000部毛片A片免费视频| 精品日韩一区二区三区| 91香蕉在线观看| 国产777| 国产黄色片网站| 在线免费中文字幕| 日韩三级成人| 久久免费精品视频| 色94色.欧美.setu| 先锋AV资源在线| 天堂8在线| 欧美成人大香蕉| 成人黄色视频网站| 欧美日韩三级在线| 9l视频自拍九色9l视频成人| 91人妻最真实刺激绿帽| 国产视频99| 青青草资源站| 翔田千里无码一区| 嫩BBB槡BBBB槡BBBB视频-百度| 成人精品三级AV在线看| 自拍无码视频| 黑人aV| 操逼网首页123| 午夜成人av| 火淫玖玖免费精品| 三级无码在线播放| 天天看天天摸| 丁香五月av| 无码一区二区av| 国产亚洲精品成人a| 欧美成人精品激情在线视频| 中文人妻第9页| 操b国产| 欧美成人一级片| 国精产品一二四区黑人| 免费看无码网站成人A片| 无码天天| 台湾毛片| 色444| 国产探花视频在线免费观看| 内射网站在线观看| 人妻无码一区二区三区| 在线免费观看黄色小视频| 啪啪啪免费网站| 国产超级无码高清在线视频观看| 777777国产7777777| 日韩视频无码| 国产熟女一区二区三区五月婷| 亚洲国产精品精JIZZ老师| 日本毛片在线观看| 国产AV毛片| 成人亚洲天堂| 日韩无码成人片| 青娱乐自拍视频| 欧美啪啪视频| 欧美AⅤ在线| 中文字幕一区二区三区四区50岁 | 成人欧美在线观看| 苍井空一区二区| 亚洲无码久久久| 无码精品人妻一区二区欧美| 在线国产91| 久久久9999| 一级国产黄色视频| 精品素人在线| 97视频在线观看免费| 人人操人人射| 内射一区二区三区| 日韩A∨视频| 伊人激情| 操逼视频在线免费看| 欧美日韩国产精品成人| 天天做| 免费爱爱网站| 日韩A∨视频| 国产成人AV| 国产午夜精品一区二区三区嫩A | 黄色毛片在线播放| 囯产精品一区二区三区线一牛影视1| 国产精品色哟哟| 霸道总裁雷总各种姿势白浆爱情岛论坛 | AV色片| 91超碰在线| 久久综合17p| 精品人妻一区二区免费蜜桃视频| 日韩精品久| 国产午夜成人| 爆乳一区二区| 亚洲无码午夜| 丝瓜av| 成人视频网站18| 国产乱子伦精品久久| 亚洲天堂一区二区三区| 天天爽天天爽夜夜爽| 特级西西444www大精品| 免费爱爱视频| 日本AⅤ电影| 国产AV一级片| 天天干夜夜操| 欧美性综合| 日韩欧美综合一区| 成人视频你懂的| 国精产品乱码一区一区三区四区| 成人精品秘久久久按摩下载| 久色国产| 91在线无码精品秘软件| 天天操天天操天天| 午夜无码鲁丝片午夜精品一区二区 | 亚洲日本在线观看| 91精品少妇高潮一区二区三区不卡 | 中文字幕av免费观看| 果冻传媒A片一二三区| 久久另类TS人妖一区二区免费| 97成人人妻一区二区三区| 五月天激情综合| 在线看91| 吴梦梦《女教师时间暂停》| 久久久高清无码| 人人爽人人操| 中文四区| 青青国产视频| 四虎www| 三级黄色片| 性爱A级视频| 在线免费观看一区| 伊人影院麻豆| 免费视频一区二区三区四区| 国产人妻人伦精品一区| 成年人在线播放| 久操视频在线| 一级a免一级a做免费线看内祥| 99在线视频观看| 成人无码观看| 成人自拍视频| 天堂久久久久| 欧美日韩一区二区三区| 黄在线免费观看| 影音先锋一区二区三区| 日韩精品在线视频观看| 亚洲AV免费在线观看| 韩国无码视频在线观看| 国产无码激情视频| 99久久精品国产成人一区二区| 久久久久久久国产精品| 国语一区| 无码aa| 亚洲黄色一级电影| 午夜国产在线| 黄色国产网站| 天天操天天看| 麻豆91精品91久久久| 久久精品在线观看| 久久蜜桃视频| 青娱乐av| 狼人一区二区| 91国黄色毛片在线观看| 熟女人妻在线观看| 日本AI高清无码在线观看网址| 女同久久另类99精品国产91 | 乱子伦毛片国产| 一线天嫩穴少妇| 一级a免一级a做免费线看内祥| 国产中文字幕AV在线播放| 翔田千里AV| 免费在线观看中文字幕| 欧美黄色免费网站| 国产女同在线观看| 人人妻人人妻| 国产成人精品一区二区三区四区| 成人午夜毛片| 国产操逼网址| 国产TS丝袜人妖系列视频| 三级片无码在线| 狠狠操狠狠| 成人午夜天堂| 色男人的天堂| 黄色电影一区二区| 成人肏逼视频在线| 黄色一及片| 2019中文字幕mv第三季歌词 | 日韩有码中文字幕在线观看| AV免费激情影院| 久久久久久久久久国产| 99re6热在线精品视频功能| 91足浴店按摩漂亮少妇| 精品视频久久久久久| 人妻久久久| 欧美成人综合色| 日本黄色电影网址| www.豆花福利视频| 亚洲成人一区二区| 亚洲第一视频在线观看| 青青青青操| 在线播放无码| 日韩资源站| 久久AV片| 欧美久久一区| 亚洲三级无码| 黄色A片电影| 黄色大片中国一级片-免费看特一级片-亚洲黄色AV | 亚洲欧美美国产| 欧美在线网址| 西西人体BBBBBB| 五十路在线视频| 亚洲a电影| 五月天黄色电影| 66久久| 最新国产毛片| 蜜桃秘av一区二区三区安全| 中文字幕中文字幕无码| 91在线视频播放| 色五月在线观看| 久久免费成人| 欧美一级婬片A片免费软件| 黄色一级大片在线免费看产| av一区二区三区| 激情五月婷婷丁香| 青草在线视频| 免费亲子乱婬一级A片| 日韩免费视频一区| 人人做人人爽| 欧美性受XXXX爽XYX熟99 | 无码中文AV| 成人手机看片| 日韩福利在线| 99re66| 怡春院熟女精品AV| 亚洲日韩中字| 六月激情丁香| 91乱伦| 九九99热| 日韩蜜桃视频| 在线无码免费| 国产在线毛片| 自拍偷拍1| 中文字字幕在线中文乱码电影| 在线国产91| 欧美黄色a片| 人妻视频网| 一级a看片在线观看| 很色很黄的A片一| 另类图片亚洲色图| 色亭亭影院| 91成人免费电影片| 久久国产精品网站| 久久成人无码| 西西444WWW无码视频软件| 狠狠狠狠狠狠| 高清亚洲| 国产乱伦视屏| 色天堂在线观看| 美日韩免费视频| 影音先锋91| 伊人毛片| 欧美成人超碰| 大肉大捧一进一出免费阅读| 青青操在线视频| 亚洲AV无码成人| 少妇BBB| 强伦轩人妻一区二区三区最新版本更新内容 | 北条麻妃精品| 日韩激情一区二区| 国产精品天天AVJ精麻传媒| 丁香五月影院| 黄色一级片免费| 国产一级精品视频| 人妻视频网| 国产愉拍91九色国产愉拍| 熟女一区二区三区| 亚洲va国产va天堂va久久| 精品成人久久| 亚洲中文字幕免费观看视频| 日本无码一区二区| 第四色激情网| 四虎看片| 欧美激情性爱网站| 免费看黄色片| 日本综合视频| 福利在线看| 韩国高清无码60.70.80| 韩国无码一区二区三区| 亚洲精品成人一二三区| 日韩精品成人| 无码影音| 亚洲免费天堂| 日韩免费Av| 欧美成人无码片免费看A片秀色| 午夜精品视频在线观看| 人妻18无码人伦一区二区三区精品| 吴梦梦《女教师时间暂停》 | 无码在线不卡| 久久久久久久9999| 久艹AV| 亚洲日韩视频在线观看| 国产精品无码ThePorn| 北京熟妇搡BBBB搡BBBB电影| 黄色片免费视频网站| 五月综合激情| va在线| 精品成人在线观看| 粉嫩一区二区三区四区| 中文字幕专区| 中文字幕Av在线| 天堂网婷婷| 国产小毛片| 俺去也| 中文字幕一区二区久久人妻| 亚洲免费观看高清完整版在va线观看 | 丝袜乱伦| 狠狠操电影| 9久精品| 欧美成人视频电影无码高清| 人人澡人人看| 蜜桃Av噜噜一区二区三| 91乱| 51午夜福利| 丁香五月婷婷五月| 免费看的毛片| 亚洲精品中文字幕成人片| 黄色成人大片| 中字一区人妻水多多| 亚欧毛片| 五月深爱| 大香蕉午夜视频| 日欧视频| 抠骚逼| 69av在线播放| 欧美在线视频免费观看| 欧美人人爱| 激情人妻网站| 久久精品片| 另类老妇性BBwBBw| 日日干天天| 黄色视频免费播放| 中文字幕巨肉乱码中文乱码| 亚洲人成高清| 亚洲性精| 天天艹逼| 18毛片| 可以在线观看的AV| 成人在线无码视频| 国产精品无码久久久久成人app | 欧美一级夜夜爽| 国产一级a毛一级a| 久久久久久久亚洲| 91超碰久久在线| 国产成人在线视频免费| 欧美三级性爱视频| 欧美性久久久久| 蜜臀久久99精品久久久晴天影视| 三级久久久| 免费人成网站| 男人天堂视频网站| 能看的操逼视频| 国产亚洲99久久精品| 亚洲激情视频| 黑人操逼视频| 在线免费观看黄色电影| 欧美激情爱爱| 成人毛片AV无码| 中文字幕人妻丝袜二区电影| 天天干在线观看视频| 一本大道香蕉av久久精东影业| 国产激情网站| 婷婷五月情| 国产三级AV在线| 3d动漫精品一区二区三区在线观看 | a片在线观看免费| 亚洲素人无码| 午夜亚洲AV永久无码精品蜜芽| 欧美在线播放| 日韩人妻无码一区二区| 狠狠色丁香| 熟妇女人妻丰满少妇中文字幕 | 亚洲AV无码乱码| 欧美日本在线| 青青草原在线| 风流少妇一区二区三区91| 成人免费黄色片| 国产乱码精品一品二品| 国产女人高潮的AV毛片| 四虎激情影院| 欧美成人视频大全| 黄色一级网站| 蜜桃av秘无码一区二区三区| 免费一级黄| 午夜成人无码| 亚洲调教| 影音先锋女人av噜噜色| 草逼视频网站| 日韩欧美大片在线观看| h在线网站| 日韩影音| 成人黄色视频网站| 自拍超碰| 人人草人人草| AV一级片| 亚洲无码精品在线观看| 天天日天天撸| 一级二级三级无码| 精品乱子伦一区二区三区在线播放| 91欧美性爱| 国产精品999999| 亚洲砖区免费| 亚洲网站在线免费观看| A级黄视频| 婷婷激情丁香五月天| 无码av无码AV| 精品九九| 日韩一级片在线观看| 青青国产视频| 91丨九色丨熟女老版| 黄页网站免费在线观看| 日韩无码三级| 久久久久久穴| 国产毛片在线视频| 欧美一级视频在线观看| 特黄特色大片BBBB| 色婷婷久综合久久一本国产AV| 日韩不卡一区二区三区| 国产精品一| 1024手机在线视频| 人人插人人澡| 操美女一区二区| 51XX嘿嘿午夜| 91亚洲精品久久久久蜜桃| 在线一区| 日韩在线观看免费| 欧美黄片免费| 午夜AV在线| 无码一区在线观看| www.高清无码| 欧洲一级片| 日韩三级在线| 国产色AV| 豆花成人视频| 99热欧美| 久操国产| 中文国产| 国产午夜视频在线观看| 国产精品无码无套在线| 日本免费一级片| 苍井空无码| 狼人久久| 嫩BBB槡BBBB槡BBB| 人人草人人干| 91亚洲国产| 欧美亚洲天堂| 亚洲乱伦| 亚洲性爱专区| 狠狠爱av| 啪视频网站国产馆| 日韩无码精品AV| 毛片天堂| 成人在线看片| 久热中文在线观看精品视频| 亚洲色香蕉| 欧美成人综合一区| 成人网站中文字幕| 日韩综合区| 搡BBB搡BBBB搡BBBB'| 蜜臀久久精品久久久久| 久久综合17p| 国产在线视频网站| 国产操逼小视频| 日本乱伦网| 亚洲日本中文| 国产精品秘久久久久久1-~/\v7-/| 99视频这里有精品| 中文三区| 无码人妻精品一区二区三千菊电影| 天天天天天天操| 99色综合| 久热无码| 亚洲日韩一区二区| 亚洲群交| 国产欧美综合视频一区二区在线| 天堂网视频| 人妻av一区二区三区| 欧美日韩一区二区三区四区五区六区 | 日韩国产欧美精品一区| 日本A片一级| 大香蕉第一页| AV777777| 天堂a在线8| 欧美日韩在线视频免费| 乱视频| 蜜臀精品一区二区三区| 人人看人人草| 特黄aaaaaaaa真人毛片| 日韩免费高清无码| 91成人影片| 在线免费观看黄片| 尤物一区二区| 日韩无码123区| 国产女人18水真多18精品| 国产又爽又黄免费观看| 色欲AV网站| 欧美成人福利| 久草香蕉视频| 在线你懂| 97超碰人人| 日韩人妻电影| 人人澡人人爽欧一区| 探花熟女| 国产一级婬乱片免费| 永久m3u8在线观看| 欧美精品成人免费| 蜜芽AV在线| 老鸭窝在线观看视频| 爱爱无码| 91视频在线看| 丰满人妻一区二区三区视频在线不卡 | 人人色人人操人人干| 婷婷五月影院| 色婷婷狠狠| 日韩无码国产精品| 丰臀肥逼高清视频电影播放| 又粗又硬又爽18级A片| 成人激情久久| 精品国产区一区二| 黄色电影天堂| 人人草人人操| 欧美在线黄色| 亚洲在线免费观看| 久草视频在线免费| 精品无码不卡| 国产麻豆精品成人免费视频| 日本熟妇高潮BBwBBwBBw| 午夜成人小电影| 欧一美一婬一伦一区二区三区自慰 | 超碰97久久| 伊人大香蕉综合| 91大神在线免费看| 中字av| 久久久久久久久黄色| 婷婷激情视频| 2025av天堂网| 中文av字幕| 亚洲不卡视频| 青青草综合| 国产一区二区不卡视频| 婷婷午夜精品久久久久久性色| 日韩乱伦AV| 亚洲一区二区av| 国产精品123| 小早川怜子精品一区二区| 男人的天堂一区| 12—13女人毛片毛片| 日韩美女操逼| 黄色毛片在线观看| 激情淫荡少妇| 在线91网站| 日本婷婷| 黄色电影中文字幕| 逼网站| 国产91在线视频| 啪啪啪av| 免费黄色av网址| 围内精品久久久久久久久久‘变脸| A级片在线观看| 8050网午夜| 欧美日韩在线观看一区| 99re视频在线播放| www.91AV| 在线观看视频黄| yw在线观看| A级视频网| 午夜ww| 久久久久精| 日韩欧美色图| 日韩AV在线直播| 色噜噜狠狠一区二区三区| 国产三级视频在线| 亚洲高清无码在线免费观看| 日韩精品人妻中文字幕蜜乳| 国产精品HongKong麻豆| 欧美日韩在线视频免费播放| 青青草成人在线观看| 亚洲日韩视频在线| 五月婷婷丁香五月| 免费一级欧美片在线观看| 伊人精品| 在线无码不卡| 亚洲成人在线免费观看| 好吊视频一区二区三区红桃视频you| 四虎成人精品永久免费AV九九 | 久久久久久久久免费看无码| 日本在线免费观看| 日韩精品久| h视频在线观看网站| 亚洲无码观看视频| 久热在线| 欧美成人不卡| 熟女熟妇人妻一区二区三区| 理论片91| 乱伦A片| 成人AV在线一区二区| 国产成人亚洲精品| 日韩亚洲欧美在线观看| 91无码在线观看| 丁香五月亭亭| 激情五月俺也去| 国产91探花秘入口| 大香蕉777| 一级A片久久久免费直播间| 久久精品观看| 亚洲AV无码免费| 丁香五月婷婷五月| 黄色视频免费| 五月天色色网站| 先锋影音av在线| 午夜福利影院在线| 韩国无码视频在线观看| 最新三级网站| 综合一区二区| 黄片视频在线免费播放| 国产综合区| 亚洲无码AV一区二区三区| 国产精品123区| 国产性播放| 大香蕉在线75| 男人的天堂视频| 久久久18禁一区二区三区精品| 国产AⅤ无码一区二区| 欧洲亚洲免费视频| 国产精品久久久久永久免费看| 亚洲综合五月天| 日本AA片视频| 一二三四在线视频| 老湿机91| 青青草视频免费| 成人做爰69片免费观看| 啪啪啪网站| 国产区在线视频| 99这里有精品| 国产a区| 亚洲AV国产| AV大全在线观看| 免费亚洲视频| 伊人666| 国产乱子伦-区二区三区四区| 国产免费无码一区二区| 日韩无码黄色电影| 亚洲av网址| 免费在线观看黄色| 日韩老熟妇| 亚洲.无码.制服.日韩.中文字幕| 久久午夜福利| 99成人精品| 久热免费| 91亚洲电影| 欧美国产日韩视频| 人人香蕉| 日本精品人妻无码77777| 黄片WWW| 国产成人无码AⅤ片免费播放| 蜜桃免费视频| 全部在线A片免费播放| 99er在线视频| 91久久久久| 91欧美精品成人AAA片| 任我操在线视频| 国产香蕉视频| 日本免费黄色小视频| 无码一卡| 粉嫩一区|