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

5個步驟將隨機React應用程序轉換為微前端

開發 前端
我們在實際代碼中修改了Came的示例。無論如何,這是我們使用的基礎?;诖耍覀兛梢韵蚰故救绾螌贸绦蜣D換為微前端。

什么是微型前端方法?微前端術語首先在2016年11月的思想技術雷達中提出來。它將微服務的概念擴展到前端開發。

該方法是通過分解應用功能來將基于瀏覽器的代碼拆分為微前端。通過制作較小且特征為中心的CodeBases,我們實現了解耦的軟件開發目標。

雖然Codebases已經解耦,但用戶體驗是連貫的。此外,每個代碼庫都可以獨立實現,升級,更新和部署。

這是微前端的天堂。無論框架和版本如何,javascript應用程序都由容器啟動。這些應用程序,遺留和新的,無縫地一起工作,并類似于一個應用程序。

在我們的示例中,我們將解決更簡單的React微型前端的情況。

在建立發起React應用程序的微型前端容器的前程工作

此容器需要具有啟動隨機反應應用程序的能力,而不知道許多細節。此外,由于微前端的概念,這層需要很薄,商業邏輯很少。

幸運的是,Cam Jackson公布了他的微觀前端工作,讓我們采用。他的工作在這個地點可以獲得:

  • 容器:微前端演示的入口點和容器應用。
  • 用于瀏覽餐館的微型前端:瀏覽。
  • 從餐廳訂購食物的微型前端:餐廳訂購。
  • 內容服務器:將靜態內容存儲微前端演示的位置。

這是微型前端工作的工作流程:

  • 啟動內容服務器。
  • 在特定端口啟動瀏覽和餐廳訂購應用程序。
  • 基于URL,容器將路線到其中一個微型前端。
  • 所選的Micro前端轉到特定端口以獲取應用程序的資產清單.JSON。從此JSON文件中,包含的main.js置于腳本標記并加載。

清單文件包含對其相應的輸出文件的所有資產文件名的映射,以便在不必解析index.html的情況下可以選擇它。該容器的核心是以下Microfrontend.js:

  1. import React from 'react'; 
  2.  
  3. class MicroFrontend extends React.Component { 
  4.   componentDidMount() { 
  5.     const { name, host, document } = this.props; 
  6.     const scriptId = `micro-frontend-script-${name}`; 
  7.  
  8.     if (document.getElementById(scriptId)) { 
  9.       this.renderMicroFrontend(); 
  10.       return; 
  11.     } 
  12.  
  13.     fetch(`${host}/asset-manifest.json`) 
  14.       .then(res => res.json()) 
  15.       .then(manifest => { 
  16.         const script = document.createElement('script'); 
  17.         script.id = scriptId
  18.         script.crossOrigin = ''
  19.         script.src = `${host}${manifest['main.js']}`; 
  20.         script.onload = this.renderMicroFrontend; 
  21.         document.head.appendChild(script); 
  22.       }); 
  23.   } 
  24.  
  25.   componentWillUnmount() { 
  26.     const { name, window } = this.props; 
  27.  
  28.     window[`unmount${name}`](`${name}-container`); 
  29.   } 
  30.  
  31.   renderMicroFrontend = () => { 
  32.     const { name, window, history } = this.props; 
  33.  
  34.     window[`render${name}`](`${name}-container`, history); 
  35.   }; 
  36.  
  37.   render() { 
  38.     return <main id={`${this.props.name}-container`} />
  39.   } 
  40.  
  41. MicroFrontend.defaultProps = { 
  42.   document, 
  43.   window, 
  44. }; 
  45.  
  46. export default MicroFrontend; 

 

第13到22行包含要啟動微型前端的代碼。通常,微前端之間沒有通信,并且容器與微前端之間的通信有限。

通常,它是從容器到微前端的一種方式。在這里,第34行通過ContainerID和歷史,因為它的微前端待呈現如下:

  1. ReactDOM.render(<App history={history} />,  
  2.     document.getElementById(containerId)); 

第18行將腳本的Crondorigin值設置為空,這相當于匿名。這意味著元素的請求將使其模式設置為CORS及其憑據模式設置為相同原點。

我們在實際代碼中修改了Came的示例。無論如何,這是我們使用的基礎?;诖?,我們可以向您展示如何將應用程序轉換為微前端。

5個步驟將隨機反應應用程序轉換為微前端

我們為隨機反應應用程序的選擇是創建React應用程序。將其變成微前端需要五個步驟。

關于Facebook的皇冠珠寶應用程序的許多原則都在創建React應用程序的10個有趣的事實中描述。在本文中,我們強調應用這些原則。

第1步:修改package.json以設置端口并使用“React-App-Rewifire”

  1.   "name": "my-app", 
  2.   "version": "0.1.0", 
  3.   "private": true, 
  4.   "dependencies": { 
  5.     "@testing-library/jest-dom": "^4.2.4", 
  6.     "@testing-library/react": "^9.4.0", 
  7.     "@testing-library/user-event": "^7.2.1", 
  8.     "react": "^16.12.0", 
  9.     "react-dom": "^16.12.0", 
  10.     "react-scripts": "3.4.0", 
  11.     "react-app-rewired": "2.1.5" 
  12.   }, 
  13.   "scripts": { 
  14.     "start": "PORT=4000 react-app-rewired start", 
  15.     "build": "react-app-rewired build", 
  16.     "test": "react-app-rewired test", 
  17.     "eject": "react-scripts eject" 
  18.   }, 
  19.   "eslintConfig": { 
  20.     "extends": "react-app" 
  21.   }, 
  22.   "browserslist": { 
  23.     "production": [ 
  24.       ">0.2%", 
  25.       "not dead", 
  26.       "not op_mini all" 
  27.     ], 
  28.     "development": [ 
  29.       "last 1 chrome version", 
  30.       "last 1 firefox version", 
  31.       "last 1 safari version" 
  32.     ] 
  33.   } 
  • 在第12行中,添加react-app-rewired作為依賴項,這允許在不彈出它的情況下自定義應用程序。
  • 在第15行中,應用程序的啟動端口已從默認端口3000更改為所選的4000 - 這避免了由于容器本身在端口3000上運行以來端口沖突。
  • 從15號線到第17行,反應腳本由Reft-App-Rewifired替換。

使用新端口,創建React應用程序顯示UI如下所示。(我們欺騙了一點。使用React-App-Rewired需要在應用程序運行之前更改步驟2。)

步驟2:使用config-overrides.js禁用代碼拆分

默認情況下,啟用代碼拆分。應用程序分為多個可以獨立加載到頁面上的塊。

http:// localhost:4000 / asset-manifest.json 顯然顯示該應用程序已被捆綁。

此加載優化會導致掛載和卸載Micro Front-Ender的問題。我們需要通過創建或編輯config-overrides.js來禁用塊,如下所示:

  1. module.exports = { 
  2.   webpack: (config, env) => { 
  3.     config.optimization.runtimeChunk = false
  4.     config.optimization.splitChunks = { 
  5.       cacheGroups: { 
  6.         default: false, 
  7.       }, 
  8.     }; 
  9.     return config; 
  10.   }, 
  11. }; 

之后,http:// localhost:4000 / asset-manifest.json顯示沒有塊。

如果未從Create React應用程序生成React應用程序,則可以通過修改WebPack配置來完成步驟1和步驟2。

如果使用我們的改進的MicroFrontend.js,則不必在步驟1中使用React-App-Rewifirew,并且可以完全跳過步驟2。5步減少到3.5。詳細信息描述于“您不必對微前端丟失優化”中。

此保存在此回購的ChunkOptimization分支中捕獲。

第3步:在SRC / index.js中進行更改以定義渲染和卸載功能

讓我們來看看瀏覽Micro前端的SRC / index.js:

  1. import 'react-app-polyfill/ie11'; 
  2. import React from 'react'; 
  3. import ReactDOM from 'react-dom'; 
  4. import App from './App'; 
  5. import { unregister } from './registerServiceWorker'; 
  6.  
  7. window.renderBrowse = (containerId, history) => { 
  8.   ReactDOM.render( 
  9.     <App history={history} />
  10.     document.getElementById(containerId), 
  11.   ); 
  12.   unregister(); 
  13. }; 
  14.  
  15. window.unmountBrowse = containerId => { 
  16.   ReactDOM.unmountComponentAtNode(document.getElementById(containerId)); 
  17. }; 

window.RenderBrowse和window.unmountBrowse定義。這些方法由容器的Microfrontend.js調用。需要為Create React應用程序的SRC / index.js 定義類似的方法。

  1. import React from 'react'; 
  2. import ReactDOM from 'react-dom'; 
  3. import './index.css'; 
  4. import App from './App'; 
  5. import * as serviceWorker from './serviceWorker'; 
  6.  
  7. // render micro frontend function 
  8. window.renderCreatereactapp = (containerId, history) => { 
  9.   ReactDOM.render( 
  10.     <App history={history}/>
  11.     document.getElementById(containerId) 
  12.   ); 
  13.   serviceWorker.unregister(); 
  14. }; 
  15.  
  16. // unmount micro frontend function 
  17. window.unmountCreatereactapp = containerId => { 
  18.   ReactDOM.unmountComponentAtNode(document.getElementById(containerId)); 
  19. }; 
  20.  
  21. // Mount to root if it is not a micro frontend 
  22. if (!document.getElementById('Createreactapp-container')) { 
  23.   ReactDOM.render(<App />, document.getElementById('root')); 
  24.  
  25. // If you want your app to work offline and load faster, you can change 
  26. // unregister() to register() below. Note this comes with some pitfalls. 
  27. // Learn more about service workers: https://bit.ly/CRA-PWA 
  28. serviceWorker.unregister(); 

從第7行到第19行,窗口.RenderCreateActApp和Window.unmountCreaterActApp正在添加。

第23線變為條件。如果它是一個獨立的應用程序,它將被呈現為根元素。如果它是一個微型前端,它將通過window.rendercreateActapp呈現給ContainID。

第4步:使用src / setupproxy.js設置CORS規則

在Web瀏覽器中啟動Micro前端時,我們獲得了CORS錯誤:

  1. Access to fetch at ‘http://localhost:4000/asset-manifest.json' from origin ‘http://localhost:3000' has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled. 

必須通過創建或編輯src / setupproxy.js來設置以下代理。

  1. module.exports = app => { 
  2.   app.use((req, res, next) => { 
  3.     res.header('Access-Control-Allow-Origin', '*'); 
  4.     next(); 
  5.   }); 
  6. }; 

在進行第5步之前,我們為容器做了一些額外的工作。

在.env文件中,需要添加新的Host

React_App_CreateActApp_Host。端口4000需要匹配創建React App正在運行的Real Port。

  1. REACT_APP_BROWSE_HOST=http://localhost:3001 
  2. REACT_APP_RESTAURANT_HOST=http://localhost:3002 
  3. REACT_APP_CREATEREACTAPP_HOST=http://localhost:4000 
  4. REACT_APP_CONTENT_HOST=http://localhost:5000 

需要對.env.生產需要做類似的變化:

  1. REACT_APP_BROWSE_HOST=https://browse.demo.microfrontends.com 
  2. REACT_APP_RESTAURANT_HOST=https://order.demo.microfrontends.com 
  3. REACT_APP_CREATEREACTAPP_HOST=https://createreactapp.demo.microfrontends.com 
  4. REACT_APP_CONTENT_HOST=https://content.demo.microfrontends.com 

在App Header.is中添加導航鏈接,以使UI可訪問。這是可選的。

  1. import React from 'react'; 
  2. import { NavLink } from 'react-router-dom'; 
  3. import './AppHeader.css'; 
  4.  
  5. const AppHeader = () => ( 
  6.   <header> 
  7.     <div className="center-column"> 
  8.       <h1> Feed me</h1> 
  9.     </div> 
  10.     <nav> 
  11.       <ol className="center-column"> 
  12.         <li> 
  13.           <NavLink to="/">Browse restaurants</NavLink> 
  14.         </li> 
  15.         <li> 
  16.           <NavLink to="/random">Surprise me</NavLink> 
  17.         </li> 
  18.         <li> 
  19.           <NavLink to="/createreactapp">Create React App</NavLink> 
  20.         </li> 
  21.         <li> 
  22.           <NavLink to="/about">About</NavLink> 
  23.         </li> 
  24.       </ol> 
  25.     </nav> 
  26.   </header> 
  27. ); 
  28.  
  29. export default AppHeader; 

將CreateAteActApp及其路由添加到Container的App.js中:

  1. import React from 'react'; 
  2. import { BrowserRouter, Switch, Route, Redirect } from 'react-router-dom'; 
  3. import AppHeader from './AppHeader'; 
  4. import MicroFrontend from './MicroFrontend'; 
  5. import About from './About'; 
  6.  
  7. const { 
  8.   REACT_APP_BROWSE_HOST: browseHost, 
  9.   REACT_APP_RESTAURANT_HOST: restaurantHost, 
  10.   REACT_APP_CREATEREACTAPP_HOST: createreactappHost, 
  11. } = process.env; 
  12.  
  13. let numRestaurants = 0
  14. fetch(`${process.env.REACT_APP_CONTENT_HOST}/restaurants.json`) 
  15.   .then(res => res.json()) 
  16.   .then(restaurants => { 
  17.     numRestaurants = restaurants.length; 
  18.   }); 
  19. const getRandomRestaurantId = () => 
  20.   Math.floor(Math.random() * numRestaurants) + 1; 
  21.  
  22. const Browse = ({ history }) => ( 
  23.   <MicroFrontend history={history} host={browseHost} name="Browse" /> 
  24. ); 
  25. const Restaurant = ({ history }) => ( 
  26.   <MicroFrontend history={history} host={restaurantHost} name="Restaurant" /> 
  27. ); 
  28. const Createreactapp = ({ history }) => ( 
  29.   <MicroFrontend history={history} host={createreactappHost} name="Createreactapp" /> 
  30. ); 
  31. const Random = () => <Redirect to={`/restaurant/${getRandomRestaurantId()}`} />
  32.  
  33. const App = () => ( 
  34.   <BrowserRouter> 
  35.     <React.Fragment> 
  36.       <AppHeader /> 
  37.       <Switch> 
  38.         <Route exact path="/" component={Browse} /> 
  39.         <Route exact path="/restaurant/:id" component={Restaurant} /> 
  40.         <Route exact path="/createreactapp" component={Createreactapp} /> 
  41.         <Route exact path="/random" render={Random} /> 
  42.         <Route exact path="/about" render={About} /> 
  43.       </Switch> 
  44.     </React.Fragment> 
  45.   </BrowserRouter> 
  46. ); 
  47.  
  48. export default App; 

現在讓我們試著展示我們的微型前端。

  • 內容服務器:NPM啟動。
  • 瀏覽Micro前端:NPM開始。
  • 餐廳訂購微型前端:NPM開始。
  • Create React App Micro前端:NPM開始。
  • 容器:NPM開始。

轉到localhost:3000 / createActapp來啟動頁面。

哎呀,React spinning 日志在哪里?

讓我們重新審視http:// localhost:4000 / asset-manifest.json。Micro前端的徽標是一個單獨的文件:

  1.   "files": { 
  2.     "main.js": "/static/js/bundle.js", 
  3.     "main.js.map": "/static/js/bundle.js.map", 
  4.     "index.html": "/index.html", 
  5.     "static/media/logo.svg": "/static/media/logo.5d5d9eef.svg" 
  6.   }, 
  7.   "entrypoints": [ 
  8.     "static/js/bundle.js" 
  9.   ] 

我們忘了抓住它!

查看此徽標SVG文件的來源,該文件被設置為/static/media/logo.5d5d9eef.svg。此文件可在Create React App(HTTPS:// localhost:4000)中使用,但不在容器中(http:// localhost:3000)。

這是我們的最后一步。

步驟5:在.env文件中配置內容主機并將其用來前綴靜態內容

創建或編輯.env以設置內容主機:

  1. REACT_APP_CONTENT_HOST=http://localhost:4000 

當Micro前端使用靜態內容時,它需要在HTML中的%React_App_Content_host%前綴,并在JavaScript中的

Process.env.reacect_app_content_host。

在這里,我們在src / app.js中更改了第9行:

  1. import React from 'react'; 
  2. import logo from './logo.svg'; 
  3. import './App.css'; 
  4.  
  5. function App() { 
  6.   return ( 
  7.     <div className="App"> 
  8.       <header className="App-header"> 
  9.         <img src={`${process.env.REACT_APP_CONTENT_HOST}${logo}`} className="App-logo" alt="logo" /> 
  10.         <p> 
  11.           Edit <code>src/App.js</code> and save to reload. 
  12.         </p> 
  13.         <a 
  14.           className="App-link" 
  15.           href="https://reactjs.org" 
  16.           target="_blank" 
  17.           rel="noopener noreferrer" 
  18.         > 
  19.           Learn React 
  20.         </a> 
  21.       </header> 
  22.     </div> 
  23.   ); 
  24.  
  25. export default App; 

使用此更改,徽標SVG文件以http:// localhost:4000前綴。

該應用程序現在正常工作。

原文鏈接:

https://betterprogramming.pub/5-steps-to-turn-a-random-react-application-into-a-micro-frontend-946718c147e7

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2022-02-15 09:36:13

容器應用程序云服務

2021-10-19 10:15:06

微軟Windows 11Windows

2020-03-31 22:09:01

React應用程序

2020-10-14 15:05:02

React應用程序

2011-08-10 09:31:33

開發iPhone應用程

2010-08-13 13:05:30

Flex應用程序

2021-07-14 17:39:46

ReactRails API前端組件

2022-03-14 08:54:04

NetlifyHTMLReact

2017-11-10 14:00:39

Riverbed應用程序網絡性能

2021-09-04 17:26:31

SpringBoot轉換器參數

2020-10-10 10:30:31

JavaScript開發技術

2022-07-19 16:59:25

安全漏洞Web

2022-09-25 00:07:18

Python圖形界面

2012-11-01 11:34:31

IBMdw

2009-07-29 10:24:52

HTM轉換為PDF

2011-09-02 09:51:59

HTML 5

2011-06-02 09:09:00

2020-03-20 19:37:03

JavascriptWeb前端

2018-10-12 10:51:15

LinuxChromebook應用程序

2021-12-24 16:59:14

前端Web框架
點贊
收藏

51CTO技術棧公眾號

www.男人天堂网| 国产高清在线不卡| 美国黄色一级视频| 超碰在线视屏| 国产午夜精品久久| 国产精品综合久久久| 四虎精品免费视频| 国产精品香蕉| 欧美日精品一区视频| 手机看片日韩国产| 四虎影视精品成人| 美美哒免费高清在线观看视频一区二区 | 国产精品久久乐| 亚洲猫色日本管| 久久五月天婷婷| 91精品国自产| 国产毛片一区| 久久视频在线直播| 麻豆av免费观看| 九九九九九九精品任你躁| 午夜精品123| 在线天堂一区av电影| 天天操天天干天天爽| 麻豆成人综合网| 18性欧美xxxⅹ性满足| 三级黄色录像视频| 九九视频精品全部免费播放| 337p亚洲精品色噜噜| 久久久999视频| 亚洲制服国产| 中文字幕av一区二区三区高 | 一级特黄aa大片| 日韩视频不卡| 九九热精品在线| 一级黄色片网址| 亚洲精品进入| 精品福利av导航| 手机av在线网| 91欧美精品| 色伊人久久综合中文字幕| 轻点好疼好大好爽视频| 最新国产在线观看| 久久综合资源网| 国产一级二级三级精品| 国产成人精品a视频| 日本怡春院一区二区| 午夜精品一区二区三区视频免费看| 五月婷婷欧美激情| 伊人成综合网yiren22| 亚洲护士老师的毛茸茸最新章节| 亚洲制服中文字幕| 白嫩亚洲一区二区三区| 欧美日韩一区二区三区免费看| koreanbj精品视频一区| 久久99亚洲网美利坚合众国| 亚洲视频精选在线| 一区二区三区我不卡| 99中文字幕一区| 国产婷婷色一区二区三区在线| 久久久婷婷一区二区三区不卡| 亚洲精品喷潮一区二区三区| 国产一区高清在线| 亚洲一区二区三区成人在线视频精品 | 免费成人高清在线视频theav| 精品国产区一区| 成年女人免费视频| 国产乱人伦精品一区| 亚洲第一精品福利| 欧美大片免费播放器| 羞羞答答一区二区| 亚洲欧美综合另类中字| 先锋影音av在线| 国产高清久久| 欧美另类暴力丝袜| 日本一级淫片色费放| 久久不射2019中文字幕| 国产成人综合精品在线| 在线观看视频二区| 国产精品一区二区在线看| 91免费在线观看网站| 熟妇高潮一区二区高潮| 久久久久久97三级| 日本丰满少妇黄大片在线观看| 欧美xxxx做受欧美88bbw| 精品国产乱码久久久久久婷婷| 日韩精品 欧美| 天堂中文在线播放| 欧洲av在线精品| 亚洲色图欧美自拍| 国产成人精品福利| 亚洲另类图片色| 日韩在线观看免| 国产精品jizz在线观看美国| 午夜精品在线观看| 亚洲图片欧美日韩| 极品销魂美女一区二区三区| 高清国产一区| 国产人成在线观看| 又紧又大又爽精品一区二区| 色欲色香天天天综合网www| 午夜精品成人av| 91精品欧美一区二区三区综合在| 不许穿内裤随时挨c调教h苏绵| 欧美电影在线观看免费| 中文字幕亚洲一区| 久久综合色综合| 水野朝阳av一区二区三区| 91精品久久久久久| 日本高清视频免费观看| 国产三级一区二区| 大胆欧美熟妇xx| 成人在线网站| 亚洲成人中文字幕| 熟女av一区二区| 在线综合欧美| 91免费高清视频| 男人的天堂在线免费视频| 国产精品国模大尺度视频| 3d动漫一区二区三区| 欧美a视频在线| 亚洲女人初尝黑人巨大| 久久久精品国产sm调教网站| 久久综合影音| 国产精品视频免费观看| 欧美激情办公室videoshd| 欧美色视频日本版| 少妇欧美激情一区二区三区| 日本一区二区在线看| 777午夜精品福利在线观看| av在线亚洲天堂| 久久久国产午夜精品| 国内少妇毛片视频| 成人日韩视频| 日韩在线欧美在线| 无码人妻精品一区二区50| 成人av在线一区二区三区| 永久久久久久| 澳门av一区二区三区| 亚洲成人av在线播放| 黄色一级片中国| 六月婷婷色综合| 日本一区二区三区四区在线观看 | www.成人黄色| 欧美日韩中字| 国产精品久久久久久久久久99| 四季av日韩精品一区| 综合久久国产九一剧情麻豆| 精品久久久久久久无码| 在线成人动漫av| 欧美伊久线香蕉线新在线| 日本黄色一区二区三区| 一区二区成人在线视频| 中文字幕第六页| 日韩欧美网站| 成人网址在线观看| 婷婷五月在线视频| 欧美日韩卡一卡二| 青青青视频在线播放| 日韩电影在线看| 欧美久久在线| 新片速递亚洲合集欧美合集| 亚洲精品视频在线观看视频| 日韩欧美成人一区二区三区| www.一区二区| 日本精品一区在线观看| 亚洲欧美校园春色| 国产激情久久久久| 国产一二在线观看| 欧美日韩精品高清| 中文字幕乱码av| 国产在线国偷精品免费看| 大陆极品少妇内射aaaaaa| 一区二区免费| 韩国精品美女www爽爽爽视频| 天堂在线资源8| 黑人巨大精品欧美一区免费视频| 亚洲精品理论片| 日本一区中文字幕| 国产精品无码乱伦| 久久精品一级| 91爱视频在线| 国产女人在线观看| 日韩一区二区在线免费观看| 久久久久久国产精品免费播放| 成人免费看视频| 欧美牲交a欧美牲交aⅴ免费真| 日韩欧美视频在线播放| 91久色国产| 一个人看的www视频在线免费观看| 亚洲色图激情小说| 国产免费av电影| 亚洲国产精品久久久久秋霞影院| 久久久久久久久免费看无码| 日韩一区欧美二区| 午夜久久久久久久久久久| 免费看久久久| 国产日韩欧美电影在线观看| 日本h片在线观看| 亚洲精品综合精品自拍| 97超碰人人模人人人爽人人爱| 亚洲国产精品久久久久秋霞影院 | 午夜精品久久久久久久96蜜桃| 亚洲国产精品久久人人爱蜜臀| 国产免费一区二区三区网站免费| 麻豆freexxxx性91精品| 国产欧美日韩网站| 日韩88av| 精品欧美一区二区久久久伦| 国外成人福利视频| 97免费视频在线| 国产日产一区二区三区| 亚洲免费高清视频| av资源免费看| 欧美又粗又大又爽| 日韩高清精品免费观看| 国产精品对白交换视频| 97人妻天天摸天天爽天天| 久久福利资源站| 女人和拘做爰正片视频| 天天做天天爱天天综合网2021| 久久av一区二区三区亚洲| 国产激情精品一区二区三区| 日韩av免费在线观看| 神马午夜伦理不卡| 日韩在线国产精品| 成人免费在线电影| 亚洲成人网在线观看| 国产免费高清视频| 欧美午夜视频网站| 国产成人在线播放视频| 亚洲理论在线观看| 成人无码精品1区2区3区免费看| 不卡视频在线看| 熟妇女人妻丰满少妇中文字幕| 日本女优在线视频一区二区 | 丁香影院在线| 久久人人爽人人爽人人片亚洲| 美州a亚洲一视本频v色道| 精品国产91久久久久久久妲己| 国产欧美熟妇另类久久久| 91国偷自产一区二区开放时间| 国产一级做a爱片久久毛片a| 夜夜嗨av一区二区三区网页| 中国特级黄色片| 国精产品一区一区三区mba视频 | 免费中文字幕在线观看| 亚洲色图视频免费播放| 美女av免费看| 国产精品三级电影| 国产又黄又粗又猛又爽的| 国产日韩欧美高清在线| 人妻av无码一区二区三区| 久久夜色精品一区| 国产女主播喷水高潮网红在线| 91啦中文在线观看| 亚洲国产精品成人综合久久久| www.日韩精品| 国产亚洲色婷婷久久99精品91| 99热99精品| 日韩少妇一区二区| 99久久综合国产精品| 亚洲av无码一区二区三区观看 | 亚洲最大av在线| 亚洲精品视频一二三区| 懂色中文一区二区三区在线视频| 91精品国产自产精品男人的天堂| 国产不卡一区二区在线观看| 豆花视频一区二区| 国内精品二区| 国产一区二区三区四区大秀| 日本精品二区| 久久在线播放| 久久免费一级片| 在线观看视频免费一区二区三区| 日韩免费视频播放| 爽好多水快深点欧美视频| 一级黄色特级片| 国产乱人伦偷精品视频不卡| 久久久久久无码精品人妻一区二区| 成人av在线影院| 国产交换配乱淫视频免费| 国产精品午夜在线| 永久免费看黄网站| 五月天精品一区二区三区| 麻豆成人免费视频| 欧美三级欧美一级| 精品人妻av一区二区三区| 亚洲成人网在线| 国产在线视频网站| 久久福利网址导航| 咪咪网在线视频| 国产精品日韩在线一区| 日韩三级不卡| 热舞福利精品大尺度视频| 久久久久免费av| 奇米影视亚洲色图| 欧美96一区二区免费视频| 国产chinesehd精品露脸| 99国产精品久久久久久久久久久| 快灬快灬一下爽蜜桃在线观看| 亚洲黄色av一区| 黄色网址中文字幕| 日韩欧美高清dvd碟片| 成人性生交大片免费看午夜| 欧美激情在线一区| 国产成+人+综合+亚洲欧美| 激情一区二区三区| 你懂的成人av| 在线观看亚洲色图| 91一区二区三区在线播放| 久草综合在线视频| 欧美日韩精品免费观看视频| 四虎在线免费看| 久久久久五月天| 成人免费观看49www在线观看| 欧洲精品在线一区| 国产欧美一区二区三区国产幕精品| 91热视频在线观看| 欧美激情一区二区| 久久久久久在线观看| 亚洲国产精彩中文乱码av| av免费在线观看网址| 国产精品一区二区性色av | 亚洲欧洲日韩综合二区| 亚洲一区图片| 国产一级二级视频| 亚洲国产欧美在线| 亚洲av无码一区二区三区dv| 久久精品人人做人人爽| 日韩中文影院| 欧美精品久久| 久久久夜夜夜| 亚洲观看黄色网| 动漫精品一区二区| 黄频在线免费观看| 久久久免费电影| 成人偷拍自拍| av网站大全免费| 岛国一区二区在线观看| 成人免费毛片东京热| 欧美一区二区三区影视| 免费av毛片在线看| 国产精品免费看久久久香蕉| 大型av综合网站| 天堂精品一区二区三区| 免费一区视频| 亚洲午夜福利在线观看| 亚洲一区二区三区四区在线| 在线免费看91| 有码中文亚洲精品| 日韩电影网站| 日韩国产在线一区| 天堂蜜桃91精品| 亚洲不卡的av| 欧美三级午夜理伦三级中视频| 日本中文字幕在线播放| 国产精品视频在线观看| 欧州一区二区| 日本黄色的视频| 国产精品欧美精品| 国产视频在线免费观看| 欧美成年人视频| 国产伦精品一区二区三区在线播放 | 久久久久国产精品免费网站| 国产精品久一| 17c丨国产丨精品视频| 国产宾馆实践打屁股91| 久久久美女视频| 日韩av在线最新| 亚洲性受xxx喷奶水| 亚洲一区二区三区加勒比| 美腿丝袜一区二区三区| 亚洲国产精品免费在线观看| 日韩视频在线你懂得| 伊人免费在线| 成人av影视在线| 亚洲黄色影院| 毛片aaaaaa| 91精品国产色综合久久ai换脸 | 91碰在线视频| 又污又黄的网站| 精品国产一区二区三区四区在线观看| 亚洲啊v在线免费视频| 黄色激情在线视频| 国产欧美一区在线| 91在线公开视频| 色爱精品视频一区| 一区二区在线视频观看| 91视频 -- 69xx| 亚洲天堂免费看| 人妻一区二区三区四区| 国产免费一区二区三区在线能观看 | 中文字幕一区二区人妻痴汉电车| 亚洲香蕉成人av网站在线观看 | 精品久久香蕉国产线看观看gif| 色婷婷综合视频| 国产裸体写真av一区二区| 欧美午夜久久| 国产小视频你懂的| 精品久久免费看|