精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

下一代的模板引擎:lit-html

開發 前端
今天來看看基于這個原生技術,Google 二次封存的框架 lit-html。今天會重點介紹 lit-html 的用法以及優勢。

[[390834]]

前面的文章介紹了 Web Components 的基本用法,今天來看看基于這個原生技術,Google 二次封存的框架 lit-html。

其實早在 Google 提出 Web Components 的時候,就在此基礎上發布了 Polymer 框架。只是這個框架一直雷聲大雨點小,內部似乎也對這個項目不太滿意,然后他們團隊又開發了兩個更加現代化的框架(或者說是庫?):lit-html、lit-element,今天的文章會重點介紹 lit-html 的用法以及優勢。

發展歷程

在講到 lit-html 之前,我們先看看前端通過 JavaScript 操作頁面,經歷過的幾個階段:

發展階段

原生 DOM API

最早通過 DOM API 操作頁面元素,操作步驟較為繁瑣,而且 JS 引擎與瀏覽器 DOM 對象的通信相對耗時,頻繁的 DOM 操作對瀏覽器性能影響較大。

  1. var $box = document.getElementById('box'
  2. var $head = document.createElement('h1'
  3. var $content = document.createElement('div'
  4. $head.innerText = '關注我的公眾號' 
  5. $content.innerText = '打開微信搜索:『自然醒的筆記本』' 
  6. $box.append($head) 
  7. $box.append($content) 

 

jQuery 操作 DOM

jQuery 的出現,讓 DOM 操作更加便捷,內部還做了很多跨瀏覽器的兼容性處理,極大的提升了開發體驗,并且還擁有豐富的插件體系和詳細的文檔。 

  1. var $box = $('#box'
  2.  
  3. var $head = $('<h1/>', { text: '關注我的公眾號' }) 
  4. var $content = $('<div/>', { text: '打開微信搜索:『自然醒的筆記本』' }) 
  5.  
  6. $box.append($head, $content) 

 

雖然提供了便捷的操作,由于其內部有很多兼容性代碼,在性能上就大打折扣了。而且它的鏈式調用,讓開發者寫出的面條式代碼也經常讓人詬病(PS. 個人認為這也不能算缺點,只是有些人看不慣罷了)。

模板操作

『模板引擎』最早是后端 MVC 框架的 View 層,用來拼接生成 HTML 代碼用的。比如,mustache 是一個可以用于多個語言的一套模板引擎。

mustache

后來前端框架也開始搗鼓 MVC 模式,漸漸的前端也開始引入了模板的概念,讓操作頁面元素變得更加順手。下面的案例,是 angluar.js 中通過指令來使用模板:

  1. var app = angular.module("box", []); 
  2.  
  3. app.directive("myMessage"function (){ 
  4.   return { 
  5.     template : '' + 
  6.     '<h1>關注我的公眾號</h1>' + 
  7.     '<div>打開微信搜索:『自然醒的筆記本』</div>' 
  8.   } 
  9. }) 

 

后來的 Vue 更是將模板與虛擬 DOM 進行了結合,更進一步的提升了 Vue 中模板的性能,但是模板也有其缺陷存在。

  • 不管是什么模板引擎,在啟動時,解析模板是需要花時間,這是沒有辦法避免的;
  • 連接模板與 JavaScript 的數據比較麻煩,而且在數據更新時還需進行模板的更新;
  • 各式各樣的模板創造了自己的語法結構,使用不同的模板引擎,就需要重新學習一遍其語法糖,這對開發體驗不是很友好;

JSX

[[390835]]

GitHub - OpenJSX/logo: Logo of JSX-IR

React 在官方文檔中這樣介紹 JSX:

“JSX,是一個 JavaScript 的語法擴展。我們建議在 React 中配合使用 JSX,JSX 可以很好地描述 UI 應該呈現出它應有交互的本質形式。JSX 可能會使人聯想到模板語言,但它具有 JavaScript 的全部功能。

  1. var title = '關注我的公眾號' 
  2. var content = '打開微信搜索:『自然醒的筆記本』' 
  3.  
  4. const element = <div> 
  5.   <h1>{title}</h1> 
  6.   <div>{content}</div> 
  7. </div>; 
  8.  
  9. ReactDOM.render( 
  10.   element, 
  11.   document.getElementById('root'

 

JSX 的出現,給前端的開發模式帶來更大的想象空間,更是引入了函數式編程的思想。

  1. UI = fn(state) 

 但是這也帶來了一個問題,JSX 語法必須經過轉義,將其處理成 React.createElement 的形式,這也提高了 React 的上手難度,很多新手望而卻步。

lit-html 介紹

lit-html 的出現就盡可能的規避了之前模板引擎的問題,通過現代瀏覽器原生的能力來構建模板。

  • ES6 提供的模板字面量;
  • Web Components 提供的<template> 標簽;
  1. // Import lit-html 
  2. import {html, render} from 'lit-html'
  3.  
  4. // Define a template 
  5. const template = (title, content) => html` 
  6.   <h1>${title}</h1> 
  7.   <div>${content}</div> 
  8. `; 
  9.  
  10. // Render the template to the document 
  11. render( 
  12.   template('關注我的公眾號''打開微信搜索:『自然醒的筆記本』'), 
  13.   document.body 
  14. ); 

 

模板語法

由于使用了原生的模板字符,可以無需轉義,直接進行使用,而且和 JSX 一樣也能使用 JavaScript 語法進行遍歷和邏輯控制。

  1. const skillTpl = (title, skills) => html` 
  2.   <h2>${title || '技能列表' }</h2> 
  3.   <ul> 
  4.     ${skills.map(i => html`<li>${i}</li>`)} 
  5.   </ul> 
  6. `; 
  7.  
  8. render( 
  9.   skillTpl('我的技能', ['Vue''React''Angluar']), 
  10.   document.body 
  11. ); 

 

除了這種寫法上的便利,lit-html 內部也提供了Vue 類似的事件綁定方式。

  1. const Input = (defaultValue) => html` 
  2.   name: <input value=${defaultValue} @input=${(evt) => { 
  3.     console.log(evt.target.value) 
  4.   }} /> 
  5. `; 
  6.  
  7. render( 
  8.   Input('input your name'), 
  9.   document.body 
  10. ); 

 

樣式的綁定

除了使用原生模板字符串編寫模板外,lit-html 天生自帶的 CSS-in-JS 的能力。

  1. import {html, render} from 'lit-html'
  2. import {styleMap} from 'lit-html/directives/style-map.js'
  3.  
  4. const skillTpl = (title, skills, highlight) => { 
  5.  const styles = { 
  6.    backgroundColor: highlight ? 'yellow' : ''
  7.  }; 
  8.  return html` 
  9.    <h2>${title || '技能列表' }</h2> 
  10.    <ul style=${styleMap(styles)}> 
  11.      ${skills.map(i => html`<li>${i}</li>`)} 
  12.    </ul> 
  13.  ` 
  14. }; 
  15.  
  16. render( 
  17.  skillTpl('我的技能', ['Vue''React''Angluar'], true), 
  18.  document.body 
  19. ); 

 

渲染流程

做為一個模板引擎,lit-html 的主要作用就是將模板渲染到頁面上,相比起 React、Vue 等框架,它更加專注于渲染,下面我們看看 lit-html 的基本工作流程。

  1. // Import lit-html 
  2. import { html, render } from 'lit-html'
  3.  
  4. // Define a template 
  5. const myTemplate = (name) => html`<p>Hello ${name}</p>`; 
  6.  
  7. // Render the template to the document 
  8. render(myTemplate('World'), document.body); 

 通過前面的案例也能看出,lit-html 對外常用的兩個 api 是 html 和 render。

構造模板

html 是一個標簽函數,屬于 ES6 新增語法,如果不記得標簽函數的用法,可以打開 Mozilla 的文檔(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Template_literals)復習下。

  1. export const html = (strings, ...values) => { 
  2.   …… 
  3. }; 

 html 標簽函數會接受多個參數,第一個參數為靜態字符串組成的數組,后面的參數為動態傳入的表達式。我們可以寫一個案例,看看傳入的 html 標簽函數的參數到底長什么樣:

  1. const foo = '吳彥祖'
  2. const bar = '梁朝偉'
  3.  
  4. html`<p>Hello ${foo}, I'm ${bar}</p>`; 

整個字符串會被動態的表達式進行切割成三部分,這個三個部分會組成一個數組,做為第一個參數傳入 html 標簽函數,而動態的表達式經過計算后得到的值會做為后面的參數一次傳入,我們可以將 strings 和 values 打印出來看看:

log

lit-html 會將這兩個參數傳入 TemplateResult 中,進行實例化操作。

  1. export const html = (strings, ...values) => { 
  2.   return new TemplateResult(strings, values); 
  3. }; 
  1.  
  2. const marker = `{{lit-${String(Math.random()).slice(2)}}}`; 
  3. const nodeMarker = `<!--${marker}-->`; 
  4.  
  5. export class TemplateResult { 
  6.  constructor(strings, values) { 
  7.   this.strings = strings; 
  8.   this.values = values
  9.  } 
  10.  getHTML() { 
  11.   const l = this.strings.length - 1; 
  12.   let html = ''
  13.   let isCommentBinding = false
  14.   for (let i = 0; i < l; i++) { 
  15.    const s = this.strings[i]; 
  16.    html += s + nodeMarker; 
  17.   } 
  18.   html += this.strings[l]; 
  19.   return html; 
  20.  } 
  21.  getTemplateElement() { 
  22.   const template = document.createElement('template'); 
  23.   let value = this.getHTML(); 
  24.   template.innerHTML = value; 
  25.   return template; 
  26.  } 

實例化的 TemplateResult 會提供一個 getTemplateElement 方法,該方法會創建一個 template 標簽,然后會將 getHTML 的值傳入 template 標簽的 innerHTML 中。而 getHTML 方法的作用,就是在之前傳入的靜態字符串中間插入 HTML 注釋。前面的案例中,如果調用 getHTML 得到的結果如下。

渲染到頁面

render 方法會接受兩個參數,第一個參數為 html 標簽函數返回的 TemplateResult,第二個參數為一個真實的 DOM 節點。

  1. export const parts = new WeakMap(); 
  2. export const render = (result, container) => { 
  3.   // 先獲取DOM節點之前對應的緩存 
  4.   let part = parts.get(container); 
  5.   // 如果不存在緩存,則重新創建 
  6.   if (part === undefined) { 
  7.     part = new NodePart() 
  8.     parts.set(container, part); 
  9.     part.appendInto(container); 
  10.   } 
  11.   // 將 TemplateResult 設置到 part 中 
  12.   part.setValue(result); 
  13.   // 調用 commit 進行節點的創建或更新 
  14.   part.commit(); 
  15. }; 

render 階段會先到 parts 里面查找之前構造過的 part 緩存??梢詫?part 理解為一個節點的構造器,用來將 template 的內容渲染到真實的 DOM 節點中。

如果 part 緩存不存在,會先構造一個,然后調用 appendInto 方法,該方法會在 DOM 節點的前后插入兩個注釋節點,用于后續插入模板。

  1. const createMarker = () => document.createComment(''); 
  2. export class NodePart { 
  3.   appendInto(container) { 
  4.     this.startNode = container.appendChild(createMarker()); 
  5.     this.endNode = container.appendChild(createMarker()); 
  6.   } 

 

然后通過 commit 方法創建真實的節點,并插入到兩個注釋節點中。下面我們看看 commit方法的具體操作:

  1. export class NodePart { 
  2.   setValue(result) { 
  3.     // 將 templateResult 放入 __pendingValue 屬性中 
  4.     this.__pendingValue = result; 
  5.   } 
  6.   commit() { 
  7.     const value = this.__pendingValue; 
  8.     // 依據 value 的不同類型進行不同的操作 
  9.     if (value instanceof TemplateResult) { 
  10.       // 通過 html 標簽方法得到的 value 
  11.       // 肯定是 TemplateResult 類型的 
  12.       this.__commitTemplateResult(value); 
  13.     } else { 
  14.       this.__commitText(value); 
  15.     } 
  16.   } 
  17.   __commitTemplateResult(value) { 
  18.     // 調用 templateFactory 構造模板節點 
  19.     const template = templateFactory(value); 
  20.     // 如果之前已經構建過一次模板,則進行更新 
  21.     if (this.value.template === template) { 
  22.       // console.log('更新DOM', value) 
  23.       this.value.update(value.values); 
  24.     } else { 
  25.       // 通過模板節點構造模板實例 
  26.       const instance = new TemplateInstance(template); 
  27.       // 將 templateResult 中的 values 更新到模板實例中 
  28.    const fragment = instance._clone(); 
  29.       instance.update(value.values); 
  30.       // 拷貝模板中的 DOM 節點,插入到頁面 
  31.       this.__commitNode(fragment); 
  32.       // 模板實例放入 value 屬性進行緩存,用于后續判斷是否是更新操作 
  33.       this.value = instance; 
  34.     } 
  35.   } 

實例化之后的模板,首先會調用 instance._clone() 進行一次拷貝操作,然后通過 instance.update(value.values) 將計算后的動態表達式插入其中。

最后調用 __commitNode 將拷貝模板得到的節點插入真實的 DOM 中。

  1. export class NodePart { 
  2.   __insert(node) { 
  3.     this.endNode.parentNode.insertBefore(node, this.endNode); 
  4.   } 
  5.   __commitNode(value) { 
  6.     this.__insert(value); 
  7.     this.value = value; 
  8.   } 

 

可以看到 lit-html 并沒有類似 Vue、React 那種將模板或 JSX 構造成虛擬 DOM 的流程,只提供了一個輕量的 html 標簽方法,將模板字符轉化為 TemplateResult,然后用注釋節點去填充動態的位置。TemplateResult 最終也是通過創建 標簽,然后通過瀏覽器內置的 innerHTML 進行模板解析的,這個過程也是十分輕量,相當于能交給瀏覽器的部分全部交給瀏覽器來完成,包括模板創建完后的節點拷貝操作。

  1. export class TemplateInstance { 
  2.   _clone() { 
  3.     const { element } = this.template; 
  4.     const fragment = document.importNode(element.content, true); 
  5.     // 省略部分操作…… 
  6.     return fragment; 
  7.   } 

其他lit-html 只是一個高效的模板引擎,如果要用來編寫業務代碼還缺少了類似 Vue、React 提供的生命周期、數據綁定等能力。為了完成這部分的能力,Polymer 項目組還提供了另一個框架:lit-element,可以用來創建 WebComponents。

除了官方的 lit-element 框架,Vue 的作者還將 Vue 的響應式部分剝離,與 lit-html 進行了結合,創建了一個 vue-lit(https://github.com/yyx990803/vue-lit) 的框架,一共也就寫了 70 行代碼,感興趣可以看看。

 

責任編輯:姜華 來源: 自然醒的筆記本
相關推薦

2013-07-27 21:28:44

2015-10-15 10:30:32

2013-06-27 11:21:17

2020-06-02 08:05:28

智能電表蜂窩物聯網NB-IoT

2024-02-26 14:46:53

移動計算人工智能5G

2018-09-11 08:00:00

DevOpsAIOps機器學習

2025-01-03 09:24:10

模型架構論文

2020-09-16 10:28:54

邊緣計算云計算數據中心

2021-04-21 07:53:14

云原生PulsarGo

2018-09-27 18:47:45

AIOpsDevOps

2020-09-27 17:27:58

邊緣計算云計算技術

2013-09-09 16:28:36

2014-07-18 17:14:34

2009-06-26 09:06:01

2012-06-15 09:21:03

Windows 7Windows XP

2011-12-08 10:16:53

2024-02-07 09:00:00

2022-06-17 14:48:38

物聯網住房危機數據

2012-07-16 10:08:31

下一代ITBYOD

2012-12-10 16:15:43

下一代防火墻NGWF
點贊
收藏

51CTO技術棧公眾號

男人的天堂亚洲在线| 国产午夜久久av| 国产午夜精品一区二区三区四区 | 日本一区网站| 中文字幕精品在线观看| 天天综合亚洲| 亚洲精品国产suv| 91网址在线播放| 在线观看男女av免费网址| 成人国产精品免费| 国产精品久久久久久搜索| 2025国产精品自拍| 日韩大尺度在线观看| 欧美日韩国产中文| 欧美视频免费看欧美视频| 国产69久久| 国产成人鲁色资源国产91色综| 97视频在线观看免费| 日韩欧美视频免费观看| 成人影院中文字幕| 欧美视频一区在线观看| 国产人妻777人伦精品hd| 97人人在线| 97久久超碰国产精品| 国产一区二区色| 在线能看的av| 欧美视频一区| 日韩中文字幕第一页| 三级视频网站在线观看| 亚洲久草在线| 色呦呦一区二区三区| 男人添女荫道口女人有什么感觉| 国产私人尤物无码不卡| eeuss影院一区二区三区| 国产日韩欧美日韩| 国产字幕在线观看| 亚洲人人精品| 欧美老妇交乱视频| 日韩一区二区三区四区视频| 综合干狼人综合首页| 欧美精品一区二区三区一线天视频| 亚洲综合欧美在线| 欧美黑人巨大xxxxx| 亚洲国产另类av| 水蜜桃在线免费观看| 在线视频二区| 欧美国产一区视频在线观看| 激情久久av| 国产91久久久| 国产不卡一区视频| 91|九色|视频| a视频免费在线观看| 精品一二三四区| 国产精品一区二区久久精品| 国产又粗又猛又爽又| 亚洲一区二区三区免费在线观看 | 亚洲成人精品视频| 免费欧美一级片| 国产美女亚洲精品7777| 91超碰这里只有精品国产| 美女一区二区三区视频| 国产日韩另类视频一区| 91久久精品日日躁夜夜躁欧美| 香港三级韩国三级日本三级| av资源一区| 亚洲不卡一区二区三区| 波多野结衣综合网| 久久久男人天堂| 欧美日韩午夜激情| 狠狠爱免费视频| 全亚洲第一av番号网站| 色婷婷激情综合| 爱情岛论坛vip永久入口| 日韩制服一区| 欧美日韩午夜精品| 国产成人美女视频| 精品国产亚洲一区二区三区在线| 欧美一区中文字幕| 99精品视频免费版的特色功能| 亚洲国产综合在线观看| 欧美一级久久久久久久大片| 911亚洲精选| 日日天天久久| 伊人久久久久久久久久| av最新在线观看| 国产精品观看| 清纯唯美日韩制服另类| 免费黄色小视频在线观看| 蜜桃久久av一区| 91香蕉电影院| 污视频网站免费观看| 国产午夜精品一区二区 | 欧美日韩视频一区二区三区| 久久久久久这里只有精品| 国产免费av一区| 精品一二线国产| 精品伦精品一区二区三区视频| 国产在线视频网址| 亚洲精品高清视频在线观看| 大肉大捧一进一出好爽视频| 久久天天久久| 亚洲黄色www网站| 中文天堂资源在线| 红桃视频欧美| 国产精品久久久久久久久久三级 | 另类调教123区| 99在线视频免费观看| 日韩av免费观影| 亚洲欧美日韩国产手机在线 | 1区2区3区在线| 欧美亚洲综合另类| 911亚洲精选| 欧美成人milf| 欧美一级大片在线观看| 国产精品久久免费| 久久精品一区四区| 国产精品12345| 久久在线观看| 中文字幕亚洲欧美日韩高清| 日韩精品国产一区二区| 精彩视频一区二区三区| 欧美精品一区二区三区在线看午夜| www在线视频| 欧美性三三影院| 国产精品无码一区二区三| 欧美gayvideo| 国产盗摄xxxx视频xxx69| 亚洲精选一区二区三区| 中文字幕一区二区三区在线播放 | 欧美中文娱乐网| 免费不卡av| 欧美一区二区三区在线观看视频| 蜜乳av中文字幕| 99精品视频免费观看视频| 99国产在线视频| 国产婷婷视频在线| 欧美日韩中文国产| 亚洲第一综合网| 性8sex亚洲区入口| 极品校花啪啪激情久久| 欧洲黄色一区| 欧美大片在线观看| 老熟妻内射精品一区| 另类中文字幕网| 日韩精品一区二区三区丰满| 欧美理论影院| 亚洲欧美自拍一区| 国产精品视频一区在线观看| 97国产精品videossex| 成人免费在线网| 精品人人人人| 91精品国产高清久久久久久91| 国产成人三级在线观看视频| 一二三四社区欧美黄| gogo亚洲国模私拍人体| 欧美视频一区| 久久av一区二区三区亚洲| 麻豆网站免费在线观看| 日韩电影视频免费| 国产无套丰满白嫩对白| 久久久久国色av免费看影院| 日本不卡在线观看视频| 亚洲桃色综合影院| 国产精品激情自拍| 日本视频在线| 日韩一级片网址| 久久精品亚洲无码| 99热精品一区二区| 久草精品在线播放| 青青草原综合久久大伊人精品| 国产精品美腿一区在线看| 午夜视频在线观看网站| 欧美高清性hdvideosex| 日韩一级片大全| 国产999精品久久久久久| 免费看欧美一级片| 亚洲三级精品| 国产欧美日韩精品在线观看| 怡红院红怡院欧美aⅴ怡春院| 欧美va亚洲va| 你懂的国产在线| 欧美激情在线观看视频免费| 一二三av在线| 日韩图片一区| 先锋影音网一区| 欧美激情精品| 欧美在线视频网| 日本中文字幕视频在线| 精品三级在线看| 免费又黄又爽又猛大片午夜| 亚洲欧洲成人av每日更新| zjzjzjzjzj亚洲女人| 久久一区国产| 毛片在线视频观看| 欧美男男gaytwinkfreevideos| 国产专区欧美专区| 黄色漫画在线免费看| 一区二区亚洲精品国产| 亚洲乱色熟女一区二区三区| 色综合久久综合网欧美综合网| 国产精品久久国产精麻豆96堂| 成人av网站大全| 在线观看日本一区二区| 夜久久久久久| 二级片在线观看| 精品一区免费| 成人av资源| 欧美videos粗暴| 欧美在线视频在线播放完整版免费观看| a天堂中文在线| 亚洲成人教育av| 国产男男gay体育生白袜| 欧美性猛交xxxx乱大交| 精国产品一区二区三区a片| 国产女主播一区| 在线观看国产三级| 国产剧情一区二区| 污污的网站18| 久久亚洲国产精品一区二区| 精品久久久久久无码中文野结衣| 久久免费av| 日韩免费av电影| 免费精品国产| 国产在线一区二区三区欧美| 九九99久久精品在免费线bt| 国产精品视频久久久久| 成人欧美大片| 91av视频导航| 国产精品蜜臀| 欧美黑人狂野猛交老妇| 黄色网页在线免费看| 色悠悠国产精品| 成人免费在线视频网| 亚洲欧美日韩国产中文专区| 天天综合天天综合| 亚洲成人精品久久久| www.天堂av.com| 日韩欧美色综合网站| 国产精品永久久久久久久久久| 精品视频一区三区九区| 波多野结衣一区二区三区在线| 欧美视频在线观看免费网址| 日韩欧美亚洲视频| 亚洲国产cao| 久久久久久久蜜桃| 夜夜爽夜夜爽精品视频| 高h视频免费观看| 亚洲六月丁香色婷婷综合久久| 久久av红桃一区二区禁漫| 亚洲视频一区二区在线| 三级黄色录像视频| 亚洲色图.com| 婷婷在线精品视频| 一区二区三区四区五区视频在线观看| 免费看一级大片| 亚洲精品成人悠悠色影视| 欧美成人免费观看视频 | 精品激情国产视频| 美女写真理伦片在线看| 日韩三级影视基地| 中文字幕有码在线观看| 欧美精品video| www在线观看黄色| 青青久久aⅴ北条麻妃| 九九九伊在线综合永久| 国产精品一区二区三区毛片淫片| 欧美成人高清视频在线观看| 91在线免费视频| 成人自拍在线| 美乳视频一区二区| 欧美熟乱15p| 国产女主播av| 一本色道久久综合亚洲精品不卡 | 国产中文字幕精品| 国产精品欧美性爱| 2022国产精品视频| 国产毛片欧美毛片久久久| 亚洲女人小视频在线观看| 国产真实乱偷精品视频| 色婷婷av一区二区三区gif| 中文字幕永久免费视频| 日韩亚洲电影在线| 午夜影院在线视频| 日韩在线观看视频免费| 色爱综合区网| 国产成人涩涩涩视频在线观看| 欧美韩国日本| 国产精品国产一区二区| 精品视频国产| 91动漫在线看| 久久一二三区| 日本wwww色| 久久久久久影视| 成人免费毛片xxx| 欧美丝袜第一区| 国产精品高潮呻吟av| 亚洲精品www久久久| 在线免费观看黄色网址| 高清亚洲成在人网站天堂| 久久精品97| 精品久久精品久久| 久久精品亚洲欧美日韩精品中文字幕| 国产中文字幕二区| 久久国产精品免费| 欧美图片一区二区| 一区二区三区在线视频免费| 久久久久久无码精品大片| 欧美变态tickling挠脚心| 99中文字幕一区| 国内精品伊人久久| 99久久这里有精品| 欧美成人蜜桃| 国一区二区在线观看| 性chinese极品按摩| 9色porny自拍视频一区二区| 日韩va亚洲va欧美va清高| 在线视频国内自拍亚洲视频| 天天av天天翘| 欧美日产国产成人免费图片| 国产乱子精品一区二区在线观看| 精品伊人久久大线蕉色首页| 综合一区二区三区| 在线观看免费污视频| 久久久亚洲精品石原莉奈| 国产系列精品av| 91精品福利在线一区二区三区 | 国产人久久人人人人爽| 久久久久久91亚洲精品中文字幕| 欧美xxxx老人做受| 影音先锋中文在线视频| 91在线免费网站| 久久久久久美女精品| 天堂av在线网站| 久久精品亚洲精品国产欧美 | av毛片在线播放| 成人a视频在线观看| 日韩欧美综合| 潘金莲激情呻吟欲求不满视频| 国产欧美精品一区二区色综合| 亚洲影院在线播放| 亚洲精品视频免费| 樱桃视频成人在线观看| 精品国产乱码久久久久久蜜柚 | 尤物tv在线精品| 欧美性大战久久久久xxx| 99re热这里只有精品免费视频| 国产无码精品在线观看| 亚洲精品在线三区| 丁香花在线观看完整版电影| 国产66精品久久久久999小说| 欧美日韩1080p| 少妇精品无码一区二区| 亚洲午夜在线观看视频在线| 高潮一区二区三区乱码| 81精品国产乱码久久久久久| 日韩啪啪网站| 日日摸天天爽天天爽视频| 久久久久久久久蜜桃| 探花国产精品一区二区| 最近中文字幕mv在线一区二区三区四区 | 精品国产成人av在线免| 久久久www成人免费无遮挡大片| 中文字幕日韩免费| 中文字幕少妇一区二区三区| 伊人久久大香线蕉综合影院首页| 日本一区二区三区四区五区六区| 国产成人aaa| 亚洲视频免费播放| 亚洲片在线观看| 日韩欧美激情| 黄色一级片黄色| 99精品一区二区三区| 男人天堂视频网| 久久精品中文字幕| 高清一区二区三区| 久久久久久久少妇| 中文字幕一区二区不卡| 午夜免费福利视频| 欧美一性一乱一交一视频| 成人av资源电影网站| 免费观看黄网站| 一本大道久久a久久综合| 午夜在线视频播放| 国产精品久久久久久久久久久久午夜片| 国产精品亚洲综合色区韩国| 黄色国产在线播放| 精品欧美久久久| 欧洲一区二区三区精品| 黄黄视频在线观看| 久久这里只有精品首页| 91精东传媒理伦片在线观看| 国模精品视频一区二区| 第四色成人网| 亚洲最大视频网| 欧美体内she精视频| 操喷在线视频| 一区二区三区四区久久| 99久久久无码国产精品| 亚洲一区二区人妻| 欧美亚洲国产视频小说|