日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

纯原生组件化-模块化的探索

發(fā)布時間:2024/9/21 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 纯原生组件化-模块化的探索 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

純原生的組件化、模塊化的一次小小的嘗試,用到了如下幾個新特性: shadown-DOM 對HTML標(biāo)簽結(jié)構(gòu)的一個封裝,真正意義上的組件,能保證 shadow-DOM 中的DOM元素不會被外界影響,內(nèi)部也不會影響到外部的行為,變成了一個獨(dú)立的模塊。
custom-elements 可以在瀏覽器中注冊自定義的標(biāo)簽來使用,類似這樣的效果<my-tag></my-tag>,標(biāo)簽內(nèi)容基于兩種形式:1. 普通子元素 2. shadow-DOM
custom-events 使用各種自定義事件輔助完成組件之間的通訊
ES-module 為瀏覽器原生支持的模塊化的一種方案,直接在瀏覽器里使用import和export這類語法,以 module 的方式來引入 js 文件。
幾個算是比較新的事物,聚集在一起確實(shí)可以做點(diǎn)兒好玩的東西出來。

shadow-DOM

想象有這樣的一個場景,類似資料卡的東東,需要在頁面中展示頭像和用戶的名稱。
頭像在左,寬高100px,圓形;
姓名在右,字號16px,垂直居中。

這算是一段很簡單的CSS了,實(shí)現(xiàn)起來大概是這樣的:

<style> .info { display: flex; }.info-avatar { width: 100px; height: 100px; border-radius: 50%; }.info-name { display: flex; align-items: center; font-size: 16px; } </style> <div class="info"><img class="info-avatar" src="https://avatars1.githubusercontent.com/u/9568094?v=4" /><p class="info-name">Jarvis</p> </div> 復(fù)制代碼

此時,我們完成了需求,一切都沒有什么不對的,但是一個很現(xiàn)實(shí)的問題。
不會有這么簡單的頁面存在的,就算簡潔如 Google 首頁,也用到了400左右的DOM元素。
很難保證其他資源文件中的CSS、JS會不會對上邊的DOM產(chǎn)生影響。
就比如如果有一個main.css文件中寫了一行:p { color: red;},那么這條CSS就會對我們上邊所寫的.info-name元素產(chǎn)生影響,導(dǎo)致文本顏色變?yōu)榧t色。

這種問題經(jīng)常會出現(xiàn)在一些需要用到第三方插件的頁面中,很可能對方提供的CSS會影響到你的DOM元素,也很有可能你的CSS會對插件中的DOM造成影響。

解決這個問題有一種簡單的辦法,那就是All with !important,使用shadow-DOM。

目前瀏覽器中就有一些shadow-DOM的例子:

  • <video>
  • <audio>
  • 甚至<input>

這些元素在 Chrome 上的構(gòu)建都是采用了shadow-DOM的方式,但是默認(rèn)情況下在開發(fā)者工具中是看不到這些元素的。

開啟shadow-DOM的流程: Chrome DevTools -> Settings -> 默認(rèn) Preferences 面板中找到 Elements -> 點(diǎn)擊勾選 Show user agent shadow DOM 即可

這時候就可以通過開發(fā)者工具查看到shadow-DOM的實(shí)際結(jié)構(gòu)了。

shadow-DOM的一個特點(diǎn),shadow 里邊所有的DOM元素不會被外界的代碼所影響,這也就是為什么video和audio的 UI 難以自定義的原因了-.-。

基本語法

shadow-DOM的創(chuàng)建必須要使用JavaScript才能完成,我們需要在文檔中有一個用于掛在shadow-DOM的真實(shí)元素,也被稱為host。
除此之外的創(chuàng)建過程,就可以像普通DOM樹那樣的增刪改子元素了。

let $tag = document.querySelector('XXX') // 用于掛載的真實(shí)元素let shadow = $tag.attachShadow({ mode: 'open' }) // 掛載shadow-DOM元素,并獲取其根元素 復(fù)制代碼

attachShadow中的mode參數(shù)有兩個有效的取值,open和closed,用來指定一個 shadow-DOM 結(jié)構(gòu)的封裝模式。

當(dāng)值為open時,則我們可以通過掛載時使用的真實(shí)元素獲取到shadow-DOM。

$tag.shadowRoot; // shadow-DOM的root元素 復(fù)制代碼

當(dāng)值為closed時,則表示外層無法獲取shadow-DOM。

$tag.shadowRoot; // null 復(fù)制代碼

后續(xù)的操作就與普通的DOM操作一致了,各種append、remove、innerHTML都可以了。

let $shadow = $tag.attachShadow({ mode: 'open' })let $img = document.createElement('img') $shadow.appendChild($img) // 添加一個img標(biāo)簽到shadow-DOM中$shadow.removeChild($img) // 將img標(biāo)簽從shadow-DOM中移除$img.addEventListener('click', _ => console.log('click on img'))$shadow.innerHTML = `<div class="wrap"><p>Some Text</p></div> ` 復(fù)制代碼

需要注意的一點(diǎn)是,shadow-DOM本身并不是一個實(shí)際的標(biāo)簽,不具備定義CSS的能力。
但是綁定事件是可以的

$shadow.appendChild('<p></p>') // 假裝add了一個標(biāo)簽 $shadow.appendChild('<p></p>') // 假裝add了一個標(biāo)簽// 最后得到的結(jié)構(gòu)就是 // <外層容器> // <p></p> // <p></p> // </外層容器>// 沒有class相關(guān)的屬性 $shadow.classList // undefined $shadow.className // undefined $shadow.style // undefined // 綁定事件是沒問題的 $shadow.addEventListener('click', console.log) 復(fù)制代碼

shadow-DOM也會有CSS的屬性繼承,而不是完全的忽略所有外層CSS

<style>body {font-size: 16px; /* 屬性會被.text元素繼承 */}.host {color: red; /* 同樣會被.text元素繼承 */}.text {color: green; /* 直接設(shè)置shadow內(nèi)的元素是無效的 */}p {font-size: 24px; /* 針對p標(biāo)簽的設(shè)置也不會被.text應(yīng)用 */}/* 對外層設(shè)置flex,內(nèi)部元素也會直接應(yīng)用(但為了保證對外層元素的非侵入性,建議內(nèi)部創(chuàng)建一個容器DOM) */.host {display: flex;}.text {flex: 1;} </style> <div class="host">#shadow<p class="text">Text</p><p class="text">Text</p>#shadow </div> 復(fù)制代碼

所以說,對于shadow-DOM,CSS只是屏蔽了直接命中了內(nèi)部元素的那一部分規(guī)則。
比如說寫了一個* { color: red; },這個規(guī)則肯定會生效的,因?yàn)?代表了全部,實(shí)際上shadow-DOM是從外層host元素繼承過來的color: red,而不直接是命中自己的這條規(guī)則。

簡單的小例子

我們使用shadow-DOM來修改上邊的資料卡。

在線demo
源碼地址

<div id="info"></div> <script>let $info = document.querySelector('#info') // hostlet $shadow = $info.attachShadow({mode: 'open'})let $style = document.createElement('style')let $wrap = document.createElement('div')let $avatar = document.createElement('img')let $name = document.createElement('p')$style.textContent = `.info { display: flex; }.info-avatar { width: 100px; height: 100px; border-radius: 50%; }.info-name { display: flex; align-items: center; font-size: 16px; }`$wrap.className = 'info'$avatar.className = 'info-avatar'$name.className = 'info-name'$avatar.src = 'https://avatars1.githubusercontent.com/u/9568094?v=4'$name.innerHTML = 'Jarvis'$wrap.appendChild($avatar)$wrap.appendChild($name)$shadow.appendChild($style)$shadow.appendChild($wrap) </script> 復(fù)制代碼

P.S. 在 shadow-DOM 內(nèi)部的 css,不會對外界所產(chǎn)生影響,所以使用 shadow-DOM 就可以肆意的對 class 進(jìn)行命名而不用擔(dān)心沖突了。

如果現(xiàn)在在一個頁面中要展示多個用戶的頭像+姓名,我們可以將上邊的代碼進(jìn)行封裝,將 className,appendChild之類的操作放到一個函數(shù)中去,類似這樣的結(jié)構(gòu):

在線demo
源碼地址

function initShadow($host, { isOpen, avatar, name }) {let $shadow = $host.attachShadow({ mode: isOpen ? 'open' : 'closed' });// ...省略各種操作$avatar.src = avatar$name.innerHTML = name }initShadow(document.querySelector('#info1'), {avatar: 'https://avatars1.githubusercontent.com/u/9568094?v=4',name: 'Jarvis' }); initShadow(document.querySelector('#info2'), { isOpen: true,avatar: 'https://avatars1.githubusercontent.com/u/9568094?v=4',name: 'Jarvis' }) 復(fù)制代碼

這樣就實(shí)現(xiàn)了一個簡單的組件,可以在需要用到的地方,直接傳入一個掛載的DOM即可。

custom-elements

就像上邊的shadow-DOM,已經(jīng)在文檔樹中看不到組件的細(xì)節(jié)了,任何代碼也都不會影響到它的結(jié)構(gòu)(open模式下的獲取root操作除外)。
但是,這樣在文檔中是存在一個用來掛在shadow-DOM的根元素,這個根元素依然是一個普通的HTML標(biāo)簽。
如果是一個大型頁面中,存在了N多類似的組件,搜索一下,全是<div></div>,這個體驗(yàn)其實(shí)是很痛苦的,基本是毫無語義化。
而且我們想要使用這個組件時,還必須額外的調(diào)用JavaScript來獲取DOM元素生成對應(yīng)的shadow-DOM。
所以,我們可以嘗試用custom-elements來注冊自己獨(dú)有的標(biāo)簽。
簡單的通過<my-tag>的方式來調(diào)用自定義組件。

custom-elements支持同時支持普通標(biāo)簽的封裝以及shadow-DOM的封裝,但兩者不能共存。

基本語法

首先我們需要有一個繼承了HTMLElement的類。
然后需要將其注冊到當(dāng)前環(huán)境中。

class Info extends HTMLElement {}customElements.define('cus-info', // 標(biāo)簽名Info // 標(biāo)簽對應(yīng)的構(gòu)造函數(shù) ) 復(fù)制代碼

在調(diào)用define時還有一個可選的第三個參數(shù),用來設(shè)置自定義標(biāo)簽繼承自某個原生標(biāo)簽。 兩者在后續(xù)的標(biāo)簽使用上稍微有些區(qū)別:

<!-- 如果設(shè)置了 { extends: 'p' } --> <p is="cus-info" /> <script>document.createElement('p', { is: 'cus-info' }) </script> <!-- 沒有設(shè)置 extends 的情況 --> <info /> <script>document.createElement('cus-info') // 必須要包含一個`-` </script> 復(fù)制代碼

P.S. 自定義的標(biāo)簽的注冊名至少要包含一個-
結(jié)合場景來選擇是否使用extends,個人不建議使用,因?yàn)榭雌饋頃娣恍?/p>

普通標(biāo)簽的方式

如果是針對普通的一組標(biāo)簽進(jìn)行封裝,就是解決了一些相同功能的組件需要在頁面中粘來粘去的問題。

在線demo
源碼地址

<cus-info><p>native text</p><!-- 默認(rèn)是可以直接嵌套的,除非在自定義組件中移除 --> </cus-info> <script>class CusInfo extends HTMLElement {constructor() {super()let $text = document.createElement('p')$text.innerHTML = 'Hello custom-elements.'this.appendChild($text) // this代表當(dāng)前自定義元素的實(shí)例}}customElements.define('cus-info', CusInfo) </script> 復(fù)制代碼

實(shí)現(xiàn)類似這樣的效果:

shadow-DOM的使用方式

P.S. 當(dāng)一個元素激活了shadow-DOM以后,里邊的普通子元素都會變得不可見,但是使用DOM API依然可以獲取到

在線demo
源碼地址

<cus-info><p>native text</p><!-- 默認(rèn)是可以直接嵌套的,除非在自定義組件中移除 --> </cus-info> <script>class CusInfo extends HTMLElement {constructor() {super()let $shadow = this.attachShadow({ mode: 'open' })let $text = document.createElement('p')$text.innerHTML = 'Hello custom-elements.'$shadow.appendChild($text)}}customElements.define('cus-info', CusInfo)console.log(document.querySelector('cus-info').children[0].innerHTML) // native text </script> 復(fù)制代碼

生命周期函數(shù)

自定義標(biāo)簽并不只是一個讓你多了一個標(biāo)簽可以用。
注冊的自定義標(biāo)簽是有一些生命周期函數(shù)可以設(shè)置的,目前有效的事件為:

  • connectedCallback 標(biāo)簽被添加到文檔流中觸發(fā)
  • disconnectedCallback 標(biāo)簽被從文檔流中移除時觸發(fā)
  • adoptedCallback 標(biāo)簽被移動時觸發(fā),現(xiàn)有的API貌似沒有一個可以觸發(fā)這個事件的,因?yàn)橄馻ppendChild或者insertBefore這一類的,對于已經(jīng)存在的DOM元素都是先移除后新增的,所以不存在有直接移動的行為
  • attributeChangedCallback 增刪改元素屬性時會觸發(fā) 需要提前設(shè)置observedAttributes,才能監(jiān)聽對應(yīng)的屬性變化

一個觸發(fā)各種事件的簡單示例:

在線demo
源碼地址

<div id="wrap"><div id="content"></div> </div> <script>class CusTag extends HTMLElement {static get observedAttributes() { return ['id'] } // 設(shè)置監(jiān)聽哪些屬性變化connectedCallback () { console.log('DOM被添加到文檔中') }disconnectedCallback () { console.log('DOM被從文檔中移除') }adoptedCallback () { console.log('DOM被移動') }attributeChangedCallback () { console.log('DOM屬性有修改') }}customElements.define('cus-tag', CusTag)let $wrap = document.querySelector('#wrap')let $content = document.querySelector('#content')let $tag = document.createElement('cus-tag')$wrap.appendChild($tag)$content.appendChild($tag)$tag.setAttribute('id', 'tag-id')$tag.setAttribute('id', 'tag-id2')$tag.removeAttribute('id')$content.removeChild($tag) </script> 復(fù)制代碼

P.S. 如果需要處理DOM結(jié)構(gòu)以及綁定事件,推薦在connectedCallback回調(diào)中執(zhí)行 想要attributeChangedCallback生效,必須設(shè)置observedAttributes來返回該標(biāo)簽需要監(jiān)聽哪些屬性的改變

使用自定義標(biāo)簽封裝資料卡組件

接下來就是使用custome-elements結(jié)合著shadow-DOM來完成資料卡的一個簡單封裝。
因?yàn)閟hadow-DOM版本的組件相對更獨(dú)立一些,所以這里采用的是shadow-DOM的方式進(jìn)行封裝。
大致代碼如下:

在線demo
源碼地址

<info-card name="Jarvis" avatar="https://avatars1.githubusercontent.com/u/9568094?v=4" /> <!-- P.S. 這里會觸發(fā)一個Chrome67版本的一個隱藏bug --> <script>class InfoCard extends HTMLElement {connectedCallback () {// 穩(wěn)妥的方式是在確定標(biāo)簽已經(jīng)被添加到DOM中在進(jìn)行渲染let avatar = this.getAttribute('avatar')let name = this.getAttribute('name')initShadow(this, { avatar, name })}}customElements.define('info-card', InfoCard) </script> 復(fù)制代碼

針對上邊的initShadow調(diào)用也只是更換了avatar和name字段的來源罷了。
現(xiàn)在,我們需要在頁面中使用封裝好的資料卡,僅僅需要注冊一個自定義標(biāo)簽,然后在HTML中寫對應(yīng)的標(biāo)簽代碼即可

再開一下腦洞

因?yàn)槭遣捎昧俗詇tml標(biāo)簽的方式,其實(shí)這個是對采用Server端模版渲染特別友好的一件事兒。
如果有使用服務(wù)端渲染的頁面,可能會動態(tài)的拼接一些DOM元素到請求的返回值中。
為了應(yīng)用一些樣式,可能需要在模版中添加各種className,也很有可能手一抖之類的就會導(dǎo)致標(biāo)簽沒有閉合、結(jié)構(gòu)錯亂,或者某些屬性拼寫出錯,各種233的問題。
比如插入一些表單元素,之前可能是這樣的代碼:

router.get('/', ctx => {ctx.body = `<body><form><div class="form-group"><label for="account">Account</label><input id="account" placholder="put account" /></div><div class="form-group"><label for="password">Account</label><input id="password" placholder="put password" type="password" /></div><button>Login</button></form></body>` }) 復(fù)制代碼

在使用了custom-elements以后,Server端的記憶成本也會降低很多。
Server端只需要表明這里有一個表單元素就夠了,具體渲染成什么樣,還是交由前端來決定。

router.get('/', ctx => {ctx.body = `<body><form><form-field id="account" label="Account" placholder="put account" /><form-field id="password" label="Password" placholder="put password" type="password" /><form-login /></form></body>` }) 復(fù)制代碼

custom-events

如果在頁面中使用很多的自定義組件,必然會遇到組件之間的通訊問題的。
比如我一個按鈕點(diǎn)擊了以后如何觸發(fā)其他組件的行為。
因?yàn)槭羌冊陌姹?#xff0c;所以天然的支持addEventListener,我們可以直接使用custom-events來完成組件之間的通訊。

基本語法

使用自定義事件與原生DOM事件唯一的區(qū)別就在于需要自己構(gòu)建Event實(shí)例并觸發(fā)事件:

document.body.addEventListener('ping', _ => console.log('pong')) // 設(shè)置事件監(jiān)聽document.body.dispatchEvent(new Event('ping')) // 觸發(fā)事件 復(fù)制代碼

自定義組件中的使用

現(xiàn)在頁面中有兩個組件,一個容器,容器中包含一個文本框和數(shù)個按鈕,點(diǎn)擊按鈕以后會將按鈕對應(yīng)的文字輸出到文本框中:

在線demo
源碼地址

<cus-list><input id="output" /><cus-btn data-text="Button 1"></cus-btn><cus-btn data-text="Button 2"></cus-btn><cus-btn data-text="Button 3"></cus-btn> </cus-list> <script>class CusList extends HTMLElement {connectedCallback() {let $output = this.querySelector('#output')Array.from(this.children).forEach(item => {if (item.tagName.toLowerCase() === 'cus-btn') {item.addEventListener('check', event => { // 注冊自定義事件的監(jiān)聽$output.value = event.target.innerText})}})}}class CusBtn extends HTMLElement {connectedCallback() {let { text } = this.datasetlet $text = document.createElement('p')$text.innerHTML = text$text.addEventListener('click', _ => {this.dispatchEvent(new Event('check')) // 觸發(fā)自定義事件})this.appendChild($text)}}customElements.define('cus-list', CusList)customElements.define('cus-btn', CusBtn) </script> 復(fù)制代碼

上邊是在List中循環(huán)了自己的子節(jié)點(diǎn),然后依次綁定事件,這種處理是低效的,而且是不靈活的。
如果有新增的子元素,則無法觸發(fā)對應(yīng)的事件。
所以,我們可以開啟事件的冒泡來簡化上邊的代碼:

在線demo
源碼地址

class CusList extends HTMLElement {connectedCallback() {let $output = this.querySelector('#output')this.addEventListener('check', event => { // 注冊自定義事件的監(jiān)聽$output.value = event.target.innerText // 效果一樣,因?yàn)閑vent.target就是觸發(fā)dispatchEvent的那個DOM對象})} } class CusBtn extends HTMLElement {connectedCallback() {let { text } = this.datasetlet $text = document.createElement('p')$text.innerHTML = text$text.addEventListener('click', _ => {this.dispatchEvent(new Event('check'), {bubbles: true // 啟用事件冒泡}) // 觸發(fā)自定義事件})this.appendChild($text)} } 復(fù)制代碼

ES-module

ES-module是原生模塊化的一種實(shí)現(xiàn),使用ES-module可以讓我們上邊組件的調(diào)用變得更方便。
這里有之前的一篇講解ES-module的文章:傳送陣
所以,不再贅述一些module相關(guān)的基礎(chǔ),直接將封裝好的組件代碼挪到一個js文件中,然后在頁面中引用對應(yīng)的js文件完成調(diào)用。

在線demo
源碼地址

module.js

export default class InfoCard extends HTMLElement { }customElements.define('info-card', InfoCard) 復(fù)制代碼

index.html

<info-card name="Jarvis" avatar="https://avatars1.githubusercontent.com/u/9568094?v=4"></info-card> <script type="module" src="./cus-elements-info-card.js"></script> 復(fù)制代碼

第一眼看上去,這樣做好像與普通的js腳本引入并沒有什么區(qū)別。
確實(shí)單純的寫這一個組件的話,是沒有什么區(qū)別的。

但是一個現(xiàn)實(shí)中的頁面,不會只有這么一個組件的,假設(shè)有這樣的一個頁面,其中包含了三個組件:

<cus-tab><cus-list><cus-card /><cus-card /></cus-list><cus-list><cus-card /><cus-card /></cus-list> </cus-tab> 復(fù)制代碼

我們在使用list時要保證card已經(jīng)加載完成,在使用tab時要保證list已經(jīng)加載完成。
最簡單的方法就是等到所有的資源全部加載完成后再執(zhí)行代碼,主流的webpack打包就是這么做的。
但是,這樣做帶來的后果就是,明明list和card加載完畢后就可以處理自己的邏輯,注冊自定義標(biāo)簽了,卻還是要等外層的tab加載完畢后再執(zhí)行代碼。
這個在使用webpack打包的React和Vue這類框架上邊就是很明顯的問題,如果打包完的js文件過大,幾百k,甚至數(shù)兆。
需要等到這個文件全部下載完畢后才會開始運(yùn)行代碼,構(gòu)建頁面。

我們完全可以利用下載其他組件時的空白期來執(zhí)行當(dāng)前組件的一些邏輯,而使用webpack這類打包工具卻不能做到,這很顯然是一個時間上的浪費(fèi),而ES-module已經(jīng)幫忙處理了這件事兒,module代碼的執(zhí)行是建立在所有的依賴全部加載完畢的基礎(chǔ)上的。

當(dāng)card和list加載完畢后,list就會開始執(zhí)行代碼。而此時的tab可能還在加載過程中,等到tab加載完畢開始執(zhí)行時,list已經(jīng)注冊到了document上,就等著被調(diào)用了,從某種程度上打散了代碼執(zhí)行過于集中的問題。
可能之前頁面加載有200ms在下載文件,有50ms在構(gòu)建組件,50ms渲染頁面*(數(shù)值純屬扯淡,僅用于舉例)*。
有些組件比較輕量級,可能用了20ms就已經(jīng)下載完了文件,如果它沒有依賴其他的module,這時就會開始執(zhí)行自身組件的一些代碼,生成構(gòu)造函數(shù)、注冊自定義組件到文檔中,而這些步驟執(zhí)行的過程中可能瀏覽器還在下載其他的module,所以這就是兩條并行的線了,讓一部分代碼執(zhí)行的時間和網(wǎng)絡(luò)請求消耗的時間所重疊。

舉一個現(xiàn)實(shí)中的例子:
你開了一家飯店,雇傭了三個廚師,一個做番茄炒蛋、一個做皮蛋豆腐、還有一個做拍黃瓜,因?yàn)閳龅赜邢?#xff0c;所以三個廚師共用一套炊具。(單線程)
今天第一天開業(yè),這時候來了客人點(diǎn)了這三樣菜,但是菜還在路上。
webpack:「西紅柿、雞蛋、皮蛋、豆腐、黃瓜」全放到一塊給你送過來,送到了以后,三個廚師輪著做,然后給客人端過去。 ES-module:分撥送,什么菜先送過來就先做哪個,哪個先做完給客人端哪個。

一個簡單的組件嵌套示例

在線demo
源碼地址

cus-elements-info-list.js

import InfoCard from './cus-elements-info-card.js'export default class InfoList extends HTMLElement {connectedCallback() {// load datalet data = [{avatar: 'https://avatars1.githubusercontent.com/u/9568094?v=4',name: 'Jarvis'},{avatar: 'https://avatars1.githubusercontent.com/u/9568094?v=4',name: 'Jarvis'},{avatar: 'https://avatars1.githubusercontent.com/u/9568094?v=4',name: 'Jarvis'}]// laod data endinitShadow(this, { data })} }function initShadow($host, { data, isOpen }) {let $shadow = $host.attachShadow({ mode: isOpen ? 'open' : 'closed' })let $style = document.createElement('style')let $wrap = document.createElement('div')$style.textContent = `.list { display: flex; flex-direction: column; }`$wrap.className = 'list'// loop createdata.forEach(item => {let $item = new InfoCard()$item.setAttribute('avatar', item.avatar)$item.setAttribute('name', item.name)$wrap.appendChild($item)})$shadow.appendChild($style)$shadow.appendChild($wrap) }customElements.define('info-list', InfoList) 復(fù)制代碼<info-list></info-list> <script type="module" src="./cus-elements-info-list.js"></script> 復(fù)制代碼

new Component與document.createElement效果一樣,用于在不知道組件的注冊名的情況下使用

總結(jié)

一些小提示

  • shadow-DOM無法與普通的子元素共存,設(shè)置attachShadow以后會導(dǎo)致普通子元素在頁面不可見,但是DOM依然保留
  • custom-elements的注冊名必須要包含一個-
  • custom-elements的constructor函數(shù)觸發(fā)時不能保證DOM已經(jīng)正確渲染完畢,對DOM進(jìn)行的操作應(yīng)該放到connectedCallback中
  • custom-elements組件的屬性變化監(jiān)聽需要提前配置observedAttributes,沒有通配符之類的操作
  • ES-module相關(guān)的操作只能在type="module"中進(jìn)行
  • ES-module的引用是共享的,即使十個文件都import了同一個JS文件,他們拿到的都是同一個對象,不用擔(dān)心浪費(fèi)網(wǎng)絡(luò)資源
  • 一個簡單的TODO-LIST的實(shí)現(xiàn):

    在線demo
    源碼地址

    瀏覽器原生支持的功能越來越豐富,ES-module、custom-elements、shadow-DOM以及各種新鮮的玩意兒;
    web原生的組件化、模塊化,期待著普及的那一天,就像現(xiàn)在可以放肆的使用qsa 、fetch,而不用考慮是否需要引入jQuery來幫助做兼容一樣(大部分情況下)。

    參考資料

  • shadow-DOM | MDN
  • custom-elements | MDN
  • custom-events | MDN
  • ES-module | MDN
  • 文中所有示例的倉庫地址

    倉庫地址

    總結(jié)

    以上是生活随笔為你收集整理的纯原生组件化-模块化的探索的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    久久国产高清视频 | 欧美激情精品久久久 | 国产免费三级在线观看 | 色视频在线免费观看 | 在线观看国产麻豆 | 欧美另类xxxx| 99久久精品国产免费看不卡 | 午夜精品久久久久久中宇69 | 久久大香线蕉app | 日日夜夜天天久久 | 日本韩国精品在线 | 99久久精品国产系列 | www五月天| 国产99亚洲 | 在线观看黄色国产 | 日韩有码第一页 | 九九精品毛片 | 免费在线日韩 | 国产免费视频在线 | www视频在线免费观看 | 黄av免费| 999热视频| 97在线播放视频 | 日日色综合 | 日韩视频精品在线 | 日韩精品久久久久久 | 99 色| 亚洲精品在线电影 | 在线精品观看 | 国产精品麻豆视频 | 欧美精品久久久久久久 | 超碰97久久| 国产一区二区三区 在线 | 国产一级a毛片视频爆浆 | 国内精品久久久久久久久久久 | 美女在线观看网站 | 午夜丁香网 | 色婷婷狠 | 成人午夜精品福利免费 | 亚洲女同videos | 最新免费av在线 | 久久精品国产免费看久久精品 | 人人盈棋牌 | 国产999精品 | 成人av电影在线播放 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 少妇性bbb搡bbb爽爽爽欧美 | 狠狠干干 | 国产亚洲无 | 国产综合在线观看视频 | 精品久久福利 | 美女视频网 | 国产在线成人 | 欧美精品在线一区二区 | 91天天操| 美女视频黄在线 | 日日精品 | 久精品在线观看 | 国产小视频你懂的在线 | 五月婷在线播放 | 久久丁香| 色噜噜在线观看视频 | 97在线观看视频免费 | 亚洲在线免费视频 | 久久精品一区二区三区视频 | 国产成人久久久久 | 国产福利在线免费 | 福利一区二区三区四区 | 97成人精品视频在线观看 | 国产精品va在线观看入 | 天天爽天天搞 | 中文字幕av网站 | 国产精品一区二区免费看 | 最新av网址在线 | 国产综合视频在线观看 | 成人9ⅰ免费影视网站 | 欧美日韩精品在线免费观看 | 久久国产成人午夜av影院潦草 | 亚洲高清视频在线观看 | 久久99视频免费 | 久久亚洲综合国产精品99麻豆的功能介绍 | 黄色一级大片在线免费看产 | 伊人日日干 | 在线亚洲人成电影网站色www | 狠狠操狠狠干天天操 | 亚洲精品国偷拍自产在线观看蜜桃 | 91在线你懂的 | 亚洲 欧洲av | 天天综合网在线观看 | 免费观看成人av | av成人免费网站 | 国产一级做a爱片久久毛片a | 精品毛片在线 | 美女黄频免费 | 日韩二区三区在线 | 久久影视精品 | 91最新中文字幕 | 国产一区网址 | 手机在线看片日韩 | 亚洲精品小视频在线观看 | 免费看的黄网站软件 | 国产在线欧美日韩 | 欧美激情精品久久久久 | 欧美精品久久久久久久久久久 | 成人黄在线 | 久久久久久久网站 | 欧美色精品天天在线观看视频 | 九九免费精品视频 | 极品嫩模被强到高潮呻吟91 | 久久久久国产视频 | 亚洲91中文字幕无线码三区 | 久久一久久 | www久| 草免费视频 | 一本一道久久a久久综合蜜桃 | 婷婷精品国产一区二区三区日韩 | 国产破处视频在线播放 | 久久久久久毛片精品免费不卡 | 九九免费在线看完整版 | 国产精品久久久久婷婷 | 又长又大又黑又粗欧美 | 精品久久久久国产免费第一页 | 一区二区三区日韩在线观看 | 亚洲精品国产第一综合99久久 | 97综合视频 | 日本护士撒尿xxxx18 | 欧美黑吊大战白妞欧美 | av片在线看 | 九色91福利 | 国产一区二区三区四区大秀 | 18pao国产成视频永久免费 | 九九九视频在线 | 国产免费一区二区三区最新 | 天天曰夜夜操 | 草久久久久 | 香蕉视频网站在线观看 | 日韩欧美精品在线观看视频 | 午夜久操| 永久av免费在线观看 | 亚洲影视资源 | 天天色宗合 | 国产一区麻豆 | 91视频在线免费看 | 视频三区 | 国产 中文 日韩 欧美 | 91精品成人 | 免费国产ww | 欧美日韩国产一区二区三区在线观看 | 成人久久18免费网站麻豆 | 国产精品一区二区三区观看 | 亚洲另类视频在线 | 特级西西444www大精品视频免费看 | 婷婷5月色 | 日韩电影一区二区三区 | 97在线观看 | 久久精品一区二区三 | 久久久电影 | 国产专区精品视频 | 久久精品综合 | 伊人www22综合色 | 亚洲国产综合在线 | 精品久久久久久久久久久院品网 | 操久在线| 久久国产精品成人免费浪潮 | 69国产精品成人在线播放 | 日日爽日日操 | 欧美最猛性xxxxx免费 | 毛片在线播放网址 | 久国产在线播放 | 91网址在线 | 美女久久久久久 | av一级网站 | 天天婷婷 | 婷婷综合影院 | 国产日韩三级 | 黄色国产成人 | 国产一区二区三区在线免费观看 | 亚洲欧美日韩国产精品一区午夜 | 韩国av免费看 | 亚洲无人区小视频 | 国产二区视频在线观看 | 欧美a在线看 | 日韩在线观看视频免费 | 一区二区三区免费播放 | 亚洲日b视频 | 99国产精品久久久久久久久久 | 欧美日韩在线免费视频 | 亚洲国产日韩一区 | 久久久综合色 | 成人av网址大全 | se视频网址 | 国产精品美女久久久久久网站 | 欧美精品一区二区蜜臀亚洲 | 免费又黄又爽的视频 | 最新日韩视频 | 久久高清av | 天天操综| 黄色一及电影 | 成年人电影毛片 | 热精品| 欧美在线一 | 国产一级免费在线 | 日日日日 | 日韩中文字 | 一级黄色大片在线观看 | 91探花视频 | 国产老太婆免费交性大片 | 亚洲人人精品 | 色婷婷综合久久久中文字幕 | 99在线视频精品 | 天天射,天天干 | 中文字幕高清视频 | 久久久久久久久久久久久9999 | 麻豆国产在线播放 | 特黄特色特刺激视频免费播放 | 国产婷婷一区二区 | 亚洲精选99 | 欧美国产视频在线 | 久久综合中文色婷婷 | 中文字幕在线久一本久 | 国产高清在线观看 | 精品久久久久免费极品大片 | 爱爱av网| 成人精品久久 | 欧美国产亚洲精品久久久8v | 视频在线观看国产 | 欧美久久久影院 | 99视频在线免费播放 | 亚洲人人精品 | 中文字幕在线观看免费观看 | 日韩欧美高清视频在线观看 | 日韩深夜在线观看 | 91最新网址在线观看 | 日韩精品欧美精品 | 精品国产自 | 操天天操 | 午夜色大片在线观看 | 久久综合精品国产一区二区三区 | 在线国产小视频 | 国产精品久久在线 | 国产午夜精品在线 | 麻豆视频国产 | 午夜视频在线观看一区二区三区 | 99精品一区二区三区 | 在线成人看片 | 亚州国产精品 | 免费看片成年人 | 成人午夜电影久久影院 | 国内精品小视频 | 欧美福利网站 | 一区二区三区在线看 | 欧洲高潮三级做爰 | 午夜91在线| 欧美资源在线观看 | 日韩免费一区 | 久久爱影视i | 国产视频久久久久 | 五月婷婷av在线 | 免费观看www小视频的软件 | 久久久在线观看 | 91黄色小视频 | 亚洲成熟女人毛片在线 | 久久国产精品视频 | 国产精品初高中精品久久 | 午夜精品久久久久久久久久久久 | 久久高视频 | 免费福利在线播放 | 中文字幕 国产 一区 | 精品一区二区三区香蕉蜜桃 | 三级黄在线 | 欧美精品一区二区蜜臀亚洲 | 中文字幕超清在线免费 | 天天夜夜狠狠操 | 在线观看午夜 | 国产中文字幕91 | 国产永久网站 | 天天干天天上 | 久草在线91 | 四虎永久免费网站 | 91av久久| 激情动态 | 亚洲日韩欧美一区二区在线 | 亚洲精品乱码久久久一二三 | 不卡av在线免费观看 | 国产一级在线看 | 国产成人精品电影久久久 | 中文字幕在线免费看线人 | 九九免费在线视频 | 成人污视频在线观看 | 一区二区三区免费在线 | www夜夜操com | 综合激情伊人 | 国产在线观看网站 | 婷婷六月激情 | 2019中文字幕网站 | 欧美日本三级 | 色综合久久久久综合体桃花网 | 中文字幕韩在线第一页 | 国产精品欧美久久久久久 | 天天射网站| 黄色免费观看视频 | 天天干人人干 | 99色视频在线 | 最新国产精品拍自在线播放 | 国产精品国产精品 | av片一区二区| 在线免费观看亚洲视频 | 亚洲成人精品av | 欧美激情精品久久久 | 天天操夜夜操国产精品 | 在线欧美国产 | 欧美性免费 | 精品国产欧美 | 婷婷综合成人 | 伊人亚洲综合网 | 97超碰人人看 | 色综合天天狠天天透天天伊人 | 国产小视频在线观看 | 黄色亚洲大片免费在线观看 | 精品久久九九 | 欧美少妇xx | 亚洲精品tv久久久久久久久久 | 在线免费黄网站 | 午夜天使| 91精品看片| 亚洲视频999 | 久久香蕉影视 | 久久久精品日本 | 午夜视频久久久 | 国产99久久精品一区二区永久免费 | 久草在线在线视频 | 亚洲精品久久激情国产片 | 亚洲欧美视频在线播放 | 日韩在线 一区二区 | www.色com| 国产精品福利在线播放 | 色婷婷狠狠五月综合天色拍 | 超碰在线日本 | 婷婷丁香自拍 | 国产成人专区 | 97超碰人人澡人人爱学生 | 九草在线视频 | 亚洲欧美国产精品 | 日本资源中文字幕在线 | a极黄色片| 亚洲精品美女免费 | 欧美激情第一区 | 91激情视频在线播放 | 欧美片一区二区三区 | 亚洲成人家庭影院 | 狠狠五月婷婷 | 在线香蕉视频 | 亚洲乱亚洲乱亚洲 | 最近免费中文视频 | 久久免费福利视频 | h动漫中文字幕 | 成人在线电影观看 | 国产伦精品一区二区三区高清 | 国产一区二区三区免费观看视频 | 成人在线一区二区三区 | 亚洲精品在线一区二区三区 | 天天看天天操 | 久久精品99北条麻妃 | 亚洲天堂精品 | 美腿丝袜一区二区三区 | 免费av大全 | 亚洲一区日韩 | 国产午夜精品视频 | 免费又黄又爽的视频 | 777xxx欧美| 欧美不卡视频在线 | 91插插插免费视频 | 久久国产精品免费一区 | 天天干天天干天天操 | 亚洲精品在线一区二区三区 | 天堂va在线高清一区 | 在线观看av免费观看 | av永久网址 | 99视频在线观看免费 | 国产精品成人免费一区久久羞羞 | 久久xx视频| 日韩在线视频网址 | 狠狠躁夜夜躁人人爽超碰91 | 亚洲一区二区三区毛片 | 二区三区在线视频 | 日韩av二区 | 麻豆精品视频在线观看免费 | 久久久亚洲网站 | 97精品久久 | 亚洲一区二区三区miaa149 | 天天操夜操视频 | 成年人免费在线播放 | 西西444www大胆高清图片 | 欧美精品久久久久久久 | 久草在线费播放视频 | 黄色小网站在线 | 亚洲国产成人在线 | 欧美午夜理伦三级在线观看 | 伊人天天色 | 婷婷色网站 | 欧美视频一区二 | 91视频成人免费 | 伊人久久一区 | 国产一级淫片免费看 | 日日噜噜噜噜夜夜爽亚洲精品 | 国产黄色理论片 | 欧美日本三级 | 毛片永久免费 | 伊人久久国产精品 | 中文字幕av免费在线观看 | 97色资源| 激情一区二区三区欧美 | 免费久久精品视频 | 久草电影免费在线观看 | 日本韩国在线不卡 | 欧美日本在线视频 | 黄色毛片电影 | 日韩二区三区在线 | 香蕉视频国产在线 | 国产在线免费 | 国产欧美中文字幕 | 国产一区黄色 | www.色午夜| 色资源中文字幕 | 成人黄色在线视频 | 久草在线免费资源 | 97超碰人人澡人人 | 久久国产精品视频 | 成人av电影免费在线播放 | 精品影院一区二区久久久 | 欧美激情视频一区二区三区 | 久久人91精品久久久久久不卡 | 国产精品久久久久久久久久久免费 | 激情大尺度视频 | 亚洲成av人片在线观看无 | 中文在线a在线 | 欧美日韩在线第一页 | 中文字幕亚洲精品日韩 | 丁香六月网 | 亚洲不卡123 | 天天色天天搞 | 亚洲欧美日韩中文在线 | 午夜av一区二区三区 | 三级在线视频观看 | 日本99久久 | 亚洲欧洲精品视频 | 国产视频精选 | 一区中文字幕 | 亚洲精品在线看 | av片无限看| 久久精品欧美一 | 国产亚洲精品女人久久久久久 | 成人黄色电影在线观看 | 午夜电影av| 一区二区在线电影 | 国产精品久久久777 成人手机在线视频 | 国产乱码精品一区二区蜜臀 | 欧美成人黄色片 | 久久精品国产亚洲a | 91免费观看网站 | 欧美小视频在线观看 | 天天操天天摸天天射 | 久久成人黄色 | 国产成人精品a | 国产91对白在线播 | 欧美日韩国产一二三区 | 色综合久久久久久久 | 国产无吗一区二区三区在线欢 | 精品亚洲一区二区三区 | av官网| 国产黄a三级三级三级三级三级 | 亚洲经典视频在线观看 | 国产在线播放一区 | 国产一区二区在线免费视频 | 中文电影网 | 狠狠色丁香久久婷婷综合五月 | 欧美精品亚洲精品日韩精品 | 中文字幕精品一区二区三区电影 | 亚洲精品福利在线观看 | 亚洲国产三级在线 | 国产成人在线免费观看 | 国产精品正在播放 | 五月天堂色 | 一区二区视频免费在线观看 | 国产精品嫩草影院123 | 人交video另类hd | 黄免费在线观看 | 亚洲女人天堂成人av在线 | 免费黄色av | 午夜av日韩 | 天天操天天添天天吹 | 丁香六月伊人 | 国产一区二区三区网站 | 国产精品18毛片一区二区 | 天天操月月操 | a在线观看国产 | 色综合天天干 | 91精品国| 欧美日韩高清 | 国产在线欧美日韩 | 亚洲四虎在线 | 狠狠的干 | 日韩av高潮| 久久国产精品久久久 | 亚洲一区美女视频在线观看免费 | 欧美激情精品久久久久久免费 | 久久久久这里只有精品 | 久久国产精品视频观看 | 成人国产电影在线观看 | 久久在线精品 | 免费三级大片 | 天天夜夜亚洲 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 久久久久久久毛片 | 中文字幕在线第一页 | 综合网中文字幕 | 超碰97在线资源站 | 欧美日韩高清一区二区三区 | 亚洲一区二区视频在线播放 | 亚洲天堂视频在线 | 成人免费看片98欧美 | 欧美日韩国内在线 | 精品久久久久久久久久 | 亚洲在线视频网站 | 99精品免费久久久久久日本 | 久久三级视频 | 四虎影视www | 亚洲激情精品 | 九色视频自拍 | 99久在线精品99re8热视频 | 在线亚洲天堂网 | 欧美日韩一区二区免费在线观看 | 成人免费视频在线观看 | 久久精品视频中文字幕 | 91大神在线观看视频 | 午夜成人免费电影 | 国产精品网红福利 | 国产欧美最新羞羞视频在线观看 | 欧美久久久久久久久中文字幕 | 国产精品一区二区果冻传媒 | 亚洲精品九九 | 97在线看片| a黄在线观看 | 国产玖玖在线 | 色噜噜在线观看 | 欧美日韩一区二区三区视频 | 五月天亚洲综合小说网 | 欧美一级黄色视屏 | 国产a国产a国产a | 亚洲精品三级 | 国产色综合 | 欧美国产日韩一区 | 草久草久 | 999国内精品永久免费视频 | 婷婷色影院 | 色中色资源站 | 特级a老妇做爰全过程 | 中文字幕国产在线 | 国产一级二级av | 色资源网免费观看视频 | 蜜臀av在线一区二区三区 | 三级av免费看 | 国产美女视频免费 | 久久精品免费观看 | 中文字幕二区在线观看 | 国产一级高清视频 | 亚洲欧美日韩一二三区 | 91插插影库 | 激情视频免费观看 | 麻豆视频在线免费看 | 日韩二区在线播放 | 免费黄色av电影 | 国产在线播放一区 | 深夜免费福利网站 | 黄色在线网站噜噜噜 | 天天se天天cao天天干 | 中文字幕日韩国产 | 天天操天天操天天操天天操天天操 | 草樱av| 99热9| 2019av在线视频 | 成人免费视频网站在线观看 | 免费观看www小视频的软件 | 成人黄色小视频 | 日韩性片 | 黄色一级大片在线免费看国产一 | 97看片 | 8x成人免费视频 | 国产性xxxx| 欧美精品亚洲二区 | 高清av在线免费观看 | 国产高清免费观看 | 天天射一射 | av资源网在线播放 | 久久激情视频免费观看 | 91免费观看 | 久久久久久看片 | 伊人成人精品 | 又黄又刺激视频 | 日韩精品免费在线观看视频 | 奇米影视777四色米奇影院 | 天天操天天谢 | 国产视频一 | 亚洲国产一二三 | 天无日天天操天天干 | 韩国精品视频在线观看 | 国产在线不卡一区 | 久久久久久久久久亚洲精品 | 久久久久久国产一区二区三区 | 九九综合久久 | 92国产精品久久久久首页 | 五月开心六月婷婷 | 久草在线在线视频 | 色综合久久悠悠 | 一区三区视频 | 99精品视频网站 | 亚洲国产精品成人综合 | 丝袜美腿在线视频 | 热re99久久精品国产66热 | 午夜视频免费播放 | 久色婷婷 | 国产精品乱码一区二区视频 | 在线性视频日韩欧美 | 97视频人人免费看 | 国产精品av在线 | 亚洲激情 在线 | 五月开心六月伊人色婷婷 | 久久免费中文视频 | 日日天天 | 韩国av免费观看 | 日韩av免费在线电影 | 国产精品久久久久久久久岛 | 国产精品久久久久国产精品日日 | 亚洲粉嫩av | 久久久美女 | 天天舔天天射天天操 | 国产网红在线观看 | 蜜桃视频日本 | 亚洲精品视频在线观看视频 | 久久网址 | 亚洲精品tv久久久久久久久久 | 毛片在线网 | 精品国产一二三四区 | 精品一区二区亚洲 | 中文字幕在线不卡国产视频 | 91免费版成人 | 中文字幕高清av | 免费日韩 精品中文字幕视频在线 | 国产成人亚洲在线观看 | 日韩在线视频国产 | 99c视频在线 | 91网页版免费观看 | 国产精品久久久久9999吃药 | 黄色三级免费片 | 91成人欧美| 欧美 国产 视频 | 国产精品免费观看国产网曝瓜 | 欧美国产日韩中文 | 久久高清毛片 | 国产美女精品在线 | 国产成人综合图片 | 高清国产午夜精品久久久久久 | 精品亚洲国产视频 | 国产一区私人高清影院 | 日韩精品视频在线观看免费 | 免费久草视频 | 欧美aa一级片 | 欧美一区日韩精品 | 天天操天天拍 | 亚洲另类在线视频 | 91av在线视频免费观看 | 中文字幕永久 | 99色在线| 韩国av电影在线观看 | 黄色av影视 | 国产精品第十页 | 九九视频热 | 国产专区视频 | 久久综合之合合综合久久 | 久久免费视频8 | 亚洲伦理一区 | 在线日韩精品视频 | 99国产免费网址 | 亚洲国产精品人久久电影 | 久久久久久久久久久久久国产精品 | 欧美激情精品久久久 | 中文字幕一区二区三区视频 | 高清不卡毛片 | www.久久成人 | 狠狠干 狠狠操 | 狠狠操操网| 亚洲精品午夜aaa久久久 | 国产精品国产三级国产aⅴ入口 | 日本不卡一区二区三区在线观看 | 国产网红在线观看 | 伊人伊成久久人综合网站 | 国产精品99久久久精品免费观看 | 中文字幕永久在线 | 九九在线视频免费观看 | 黄色片免费电影 | 成人动态视频 | 久草在线免 | 日日夜夜噜噜噜 | 91九色在线| 黄色美女免费网站 | 97视频免费在线看 | 免费视频91 | 免费开视频| 国产成人精品一区二区三区网站观看 | 高清一区二区三区 | 久久久久福利视频 | 毛片99 | 美女免费黄视频网站 | 成人欧美一区二区三区黑人麻豆 | 免费网址在线播放 | 久久久久久久福利 | 99久久99久久 | 欧洲精品二区 | 国产精品门事件 | 亚洲天堂精品视频 | 国产精品video | 欧美a级在线 | 久久国产精品视频免费看 | 黄色一级大片免费看 | 亚洲国产精品成人女人久久 | 成人av在线直播 | 18pao国产成视频永久免费 | 精品国产乱码久久久久久久 | 久青草影院 | 九九九热| 综合激情伊人 | 国产一区黄色 | 国产你懂的在线 | 亚洲精品久久久久久国 | 国产原创在线 | 久久久久久片 | 久草在线官网 | 国产亚洲精品成人av久久影院 | 国产91九色视频 | 国产精品99久久久久久小说 | 亚洲一级免费观看 | 激情图片区 | 久草资源在线观看 | 天天操天天干天天摸 | av免费试看| 看片网站黄色 | 久久免费高清视频 | 免费a网 | 国产精品99久久久久久大便 | 亚洲精品视频观看 | 国产美女精品视频免费观看 | 天天色影院| 97超碰人人澡人人爱学生 | 亚洲最新精品 | 日韩免费一级a毛片在线播放一级 | 超碰在线国产 | 日韩中文字幕在线 | 在线免费观看欧美日韩 | 免费a视频 | 久久理论视频 | 亚洲视频资源在线 | 久草视频在线观 | 亚洲综合小说电影qvod | 婷婷色 亚洲 | 日本韩国精品在线 | 国产第一页在线观看 | 成人全视频免费观看在线看 | 97在线观看免费高清完整版在线观看 | 色网站在线观看 | 国产成人av电影在线 | 久久免费视频99 | 黄色一级在线免费观看 | 亚洲欧美成人综合 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 欧美日韩在线精品 | 欧美午夜激情网 | 日本黄色a级大片 | 国产精品久久久久久久久免费 | 特级毛片网站 | 日韩肉感妇bbwbbwbbw | 国产一区二区视频在线 | 中文字幕视频一区 | 久久久免费观看 | a级黄色片视频 | 91av中文字幕 | 国产精品18久久久久白浆 | 久久精品视频网站 | 丁香花在线视频观看免费 | 毛片永久新网址首页 | 激情一区二区三区欧美 | 欧美日韩中文另类 | 国产精品午夜久久久久久99热 | 你操综合 | 欧美日一级片 | 国产成人精品免费在线观看 | 中文字幕免 | 美女免费视频黄 | 精品国产成人在线 | 精品一区二区精品 | 国产丝袜在线 | 久久婷婷丁香 | 久久99网站 | 欧美日韩在线观看一区二区 | 久草在线免费色站 | 日韩三级久久 | 久久免费视频国产 | 国产精品毛片久久久久久久久久99999999 | 麻花豆传媒一二三产区 | 久久a国产 | 久草爱视频 | 日韩欧美视频一区二区 | 在线免费黄色av | 97超碰在线免费观看 | 草久热 | 伊人久久五月天 | 毛片网在线播放 | 亚洲一区动漫 | 人成在线免费视频 | 日本中文字幕电影在线免费观看 | 五月婷婷.com | 九九热在线精品 | 99久久激情 | 精品国产乱码 | 久久1电影院 | 99视频免费看 | 黄色特级毛片 | 亚洲国产精品成人综合 | 久久99精品波多结衣一区 | 日本久久电影网 | 国偷自产视频一区二区久 | 日韩欧美一区二区在线播放 | 91精品国产亚洲 | 国产精品美女久久久久久2018 | 欧美日韩免费观看一区二区三区 | 亚洲不卡123| 天天插天天操天天干 | 亚洲一区精品二人人爽久久 | 欧美色婷 | 91九色国产视频 | 亚洲国产精品影院 | 国产精品亚 | 国产精品原创视频 | 欧美成人在线免费 | 欧美日韩一区二区在线观看 | 在线看成人 | 五月婷香 | 天天爽夜夜爽人人爽一区二区 | 久久精品99久久久久久 | 国产色久| 亚洲精品免费播放 | 国产精品久久久久久999 | 激情综合一区 | 亚洲视频 一区 | 五月天中文字幕 | 欧美精品中文 | 久久成人午夜视频 | 免费男女羞羞的视频网站中文字幕 | av成人亚洲| 精品视频资源站 | 国产一区二三区好的 | 一区二区三区不卡在线 | 国产视频亚洲视频 | 国产精品国产三级国产aⅴ入口 | 黄色av电影在线 | 国内精品久久久久久 | 天天干天天拍天天操天天拍 | 91黄色在线观看 | 国产精品视频永久免费播放 | 国产成人av在线影院 | 日韩在线视频国产 | 日韩视频在线不卡 | 亚洲国产免费 | 97av在线视频 | 日日夜夜精品视频天天综合网 | 五月av在线 | 久久久久久久久久久网 | av夜夜操 | 欧美一级视频免费 | 亚洲精品一区二区三区高潮 | 亚洲精品在线一区二区三区 | 成人一区二区三区在线观看 | 人人爱人人爽 | 日韩黄色软件 | 精品福利视频在线观看 | 91 在线视频 | 一区二区欧美日韩 | 欧美不卡视频在线 | 国产黄色片免费看 | av怡红院| 久久在线观看视频 | 美女一级毛片视频 | 手机看片久久 | 在线观看国产区 | 亚洲天堂色婷婷 | 超碰人人99| 久久高清 | 成人午夜片av在线看 | 狠狠干夜夜操 | 国产 日韩 中文字幕 | 黄色的网站在线 | 在线免费观看黄色小说 | 香蕉手机在线 | 五月色综合 | 日韩午夜在线观看 | 六月丁香综合 | a级片久久| 日本精品在线视频 | 国产精品理论片在线播放 | 国产在线最新 | 啪啪肉肉污av国网站 | 少妇高潮流白浆在线观看 | 91社区国产高清 | 精品自拍网 | 日本中文字幕免费观看 | www黄色软件| 日韩av中文| 特级a老妇做爰全过程 | 999一区二区三区 | 久久系列 | 国产亚洲人 | 亚洲一级片在线看 | .国产精品成人自产拍在线观看6 | 国产成人在线精品 | 丁香婷婷综合激情五月色 | 麻豆91在线 | 免费在线精品视频 | 黄免费网站| 久久理论电影网 | 日日夜色 | 欧美日韩国产精品一区二区 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 成人中文字幕av | 久久精品中文字幕一区二区三区 | av久久在线 | 成年人免费在线看 | 四虎5151久久欧美毛片 | 久久免费资源 | 国产不卡av在线 | 91麻豆精品国产午夜天堂 | 激情五月婷婷综合网 | 国产精品videoxxxx | 四虎国产免费 | 久久成人一区二区 | 日韩精品在线看 | 久久国精品 | 国产一区二区三区四区在线 | 日本激情视频中文字幕 | 日本动漫做毛片一区二区 | 国产欧美精品一区二区三区四区 | 天天伊人狠狠 | 综合av在线 | 亚洲人在线7777777精品 | 又黄又刺激视频 | 国产69精品久久久久99尤 | 国产一区在线观看视频 | 成人在线网站观看 | av线上看 | 91精品1区 | 国产精品麻豆一区二区三区 | 国产色视频网站2 | 精品国产一区二区三区在线观看 | 免费黄在线观看 | 亚洲精品观看 | 最新超碰| 91热| 丝袜+亚洲+另类+欧美+变态 | 7777精品伊人久久久大香线蕉 | 一区二区在线电影 | 91黄站| 国产区av在线 | 免费情趣视频 | 夜夜爽www| 久久久久久久久毛片精品 | 日本最新中文字幕 | 一区二区三区中文字幕在线观看 | 国产99久久99热这里精品5 | 久久久久亚洲国产精品 | 91精品视频免费 | 久久综合给合久久狠狠色 | 黄色成人小视频 | 91精品日韩| 久久久在线观看 | 91麻豆国产福利在线观看 | 久久精精品视频 | 国产精品一区二区三区久久 | 亚洲黄色影院 | 亚洲国产高清在线 | 五月天色中色 | 97国产小视频 | 97精品国自产拍在线观看 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 一区二区不卡视频在线观看 | 91在线免费观看网站 | 娇妻呻吟一区二区三区 | 永久免费毛片 | 黄色.com| 99在线热播 | 中文字幕中文字幕 |