1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        【工程化】刨根問(wèn)底,揭開(kāi) Vue 中 Scope CSS 實(shí)現(xiàn)的幕后(原理)

        共 12198字,需瀏覽 25分鐘

         ·

        2021-03-25 14:29

        前言

        我想大家應(yīng)該都對(duì) Vue 的 Scope CSS 耳熟能詳了,但是說(shuō)起 Vue 的 Scope CSS 實(shí)現(xiàn)的原理,很多人應(yīng)該會(huì)說(shuō)不就是給 HTML、CSS 添加屬性嗎 ????

        確實(shí)是這樣的,不過(guò)這只是最終 Scope CSS 呈現(xiàn)的結(jié)果。而這個(gè)過(guò)程又是如何實(shí)現(xiàn)的?我想能回答上一二的同學(xué)應(yīng)該不多。

        那么,回到今天本文,我將會(huì)圍繞以下 3 點(diǎn),和大家一起從 Vue 的 Scope CSS 的最終呈現(xiàn)結(jié)果出發(fā),深入淺出一番其實(shí)現(xiàn)的底層原理:

        • 什么是 Scope CSS
        • vue-loader 處理組件(.vue 文件)
        • Patch 階段應(yīng)用 ScopeId 生成 HTML 的屬性

        1 什么是 Scope CSS

        Scope CSS 即作用域 CSS,組件化所密不可分的一部分。Scope CSS 使得我們可以在各組件中定義的 CSS 不產(chǎn)生污染。例如,我們?cè)?Vue 中定義一個(gè)組件:

        <!-- App.vue -->
        <template>
          <div class="box">scoped css</div>
        </template>
        <script>
          export default {};
        </script>
        <style scoped>
          .box {
            width200px;
            height200px;
            background#aff;
          }
        </style>

        通常情況下,在開(kāi)發(fā)環(huán)境我們的組件會(huì)先經(jīng)過(guò) vue-loader[1] 的處理,然后結(jié)合運(yùn)行時(shí)的框架代碼渲染到頁(yè)面上。相應(yīng)地,它們對(duì)應(yīng)的 HTML 和 CSS 分別會(huì)是這樣:

        HTML 部分:

        <div data-v-992092a6>scoped css</div>

        CSS 部分:

        .box[data-v-992092a6] {
          width200px;
          height200px;
          background#aff;
        }

        可以看到 Scope CSS 的本質(zhì)是基于 HTML 和 CSS 選擇器的屬性,通過(guò)分別給 HTML 標(biāo)簽和 CSS 選擇器添加 data-v-xxxx 屬性的方式實(shí)現(xiàn)。

        2 vue-loader 處理組件(.vue 文件)

        前面,我們也提及了在開(kāi)發(fā)環(huán)境下一個(gè)組件(.vue 文件)會(huì)先由 vue-loader 來(lái)處理。那么,針對(duì) Scope CSS 而言,vue-loader 會(huì)做這 3 件事:

        • 解析組件,提取出 template、script、style 對(duì)應(yīng)的代碼塊
        • 構(gòu)造并導(dǎo)出 export 組件實(shí)例,在組件實(shí)例的選項(xiàng)上綁定 ScopId
        • 對(duì) style 的 CSS 代碼進(jìn)行編譯轉(zhuǎn)化,應(yīng)用 ScopId 生成選擇器的屬性

        注意,這里講的只是 vue-loader 對(duì) .vue 文件的處理部分,不涉及 HMR、配合 Devtool 的邏輯,有興趣的同學(xué)可以自行了解~

        然而,之所以 vue-loader 有這么多的能力,主要是因?yàn)?vue-loader 的底層使用了 Vue 官方提供的包(package) @vue/component-compiler-utils[2],其提供了解析組件(.vue 文件)、編譯模版 template、編譯 style等 3 種能力。

        那么,下面我們就先來(lái)看一下 vue-loader 是如何使用 @vue/component-compiler-utils 來(lái)解析組件提取 templatescriptstyle 的。

        2.1 提取 template、script、style

        vue-loader 提取 template、script、style 的過(guò)程主要是使用了 @vue/component-compiler-utilsparse 方法,這個(gè)過(guò)程對(duì)應(yīng)的代碼(偽代碼)會(huì)是這樣:

        // vue-loader/lib/index.js
        const { parse } = require("@vue/component-compiler-utils");

        module.exports = function (source{
          const loaderContext = this;
          const { sourceMap, rootContext, resourcePath } = loaderContext;
          const sourceRoot = path.dirname(path.relative(context, resourcePath));
          const descriptor = parse({
            source,
            compilerrequire("vue-template-compiler"),
            filename,
            sourceRoot,
            needMap: sourceMap,
          });
        };

        我們來(lái)逐點(diǎn)分析一下這段代碼,首先,會(huì)獲取當(dāng)前上下文 loaderContext,它會(huì)包含 webpack 打包過(guò)程核心對(duì)象 compiler、compilation 等。

        其次,再構(gòu)建文件資源入口 sourceRoot,一般情況下它指的是 src 文件目錄,它主要用于構(gòu)建 source-map 使用。

        最后,則會(huì)使用 @vue/component-compiler-utils 提供的 parse 方法來(lái)解析 source(組件代碼)。這里,我們來(lái)看一下 parse 方法的幾個(gè)參數(shù):

        • soruce 源代碼塊,這里是組件對(duì)應(yīng)的代碼,即包含了 template、stylescript
        • compiler 編譯核心對(duì)象,它是一個(gè) CommonJS 模塊(vue-template-compiler[3]),parse 方法內(nèi)部會(huì)使用它提供的 parseComponent 方法來(lái)解析組件
        • filename 當(dāng)前組件的文件名,例如 App.vue
        • sourceRoot 文件資源入口,用于構(gòu)建 source-map 使用
        • needMap 是否需要 source-map,parse 方法內(nèi)部會(huì)根據(jù) needMap 的值(truefalse,默認(rèn)為 true)來(lái)判斷是否生成 scriptstyle 對(duì)應(yīng)的 source-map

        parse 方法的執(zhí)行則會(huì)返回一個(gè)對(duì)象給 desciptor,它會(huì)包含 templatestylescript 分別對(duì)應(yīng)的代碼塊。

        那么,可以看到的是 vue-loader 解析組件的過(guò)程,幾乎外包給了 Vue 提供的工具包(package)。并且,我想這個(gè)時(shí)候肯定會(huì)有同學(xué)問(wèn):這些和 Vue 的 Scope CSS 有幾毛錢(qián)關(guān)系 ????

        有很大的關(guān)系!因?yàn)?Vue 的 Scope CSS 可不是無(wú)米之炊,它實(shí)現(xiàn)的前提是組件被解析了,然后再分別處理 templatestyle 部分的代碼!

        那么,顯然到這里我們已經(jīng)完成了對(duì)組件的解析。接著,則需要構(gòu)造和導(dǎo)出組件實(shí)例~

        2.2 構(gòu)造和導(dǎo)出組件實(shí)例

        vue-loader 在解析完組件后,會(huì)分別處理并生成 templatescript、style 的導(dǎo)入 import 語(yǔ)句,再調(diào)用 normalizer 方法正?;╪ormalizer)組件,最后將它們拼接成代碼字符串:

        let templateImport = `var render, staticRenderFns`;
        if (descriptor.template) {
          // 構(gòu)造 template 的 import 語(yǔ)句
        }
        let scriptImport = `var script = {}`;
        if (descriptor.script) {
          // 構(gòu)造 script 的 import 語(yǔ)句
        }
        let stylesCode = ``;
        if (descriptor.styles.length) {
          // 構(gòu)造 style 的 import 語(yǔ)句
        }
        let code =
          `
        ${templateImport}
        ${scriptImport}
        ${stylesCode}

        import normalizer from ${stringifyRequest(`!${componentNormalizerPath}`)}
        var component = normalizer(
          script,
          render,
          staticRenderFns,
          ${hasFunctional ? `true` : `false`},
          ${/injectStyles/.test(stylesCode) ? `injectStyles` : `null`},
          ${hasScoped ? JSON.stringify(id) : `null`},
          ${isServer ? JSON.stringify(hash(request)) : `null`}
          ${isShadow ? `,true` : ``}
        )
          `
        .trim() + `\n`;

        其中,templateImport、scriptImport、stylesCode 等構(gòu)造好的 templatescript、style 部分的導(dǎo)入 import 語(yǔ)句看起來(lái)會(huì)是這樣:

        import {
          render,
          staticRenderFns,
        from "./App.vue?vue&type=template&id=7ba5bd90&scoped=true&";
        import script from "./App.vue?vue&type=script&lang=js&";
        // 兼容命名方式的導(dǎo)出
        export * from "./App.vue?vue&type=script&lang=js&";
        import style0 from "./App.vue?vue&type=style&index=0&id=7ba5bd90&scoped=true&lang=css&";

        不知道同學(xué)們注意 ?? 到?jīng)],templatestyle 的導(dǎo)入 import 語(yǔ)句都有這么一個(gè)共同的部分 id=7ba5bd90&scoped=true,這表示此時(shí)組件的 templatestyle 是需要 Scope CSS 的,并且 scopeId7ba5bd90。

        當(dāng)然,這僅僅是告知后續(xù)的 templatestyle 編譯時(shí)需要注意生成 Scope CSS,也是實(shí)現(xiàn) Scope CSS 的第一步!那么,接著則會(huì)調(diào)用 normalizer 方法來(lái)對(duì)該組件進(jìn)行正常化(Normalizer)處理:

        import normalizer from "!../node_modules/vue-loader/lib/runtime/componentNormalizer.js";
        var component = normalizer(
          script,
          render,
          staticRenderFns,
          false,
          null,
          "7ba5bd90",
          null
        );
        export default component.exports;

        注意,normalizer 是重命名了原方法 normalizeComponent,以下統(tǒng)稱 normalizeComponent~

        我想同學(xué)們應(yīng)該都注意到了,此時(shí) scopeId 會(huì)作為參數(shù)傳給 normalizeComponent 方法,而傳給 normalizeComponent 的目的則是為了在組件實(shí)例的 options綁定 scopeId。那么,我們來(lái)看一下 normalizeComponent 方法(偽代碼):

        function normalizeComponent (
          scriptExports,
          render,
          staticRenderFns,
          functionalTemplate,
          injectStyles,
          scopeId,
          moduleIdentifier, /* server only */
          shadowMode /* vue-cli only */
        {
          ...
          var options = typeof scriptExports === 'function'
            ? scriptExports.options
            : scriptExports
          // scopedId
          if (scopeId) {
            options._scopeId = 'data-v-' + scopeId
          }
          ...
        }

        可以看到,這里的 options._scopeId 會(huì)等于 data-v-7ba5bd90,而它的作用主要是用于在 patch 的時(shí)候,為當(dāng)前組件的 HTML 標(biāo)簽添加名為 data-v-7ba5bd90 的屬性。因此,這也是 template 為什么會(huì)形成帶有 scopeId 的真正所在!

        2.3 編譯樣式 Style,應(yīng)用 ScopId 生成選擇器的屬性

        在構(gòu)造完 Style 對(duì)應(yīng)的導(dǎo)入語(yǔ)句后,由于此時(shí) import 語(yǔ)句中的 query 包含 vue,則會(huì)被 vue-loader 內(nèi)部的 Pitching Loader 處理。而 Pitching Loader 則會(huì)重寫(xiě) import 語(yǔ)句,拼接上內(nèi)聯(lián)(inline)的 Loader,這看起來(lái)會(huì)是這樣:

        export * from '
        "-!../node_modules/vue-style-loader/index.js??ref--6-oneOf-1-0
        !../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1
        !../node_modules/vue-loader/lib/loaders/stylePostLoader.js
        !../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2
        !../node_modules/cache-loader/dist/cjs.js??ref--0-0
        !../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&id=7ba5bd90&scoped=true&lang=css&"
        '

        然后,webpack 會(huì)解析出模塊所需要的 Loader,顯然這里會(huì)解析出 6 個(gè) Loader:

        [
          { loader"vue-style-loader"options"?ref--6-oneOf-1-0" },
          { loader"css-loader"options"?ref--6-oneOf-1-1" },
          { loader"stylePostLoader"optionsundefined },
          { loader"postcss-loader"options"?ref--6-oneOf-1-2" },
          { loader"cache-loader"options"?ref--0-0" },
          { loader"vue-loader"options"?vue-loader-options" }
        ]

        那么,此時(shí) webpack 則會(huì)執(zhí)行這 6 個(gè) Loader(當(dāng)然還有解析模塊本身)。并且,這里會(huì)忽略 webpack.config.js 中符合規(guī)則的 Normal Loader(vue-style-loader 還會(huì)忽略前置 Loader)。

        不了解內(nèi)聯(lián) Loader 的同學(xué),可以看一下這篇文章【webpack進(jìn)階】你真的掌握了loader么?- loader十問(wèn)[4]

        而對(duì)于 Scope CSS 而言,密切相關(guān)的就是 stylePostLoader。下面,我們來(lái)看一下 stylePostLoader 的定義:

        const { compileStyle } = require("@vue/component-compiler-utils");
        module.exports = function (source, inMap{
          const query = qs.parse(this.resourceQuery.slice(1));
          const { code, map, errors } = compileStyle({
            source,
            filenamethis.resourcePath,
            id`data-v-${query.id}`,
            map: inMap,
            scoped: !!query.scoped,
            trimtrue,
          });

          if (errors.length) {
            this.callback(errors[0]);
          } else {
            this.callback(null, code, map);
          }
        };

        從 stylePostLoader 的定義中,我們知道它是使用了 @vue/component-compiler-utils 提供的 compileStyle 方法來(lái)完成對(duì)組件 style 的編譯。并且,此時(shí)會(huì)傳入?yún)?shù) iddata-v-${query.id},即 data-v-7ba5bd90,而這也是 style 中聲明的選擇器的屬性為 scopeId 的關(guān)鍵點(diǎn)

        而在 compileStyle 函數(shù)內(nèi)部,則是使用的我們所熟知 postcss[5] 來(lái)完成對(duì) style 代碼的編譯和構(gòu)造選擇器的 scopeId 屬性。至于如何使用 postcss 完成這個(gè)過(guò)程,這里就不做過(guò)多介紹,有興趣的同學(xué)自行了解哈~

        3 Patch 階段應(yīng)用 ScopeId 生成 HTML 的屬性

        不知道同學(xué)們是否還記得在 2.2 構(gòu)造并導(dǎo)出組件實(shí)例的時(shí)候,我們講了在組件實(shí)例的 options 上綁定 _scopeId 是實(shí)現(xiàn) template 的 Scope 的關(guān)鍵點(diǎn)!但是,當(dāng)時(shí)我們并沒(méi)有介紹這個(gè) _scopeId 到底是如何應(yīng)用到 template 上的元素的 ???

        如果,你想在 vue-loader 或者 @vue/component-compiler-utils 的代碼中找到這個(gè)答案,我可以和你說(shuō)找一萬(wàn)年都找不到! 因?yàn)?,真正?yīng)用 _scopeId 的過(guò)程是發(fā)生在 Vue 運(yùn)行時(shí)的框架代碼中(沒(méi)想到吧 ??)。

        了解過(guò) Vue 模版編譯過(guò)程的同學(xué),我想應(yīng)該都知道 template 會(huì)被編譯成 render 函數(shù),然后會(huì)根據(jù) render 函數(shù)創(chuàng)建對(duì)應(yīng)的 VNode,最后再根據(jù) VNode 渲染成真實(shí)的 DOM 在頁(yè)面上:

        而 VNode 到真實(shí) DOM 這個(gè)過(guò)程是由 patch 方法完成的。假設(shè),此時(shí)我們是第一次渲染 DOM,這在 patch 方法中會(huì)命中 isUndef(oldVnode)true 的邏輯:

        function patch (oldVnode, vnode, hydrating, removeOnly{
          if (isUndef(oldVnode)) {
            // empty mount (likely as component), create new root element
            isInitialPatch = true
            createElm(vnode, insertedVnodeQueue)
          } 
        }

        因?yàn)榈谝淮武秩?DOM,所以壓根不存在什么 oldVnode ??

        可以看到,此時(shí)會(huì)執(zhí)行 createElm 方法。而在 createElm 方法中則會(huì)創(chuàng)建 VNode 對(duì)應(yīng)的真實(shí) DOM,并且它還做了一件很重要的事,調(diào)用 setScope 方法應(yīng)用 _scopeId 在 DOM 上生成 data-v-xxx 的屬性!對(duì)應(yīng)的代碼(偽代碼):

        // packages/src/core/vdom/patch.js
        function createElm(
          vnode,
          insertedVnodeQueue,
          parentElm,
          refElm,
          nested,
          ownerArray,
          index
        {
          ...
          setScope(vnode);
          ...
        }

        setScope 方法中則會(huì)使用組件實(shí)例的 options._scopeId 作為屬性來(lái)添加到 DOM 上,從而生成了 template 中的 HTML 標(biāo)簽上名為 data-v-xxx 的屬性。并且,這個(gè)過(guò)程會(huì)由 Vue 封裝好的工具函數(shù) nodeOps.setStyleScope 完成,它的本質(zhì)是調(diào)用 DOM 對(duì)象的 setAttribute 方法:

        // src/platforms/web/runtime/node-ops.js
        export function setStyleScope (node: Element, scopeId: string{
          node.setAttribute(scopeId, '')
        }

        結(jié)語(yǔ)

        如果,有在網(wǎng)上查找過(guò)關(guān)于 vue-loader 和 Scope CSS 的文章的同學(xué)會(huì)發(fā)現(xiàn),很多文章都是說(shuō)在 @vue/component-compiler-utilscompilerTemplate 方法中應(yīng)用 scopeId 生成了 template 中 HTML 標(biāo)簽的屬性。但是,通過(guò)閱讀本文,我們會(huì)發(fā)現(xiàn)這兩者壓根沒(méi)有任何關(guān)系(SSR 的情況除外)!

        并且,我想同學(xué)們也注意到了一點(diǎn),本文中提及的 Vue 運(yùn)行時(shí)框架的代碼是 Vue 2.x 版本的(不是 Vue3)。所以,有興趣的同學(xué)可以借助本文提供的路線推敲一下 Vue3 中 Scope CSS 的過(guò)程,相信你會(huì)收獲滿滿 ??。最后,如果本文中存在表達(dá)不當(dāng)或錯(cuò)誤的地方,歡迎各位同學(xué)提 Issue~

        點(diǎn)贊 ??、在看 ??

        通過(guò)閱讀本篇文章,如果有收獲的話,可以點(diǎn)個(gè)贊在看,這將會(huì)成為我持續(xù)分享的動(dòng)力,感謝~

        參考資料

        [1]

        vue-loader: https://github.com/vuejs/vue-loader

        [2]

        @vue/component-compiler-utils: https://github.com/vuejs/component-compiler-utils

        [3]

        vue-template-compiler: https://github.com/vuejs/vue/tree/dev/packages/vue-template-compiler#readme

        [4]

        【webpack進(jìn)階】你真的掌握了loader么?- loader十問(wèn): https://juejin.cn/post/6844903693070909447

        [5]

        postcss: https://postcss.org/api/


        歡迎關(guān)注「前端雜貨鋪」,一個(gè)有溫度且致力于前端分享的雜貨鋪

        關(guān)注回復(fù)「加群」,可加入雜貨鋪一起交流學(xué)習(xí)成長(zhǎng)


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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            69av在线观看视频| 三级片自拍| 精品成人A片久久久久久不卡三区 免费看成人A片无码照片88hⅤ | 七十路の高齡熟妇无码| 蜜桃视频网址| 日韩在线91| 一本久久A精品一合区久久久| 蜜臀色欲AV无码人妻| 翔田千里无码在线| 免费成人三级片| 黄色AV电影| 国产又大又粗又爽| 亚洲欧美成人在线| 亚洲v天堂| 91av免费| 91超碰人人| 国产精品一| 人人操人人超碰| 99热在线免费观看| 男女无码| 一区二区三区无码免费| 操逼操逼视频| 日韩欧美视频在线播放| 亚洲免费视频网站| 俺也去电影| 爱福利视频| 在线无码免费观看| 日韩成人在线观看视频| 人人爱天天做| 色噜噜一区二区三区| 婷婷五月综合激情| 四川少妇搡BBw搡BBBB搡| 一级A片免费黄色视频| 夜夜操天天干| 91探花视频| 成人电影无码| 乱伦AV片| 成人精品秘久久久按摩下载| 成人黄色在线观看视频| 国产一级精品视频| 91老熟女| 一级AV| 激情图区| 狠狠草狠狠干| 黄色小视频在线免费看| 黄色成人网址| 亚洲有码中文字幕| 国产熟女在线| 特爽特黄特级特色视频| 内射学生妹J亅| 国内成人精品网站| 日韩高清在线观看| 无码免费观看视频| 波多野结衣在线无码| 91网站免费在线观看| 无码不卡一区| 可以免费看的黄色视频| 内射在线播放| 欧美亚洲成人电影| 热久久亚洲中文字幕| 黄色视频网站在线看| 懂色成人av影院| 高清无码视频18| 中文字幕高清无码免费视频| 中文字幕第69页| 国产一区二区久久| 少妇bbw搡bbbb搡bbbb| 苍井空中文字幕在线观看| 日韩A毛片| 水果派AV解说| 婷婷综合亚洲| 精品国产精品三级精品AV网址 | 日本高潮视频| 99精品偷自拍| 一级欧美| 亚洲成人黄色视频| 拍拍视频| 久热激情| 美少妇AV| 久久成人导航| 亚洲天堂电影网| 一级女婬片A片AAAA片| 国产免费久久久| 东京热这里只有精品| 欧美性爱XXXX| 特级西西444www精品视频| 国产色婷婷精品综合在线播放| 狠狠色婷婷7777| 婷婷五月在线观看| 亚洲成人性爱视频| 伊人日日| 成人做爰黄A片免费看直播室动漫 中文字幕一区二区三区四虎在线 欧美熟妇精品一级A片视色 | 精品久久91| 亚洲制服在线观看| 久久亚洲一区| 国产一级一片免费播放放a| 久久久91精品国产一区苍井空| 欧美一级无码| 亚洲AV成人精品日韩在线播放| 性99网站| 国产一在线| 九九中文字幕| 成人一级黄片| 午夜骚影| 国产在线第一页| 性爱视频久久| 国产精品日韩欧美| 国产123区| 视频二区| 亚洲日韩AV电影| 国产高清一区| 123好逼网| 亚洲美穴| 亚洲成人毛片| 美女91视频| 国产精品高清网站| 亚洲黄色精品| 亚洲毛片亚洲毛片亚洲毛片| 18久久| 五月天婷婷在线播放视频免费观看 | 大香蕉伊人色| 日韩一区欧美| 怡红院AV| 很很干在线视频| 揉BBB搡BBB搡BBB| 大香蕉99| 人人操人人撸| 一本到免费视频| 熟女人妻一区二区三区免费看| 激情五月天成人| 永久免费无码中文字幕| 中文字幕在线播放第一页| 亚洲一区av| Av高清无码| 国产传媒av| 欧美久久国产精品| 日日夜夜av| 欧美日韩不卡视频| 操美女的逼| 亚洲va国产va天堂va久久| 婷婷五月天色综合| 99久久精品国产一区色| 日老女人逼| 中国操逼视频| 国产91无码精品秘入口新欢| jizzjizz国产| 亚洲色吧| 日本最新免费二区| 超碰自拍99| av操操操| 中文字幕+乱码+中文字幕在线| 成人黄网站免费观看| 日日拍夜夜拍| 亚洲黄色小电影| 亚洲一级黄色电影| 大香蕉一级片| 淫色淫香综合网| 超碰免费99| 加勒比日日综合| 午夜久久久久久久久久久久91| 五月天激情综合| 欧美黄片区| 日本天堂网在线观看| 亚洲成人高清在线| 中文字幕五码| 亚洲精品成人无码AV在线| 亚洲AV网址| 日韩欧美内射| 九九九精品在线| 无套内射在线免费观看| 久久这里都是精品| 男人天堂免费视频| 国产在线色视频| 欧美级毛片高潮| 日韩一区二区视频| 黄片午夜| 丁香五月亚洲| 免费观看的av| 很色很黄的A片一| 一级乱伦网站| 国产精品久久久久久久久久久久久久久久 | 尤物av| 亚洲AVwww| 免费无码| 国产理论片| 日本A片在线免费观看| 欧美黄色片| 中文国产字幕| 日本韩国无码视频| 亲子伦一区二区三区观看方式| 中文字幕第27页| 久久久18禁一区二区三区精品| 欧美青青草| 蜜桃视频在线入口www| 激情丁香| 色色9999| 天天日天天爽| 国产一精品| 91视频首页| 翔田千里无码A片| 亚洲午夜福利在线| 影视先锋成人在线| 亚洲高清免费视频| 高清无码免费观看| 在线激情| 视频在线观看一区| 亚洲第一视频在线观看| 影音先锋人妻限定| 亚洲片在线观看| 一区二区三区久久久久〖网:.〗 | 欧美日韩高清在线| 操B网站| 污视频在线免费| 无码不卡在线播放| 亚洲男人的天堂视频网在线观看+720P| 亚洲视频大全| 日本黄色片视频| 无码成人在线观看| 亚洲AV成人片无码网站| 久草美女| 殴美老妇BBBBBBBBB| 久久免费精品视频| 免费在线黄色电影| 99精品视频在线观看免费| 一区二区水蜜桃| 欧美极品另类| 蜜臀无码在线| 色老板最新地址| 先锋影音资源网站| 51成人网站免费| 日日骚中文字幕| 中国毛片视频| 欧美深夜福利| 先锋成人资源| 久久久久久久久久久久久自慰小片| 麻豆蜜桃91无码| 色五月婷婷激情| 亚欧洲精品在线视频免费观看 | 99久在线精品99re8| 可以在线观看的av| 69成人网| 日韩操逼图| 激情丁香五月婷婷| 黑巨茎大战欧美白妞小说| 国产精品久久久久久久久久王安宇 | 日韩人妻无码一区二区| 四川少妇BBB凸凸凸BBB安慰我| 色婷婷香蕉在线一区二区| 国产操穴视频| 亚洲精品国产精品乱玛不99| 国产在线一二三| 麻酥酥在线视频| 大地中文资源5页的更新内容| 偷拍亚洲天堂| 日本黄色视频免费观看| 一级黄色录相片| 日本一区二区在线视频| 热的无码| 欧美操比视频| 国产精品黄视频| 大香蕉伊人精品| 极品无码| 88AV视频| 中文观看| 偷拍精品视频| 日韩城人免费| 欧美日韩四区| 88在线无码精品秘入口九色| 91亚洲一线产区二线产区| 男人色天堂| 亚洲AV国产| 午夜无码高清| 日韩高清在线| 久久黄色成人视频| 裸体美女视频欧美18| www.久久99| 国产一区免费观看| 91人人人人| 日韩免费高清视频| 中文字幕五月久久婷婷| 国产精品高| 日本激情网站| 水多多成人网站A片| 午夜福利AV在线| 色色五月天婷婷| 国产免费看| 黄色a一级| 日韩超碰在线| 东京热六区| 91九色TS另类国产人妖| 在线免费观看黄| 国产成人a亚洲精品www| 人人cao| 51成人网| 免费成人国产| 草草影院国产第一页| 爱草视频| 最新毛片网站〖网:.〗| 亚洲日韩成人在线| 国产免费无码一区二区| 大香蕉网站视频| 北条麻妃黄色视频| 91av视频在线观看| 精品国精品自拍自在线| 人人草人人操| 日本三级片在线动| 美女超碰| 中文字幕AV无码| 91香蕉在线观看视频在线播放| 免费版成人久久幺| 东北嫖老熟女一区二区视频网站| 欧美黄色操逼| 处破女初破全过免费看| wwwav| 一级黄色片免费观看| 成人国产精品在线看| 奶大丰满一乱一视频一区二区三区在 | 国产激情都市一区二区三区欧美| 波多野结衣天堂| 翔田千里AV在线| 91丨露脸丨熟女精品| 亚洲日韩三级片| 成人AV无码| 高清无码视频在线| 国产夫妻精品| 99性视频| 丝袜一区二区三区| 99国产精品99久久久久久| 欧美MV日韩MV国产网站| 嫩草AV| 吴梦梦一区二区在线观看| 91三级在线观看| 国产高清在线视频| 中文字幕亚洲专区| 无码一区二区三区四| 久久理论电影| 97精品人妻一区二区三区在线| 91老熟女| 夜色88V精品国产亚洲| 黄片免费观看视频| 中国操逼电影| 亚洲AV无码成人精品区| 精品人妻一区二区乱码一区二区| 国产不卡在线观看| 人人摸人人干| 蜜臀久久99精品久久久久久婷婷| 91天天干| 国产老女人农村HD| 国产网站在线| 91麻豆成人精品国产| 手机成人在线视频| 日本一区二区网站| 深爱激情网五月天| 北条麻妃一区二区三区-免费免费高清观看 | 国产婬片一级A片AAA毛片AⅤ | 日产久久视频| 在线观看日本黄| 国产在线小电影| 午夜亚洲视频| 国产高清免费| 午夜操B| 91成人一区| 69视频在线免费观看| 精品亚洲无码视频| 蜜臀激情| 你懂的网站在线观看| 久久久久久精品国产三级| 蜜臀av在线免费观看| 麻豆精品| 国产成人视频免费在线观看| 无码国产精品一区二区免费96| 久久毛片基地| 国产白丝在线观看| 九九九九九九精品视频| 欧美高清性XXXXHDvideosex| 日韩AV资源网| 国产精品爽爽久久久久| 东北女人毛多又黑A片| 在线观看视频黄| 艹逼中文字幕| 成人亚洲AV日韩AV无码| 天天干天天射天天| jk无码| 欧美三级视频在线| 免费亲子乱婬一级A片| A片黄色毛片| 丁香五月色| 狠狠搞狠狠操| 丁香五月婷婷色| 69成人精品| 无码高潮| 无码精品在线观看| 先锋影音在线资源| 在线香蕉| 内射视频网站| 一本无码视频| 高清色色女网站| 欧美亚洲自拍偷拍| 三级国产网站| AV黄色在线观看| 夜夜撸天天日| 国产福利在线观看| 丰满人妻一区二区三区46| 亚洲毛片在线观看| 欧美成人电影在线观看| 天天操天天看| 亚洲午夜av| 日本处女性高潮喷水视频| 黄色在线免费观看网站| 欧美激情DVD| 欧美日韩国内| 成人做爰黄级A片免费看土方 | 人人爽久久涩噜噜噜网站| 国产操女人| 日本天堂在线| 日本一级片中文字幕| 亚洲AV永久无码精品| 男女一区二区三区| 无码人妻一区二区三区| 韩国人妻无码| 人人操人人看人人摸| 视色影院| 日韩成人性爱网站| 中文国产| 成人网站在线看。| 欧美熟妇精品一二三区| 色欲一区二区| 欧美精品| 高清无码视频在线播放| 亚洲精品影视| 欧美色色色| 国产色视频一区二区三区QQ号| 亚洲成人免费在线视频| 农村乱子伦毛片国产乱| 香蕉视频啪啪啪| 欧美日韩国产在线观看| 国内久久婷婷| 三级无码AV| 天天撸天天干| 51妺妺嘿嘿午夜成人| 亚洲无码偷拍| 大香蕉1024| 综合玖玖| 欧美第1页| 国产高清无码福利| 日本东京热视频| 天堂а√在线中文在线新版| 日日综合网| 豆花成人社区,视频| 在线观看内射视频| 丁香婷婷久久久综合精品国产| 中文字幕黄色电影| 日本无码视频在线| 亚洲综合无码| 男人亚洲天堂| 精品国产AV无码一区二区三区 | 色国产在线视频| www天天操| 男女啪啪网| 黄色AV免费观看| 91亚洲视频| 高清无码中文字幕在线观看| 激情五月天色色| 亚洲精品99| 香蕉一区二区| 91人妻人人澡人人爽人人精品一| 国产午夜无码福利视频| 男人的天堂在线播放| 在线亚洲日韩| 五月婷婷视频| 亚洲一区二区在线播放| 91亚色视频| 91在线精品一区二区| 欧美日韩中文字幕在线视频 | 操天天操| 日本一区免费观看| 韩国毛片基地久久| 国产一级a毛一级a做免费高清视频 | 影音av在线| 黄片视频网站| 北条麻妃精品在线| 日韩中文字幕永久| 成人性爱在线观看| 99久久精品国产一区二区成人 | 亚洲中午字幕| 国产综合区| 苍井空无码一区二区三区| 婷婷精品国产a久久综合| 在线99热| 成人视频观看| jizz在线观看视频| 欧美一级棒| 不卡无码中文字幕| 蜜桃视频在线观看18| 国产一级A片久久久免费看快餐 | 丝瓜av| 国产综合无码| 中日美朝美女一级片免费看| 亚洲aa| aaa成人| 久久青草影院| 884aa四虎影成人精品一区| 亚洲成人AⅤ| 久久久久亚洲AV无码专区| 欧美综合亚洲图片综合区| 少妇搡BBBB搡BBB搡视频一级| 逼特逼在线视频| 欧美高清国产| 精品无码视频| 日韩操操操| 91蜜桃视频在线观看| 一级做a视频| 欧美一级操逼| 99人妻在线| 在线播放91灌醉迷J高跟美女| 日本50路熟女| 91在线视频精品| 免费中文字幕av| 人人爱人人干人人操| 日本操逼在线播放| 奇米色色色| 日韩一区二区三| 久草网在线观看| 淫荡少妇美红久久久久久久久久 | 成年人视频在线免费观看| 三级无码在线播放| 亚洲第一香蕉视频| 大香蕉伊人在线观看| 亚洲国产精品成人综合| 吃奶做爱视频| 激情视频免费看| 大香蕉人妻| 日本少妇网站| 182在线视频| 大鸡巴操小逼视频| 国产成人AV| 午夜操逼视频| 欧美成人精品在线观看| 欧美国产在线观看| 男女高清无码| 操逼网站免费看| 黄网免费| 丰滿人妻一区二区三| 色AV网| 人人做人人爱人人做人人乐的意思| www.色悠悠| 一级特黄妇女高潮AA片免费播放| 无码视频一二三区| 老司机狠狠干| 天天撸天天操| 亚洲无码在线免费| 天天操夜夜爱| 国产成人久久777777| 成人国产欧美日韩在线视频| 蜜桃久久99精品久久久酒店| 丰满人妻无码| 视频你懂的| 三级理论网站| 精品一区二区三区毛片| 东京热综合网| 日韩成人A片| 国产aa片| 韩日av| 91麻豆成人精品国产| 免费岛国av大片| 欧美三级网| 2018天天干天天操| 七六十路の高齢熟妇无码| 九色91PORNY国产| AA免费视频| 色欲国产精品欧美在线密| 亚洲精品偷拍| 日逼网站免费观看| 青娱乐91视频| 丰满人妻一区二区三区四区不卡| 成人毛片在线大全免费| 操逼逼一区二区三区| 大香蕉伊在线观看| 亚洲色图一区二区三区| 麻豆精品一区| 西西4444大胆无码视频| 唐嫣一级婬片A片AAA| 国产精品一区网站| 欧美操屄视频| 久久久久久久国产精品| 免费操B视频| 国产丝袜无码| 大香蕉日| 亚洲中文字幕在线无码| 3D动漫精品啪啪一区二区| 欧美性国产| 99久久综合| 久久女人视频| 国产成人精品123区免费视频| 国产精品秘久久久久久| 美女裸身18禁| 亚洲黄色视频在线免费观看| 久久99精品国产.久久久久| 91精品在线播放| 日逼图| 国产精品成人无码a无码| 成人精品一区二区三区中文字幕| 免费版成人久久幺| 91插插插插| 亚洲一级一级黄色| 一级片黄色免费| 吴梦梦《女教师时间暂停》| 国产做受91| 人人操人人撸| 成人毛片在线播放| 中国一级黄色毛片| 亚洲无码人妻视频| 成人A∨| 日本黄色电影在线播放| 蜜桃传媒AV| 丁香婷婷久久久综合精品国产| 婷婷在线视频| 99国产在线观看| 无码久久久| 天天爽天天射| 国产精品欧美一区二区三区苍井空 | 大香蕉99| 在线观看中文字幕av| 无码免费婬AV片在线观看| 337p大胆色噜噜噜噜噜| 欧美一级性爱视频| 一区二区三区四区免费看| 人人爽人人做| 免费日比视频| 亚洲成人高清在线| 台湾无码精品| 爱爱天堂| 中文字幕成人av| 日韩乱轮小说与视频| 国产日韩欧美综合精品在线观看 | 黄色a片在线观看| 波多野结衣vs黑人巨大| 性A免费在线播放| 成人网站在线免费观看| 亚洲精品视频在线| 免费看一区二区三区A片| 久久99久久99久久99国内少妇精品| 91丨熟女丨首页| 操逼视频无码| 日本特级黄A片免费观看| 亚洲黄片免费在线观看| 北条麻妃中文字幕在线观看| 色天使视频| 一级性爽AV毛片| 日韩无码AV一区二区三区| 韩日av| 激情小说在线视频| 人妻18无码人伦一区二区三区精品| 人妻丰满熟妇av无码| 五月天色色图| 艹逼逼视频| 精品成人Av一区二区三区| 中文字幕人成人乱| 丁香花在线高清完整版视频 | 操骚屄视频| 日本成人久久| 日韩欧美精品一区二区| 久久久久久97| 欧美日韩v| 亚洲高清无码视频在线| 五月天婷婷色色| 又大又粗又爽| 在线观看av网站| 亚洲日韩成人在线| 国产毛片毛片毛片毛片毛片| 在线观看视频免费无码免费视频| 麻豆做爱| 一区二区无码精品| 国产精品久久久久久久久久久久久久久 | 婷婷五月丁香五月| 国产高清无码在线| 中文字幕在线免费视频| 爱爱毛片| 久久精品福利视频| 无码人妻一区二区三区| 丰滿老婦BBwBBwBBw| 婷婷色色五月天| 精品视频一区二区三区| 亚洲精品影院| 91视频观看| 激情婷婷 | av777777| 中文字幕在线观看视频免费| 久久精品成人导航| 午夜精品视频在线观看| 黄色片一区二区| 三级无码中文| 国产欧美成人| 蜜桃BBwBBWBBwBBw| 无码高清免费| 都市激情亚洲| 亚洲色图图片| 国产福利小视频| 熟女导航| 国产中文字幕亚洲综合欧美| 亚洲视频中文字母| 一级黄片学生妹| 日韩在线视频不卡| 欧美18禁| 亚洲天堂电影网| 在线观看AV资源| 午夜成人网站在线观看| 天堂在线观看av| 日韩福利网| 波多野结衣视频一区| 久久精品国产精品| 日韩人妻在线视频| 国产三级自拍视频| 江苏妇搡BBBB搡BBBB小说| 亚洲无码性爱| 人妻日韩精品中文字幕| 东京热综合影院| 午夜成人福利在线观看| 亚洲高清视频无码| 欧美射图| 息子交尾一区二区三区| 亚洲A∨无码无在线观看| 成人免费一区| 婷婷国产精品| 欧美亚洲中文字幕| 成人av免费在线观看| 亚洲成人av在线| 黄片www| 蜜臀AV一区二区三区免费看| 影音av在线| 日韩精品人妻| 天堂a在线8| 麻豆91精品91久久久| 久久午夜福利电影| 亚洲日本视频| 日韩人妻无码一区二区| 午夜激情在线观看| 天天干天天摸| 日韩AV毛| 在线不卡无码| 青青草视频偷拍| 日韩爆乳一区二区三区| 亚洲精品无码a片| 在线观看无码高清| 最近中文字幕免费| 日韩A片一级无码免费蜜桃| 人人操人人干97| 日本操屄视频| 国产日韩欧美91| 在线观看www视频| 久操视频在线观看免费| 国产精品三级在线观看| 四虎无码| 国产美女被操| 欧美一区三区视频z| 国产91嫩草乱婬A片2蜜臀| 色综合成人| 欧美浮力影院| 婷婷丁香五月综合| 国产成人精品一区二区三区在线| 久久久三级| 特黄特黄免费看| 草碰在线视频| 在线播放91灌醉迷J高跟美女| 黄色视频免费在线观看网站| 国产三级片精品| 国产最新视频| 国产免费AV片| 伊人久久福利视频| 人妻无码精品久久人妻成人| a天堂在线| 毛片网站免费| 男女做爱视频网站| 婷婷五月天激情小说| 美女三片| 黄色激情av| 婷婷色中文网| 亚洲久久在线| 麻豆国产一区二区三区四区| 亚洲成人性爱| 无码专区在线看v| 91人妻人人人| 亚洲成人AAAAA| www.午夜| 91麻豆国产| 成人在线免费观看国产| 国产人妻人伦精品1国产丝袜| 国产成人综合电影| 伊人大香蕉综合在线| 婷婷久久综| 欧美一级二级三级| 久热这里| 四虎在线免费视频| 91无码人妻一区二区成人AⅤ| 91狠狠综合久久久久久| 黄片视频免费看| 超碰91免费在线观看| 伊人久久无码| 中文字幕欧美视频| 日韩精品成人电影| 欧美日韩群交| 色色射| 日韩在线一区二区三区四区| 91精品久久久久久久久| 日韩精品一区二区三区使用方法 | 国产成人久久777777黄蓉| 日韩一级电影在线| 在线视频内射| 91第一页| 国产精品成人AV片| 佳佳女王footjob超级爽| 国产精品毛片VA一区二区三区| 男人天堂免费视频| 色婷婷在线免费视频| 五月天婷婷丁香| 大香蕉伊人丁香五月| 成人在线无码视频| 亚洲成人在线无码| 爆乳一区二区| 精品国产va久久久久久| 欧美激情久久久| 西西人体44www大胆无码| 亚洲一区AV| 天天操天天操| 精品玖玖| 成人日皮视频| 91免费看| 国产一区二区00000视频| 久久伊人亚洲| 超碰在线视| 日韩一级免费视频| 国产毛片久久久久久国产毛片 | 91精品综合| 精品AV无码一区二区三区| 免费黄色av网址| 黄色av免费观看| 天天干天天日天天干| 日屄视频免费看| 噜噜噜久久久| 日韩欧美高清第一期| 8050午夜| 精品狼友| 国产一区二区三区在线观看免费视频免费视频免费视频 | 影音先锋在线视频观看| 18禁一区| 亚洲黄色电影在线观看| 91网站在线免费观看| ww毛片| 免费的AV| 久久人妻无码| 91看片看婬黄大片Videos| 亚洲日韩欧美视频| 欧美偷拍| 超碰在线观看免费版| 日本中文字幕免费| 国产精品九九| 欧美日韩伊人| 免费无码国产在线55| 久久午夜无码鲁丝片| 91视频美女内射| 成年人视频网| 亚洲欧美国产毛片在线| 人人看人人干| 亚洲综合图色40p| 久久久夜夜夜| 精品三区| 麻酥酥在线视频| 天堂俺去俺来也www久久婷婷| 免费无码在线观看| v天堂在线观看| 山西真实国产乱子伦| 成人性爱AV| 999国产精品视频| www俺来也com| 亚洲第一色网站| 西西444WWW无码视频软件| 北条麻妃JUX-869无码播放| 日韩欧美中文在线| 久久双飞| 翔田千里91| 色444| 一区二区高清无码视频| 成人AV一区二区三区| 亚洲免费三级片| 中文字幕无码精品| 在线播放内射| 五月丁香五月婷婷| 国产精品乱码一区二区三区| 欧美高清无码视频| 伊人午夜| 国产精品视频在线播放| 视频在线观看一区| 99热| 嫩草嫩草69| 人人操人人撸| 色一本| 亚洲一区欧美| 无码-ThePorn| 在线观看中文字幕网站| 免费观看黄色电影|