精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

成人免费播放器| 成人欧美一区二区| 欧美成人短视频| 国产美女视频一区二区| 一区二区视频在线看| 国产一区在线观| 伊人久久久久久久久久久久| 香蕉视频官网在线观看日本一区二区| 日韩精品中午字幕| 欧美丰满熟妇xxxxx| 久久精品视频观看| heyzo一本久久综合| 国产精品久久国产精品99gif| 青青操在线视频观看| 久久久久久毛片免费看| 欧美日韩视频不卡| www.日本在线播放| 久久99精品久久久久久野外| 99在线热播精品免费| 国产美女精品视频免费观看| 国产无码精品在线播放| 日本大胆欧美| 亚洲激情视频网站| 奇米777在线| 亚洲天堂一区二区| 午夜私人影院久久久久| 一区二区三区国| 亚洲色欧美另类| 国产a级毛片一区| 国产日本欧美一区二区三区| 亚洲精品1区2区3区| 亚洲区综合中文字幕日日| 亚洲欧洲视频在线| 久久久久久婷婷| 精品午夜视频| 欧美日韩中文另类| 中国丰满人妻videoshd| 午夜羞羞小视频在线观看| 欧美韩国日本一区| 久久99九九| 国产综合在线播放| 国产一区高清在线| 国产又爽又黄的激情精品视频 | 亚洲资源中文字幕| 亚洲欧洲精品一区二区三区波多野1战4| 婷婷综合激情网| 国产成人精品一区二区三区四区| 国产精品扒开腿爽爽爽视频| 波多野结衣国产| 伊人影院久久| 国内精品久久久久影院优 | 欧洲成人在线观看| 五月天综合在线| 欧美a级片一区| 久久天堂av综合合色| 精品伦精品一区二区三区视频密桃 | 老司机av网站| 日韩av电影资源网| 欧美午夜免费电影| 成人性生生活性生交12| 欧美va在线观看| 91九色最新地址| 无码内射中文字幕岛国片| 午夜无码国产理论在线| 欧美巨乳在线| 老鸭窝亚洲一区二区三区| 午夜精品一区二区三区av| 日本三级欧美三级| 制服诱惑一区二区| 日韩av不卡电影| 波多野结衣高清视频| 免费国产亚洲视频| 成人黄色午夜影院| 精品国产九九九| 粉嫩av一区二区三区| 狠狠色综合色区| 欧美偷拍视频| 亚洲国产精品成人久久综合一区| 亚洲精品在线免费看| 国产日产一区二区三区| 夜夜嗨av一区二区三区四季av | 黄色视屏网站在线免费观看| 国产三级一区二区三区| 亚洲一区二区三区免费看| 黄色一级片在线观看| 日韩久久一区二区| 精品国偷自产一区二区三区| 极品美鲍一区| 欧美日韩你懂得| 女人扒开双腿让男人捅| 免费成人三级| 中文字幕免费精品一区高清| 黄色片子在线观看| 日韩午夜激情| 国产精品中文久久久久久久| 国内精品久久久久久久久久久| av一区二区三区四区| 手机看片福利永久国产日韩| 大片免费在线看视频| 亚洲成人av中文| 无限资源日本好片| 都市激情亚洲欧美| 亚洲午夜久久久影院| 日韩在线中文字幕视频| 国产亚洲在线观看| 成人精品视频久久久久| 日韩中文字幕观看| 国产精品高清亚洲| 337p粉嫩大胆噜噜噜鲁| 视频欧美精品| 日韩成人中文电影| www欧美com| 国产精品毛片在线| 91精品在线看| 极品白浆推特女神在线观看| 亚洲乱码国产乱码精品精可以看| 日日摸天天爽天天爽视频| 日韩激情欧美| 这里只有精品在线播放| 国产精品久久久免费视频| 国产乱人伦精品一区二区在线观看| 精品日韩美女| 在线xxxx| 欧美日韩精品欧美日韩精品一| 日韩aaaaa| 欧美高清不卡| 国产综合久久久久久| 日本福利片在线| 亚洲一区欧美一区| 一级日本黄色片| 日韩欧美在线中字| 国产97在线亚洲| 熟妇人妻一区二区三区四区| 亚洲激情自拍偷拍| 538任你躁在线精品免费| 夜色77av精品影院| 91国产中文字幕| 午夜免费福利视频| 亚洲天堂久久久久久久| 在线观看av网页| 欧美激情在线精品一区二区三区| 26uuu另类亚洲欧美日本一| 亚洲女人18毛片水真多| 亚洲精品国产视频| 色男人天堂av| 牛牛国产精品| 91美女片黄在线观看游戏| 成年人免费在线视频| 一本大道久久a久久综合婷婷| 精品人妻一区二区三区日产| 好看的日韩av电影| 国产精品12| 国产三线在线| 精品国产一区二区精华| 久久免费视频6| 国产成人精品一区二| 波多野结衣与黑人| 一区二区亚洲视频| 欧美精品久久久久久久| 高h调教冰块play男男双性文| 一区二区三区中文字幕电影| 女同性αv亚洲女同志| 好吊一区二区三区| 久久99精品久久久久久三级 | 亚洲天堂成人在线观看| 拔插拔插华人永久免费| 91精品观看| av成人午夜| 福利在线免费视频| 国产偷国产偷亚洲清高网站 | 欧美日韩夫妻久久| 三级黄色录像视频| 国产精品亚洲一区二区三区妖精 | 色久综合一二码| 中文字幕一二三四区| 人人狠狠综合久久亚洲| 在线看无码的免费网站| 精品一区二区三区中文字幕在线| 欧美精品精品精品精品免费| 亚州视频一区二区三区| 色综合久久88色综合天天| 国产视频不卡在线| 国产麻豆成人精品| 成人免费性视频| 亚洲人成伊人成综合图片| 国产精品久久久久久久美男| 在线免费黄色| 亚洲精品在线观| 亚洲毛片一区二区三区| 亚洲欧洲日韩综合一区二区| 亚洲少妇中文字幕| 亚洲欧美日韩精品一区二区| 亚洲精品一区二区三区四区五区| 9l亚洲国产成人精品一区二三| 欧美亚洲国产精品| 欧洲不卡视频| 亚洲福利视频专区| 一二三区在线播放| 亚洲在线一区二区三区| 欧美人与性囗牲恔配| 国内精品久久久久影院薰衣草 | 欧美午夜精品免费| 久久久精品视频在线| 久久嫩草精品久久久久| 51自拍视频在线观看| 久久一区激情| 男人天堂手机在线视频| jizzjizz欧美69巨大| 99精品99久久久久久宅男| 78精品国产综合久久香蕉| 久久久久久久爱| 欧美18hd| 亚洲欧美日韩中文视频| 亚洲美女综合网| 欧美色手机在线观看| 国产性xxxx高清| 亚洲免费电影在线| 日韩女同一区二区三区| 成人黄色在线网站| 婷婷中文字幕在线观看| 久久精品午夜| 国产一级做a爰片久久毛片男| 日韩大片在线播放| 欧美人xxxxx| 老牛影视av一区二区在线观看| 91精品久久久久久久久青青| 亚洲承认视频| 欧美洲成人男女午夜视频| 一色桃子av在线| 少妇高潮 亚洲精品| 欧洲视频在线免费观看| 亚洲国产精品va在线| 99在线精品视频免费观看20| 欧美视频中文字幕| 亚洲精品成人在线视频| 午夜久久电影网| 激情视频在线播放| 亚洲精品国产成人久久av盗摄| 亚洲色图27p| 国产精品午夜电影| 舐め犯し波多野结衣在线观看| 26uuu亚洲综合色欧美| 91精品啪在线观看国产| 国产剧情在线观看一区二区| 日韩欧美国产片| 美腿丝袜亚洲色图| 深夜黄色小视频| 麻豆精品一区二区综合av| 亚洲乱码国产一区三区| 久久成人国产| 国产精品99久久免费黑人人妻| 欧美综合二区| av片中文字幕| 水野朝阳av一区二区三区| 免费在线激情视频| 另类国产ts人妖高潮视频| 免费av网址在线| 久久久久中文| 99视频精品免费| 美女视频第一区二区三区免费观看网站| 免费国产成人av| 美女精品自拍一二三四| av免费一区二区| 精品一区二区三区免费毛片爱| 中文字幕色网站| 国产经典欧美精品| 性高潮免费视频| 91视频观看视频| 91视频在线网站| 中日韩免费视频中文字幕| 黄色录像一级片| 亚洲综合色视频| 久久露脸国语精品国产91| 欧美日韩亚洲国产一区| 在线观看 亚洲| 欧美日韩精品三区| 亚洲国产欧美另类| 精品亚洲精品福利线在观看| 福利片在线看| 久久中文字幕在线视频| 成人免费网站观看| 国产精品久久久久久久av电影| 91麻豆精品一二三区在线| 97人人模人人爽人人喊38tv| 久久久精品人妻一区二区三区四| av成人老司机| 变态另类ts人妖一区二区| 亚洲欧洲性图库| 日本少妇毛茸茸高潮| 91成人网在线| 国产精品欧美亚洲| 亚洲激情自拍图| 成人免费黄色网页| 久久久精品国产网站| 678在线观看视频| 国产精品视频网| 亚洲一区二区免费在线观看| 欧美日韩电影一区二区三区| 欧美电影《睫毛膏》| 国产中文字幕乱人伦在线观看| 视频一区二区欧美| 69久久精品无码一区二区| 91丨九色丨国产丨porny| 黑人と日本人の交わりビデオ| 亚洲国产一区二区三区青草影视 | 色婷婷综合中文久久一本| 亚洲综合免费视频| 亚洲第一精品福利| 成人好色电影| 韩国美女主播一区| 精品美女一区| 免费一区二区三区| 欧美视频在线观看| 天天干天天玩天天操| www国产成人免费观看视频 深夜成人网 | 中国一级特黄毛片| 91精品国产综合久久久蜜臀粉嫩 | 中文字幕精品www乱入免费视频| 久久免费电影| 国产专区欧美专区| 国产亚洲一区二区三区不卡| 国产天堂视频在线观看| 久久aⅴ国产欧美74aaa| 熟女俱乐部一区二区| 亚洲福利电影网| 99国产精品欲| www.xxxx精品| 搜成人激情视频| 明星裸体视频一区二区| 在线精品亚洲| 久久综合桃花网| 中文字幕一区在线观看视频| 最近中文字幕在线免费观看| 亚洲欧洲视频在线| 免费一二一二在线视频| 国产精品有限公司| 欧美午夜一区| 精品国产aⅴ一区二区三区东京热 久久久久99人妻一区二区三区 | 亚洲高清免费视频| www.黄色片| 精品少妇一区二区30p| 伊人亚洲精品| 一区二区在线观看网站| 蜜桃91丨九色丨蝌蚪91桃色| 免费成人深夜天涯网站| 欧美丝袜自拍制服另类| 国产一二在线观看| 国产成人精品一区| 久久99性xxx老妇胖精品| 免费观看精品视频| 国产亚洲精久久久久久| 欧产日产国产69| 亚洲国产精品一区二区久| 国内精品一区视频| 国产精品电影观看| 爽成人777777婷婷| 日本国产一级片| 亚洲美女在线一区| 精品国产福利| 99re8这里有精品热视频免费| 一区二区91美女张开腿让人桶| 麻豆91在线观看| 少妇无套高潮一二三区| 欧美午夜精品电影| 欧美jizzhd欧美| 亚洲va电影大全| 国产精品地址| 亚洲成a人无码| 亚洲mv大片欧洲mv大片精品| 亚洲三级黄色片| 日本高清不卡在线| 久久综合电影| 欧美熟妇精品一区二区| 狠狠干狠狠久久| yourporn在线观看视频| 成人黄色大片在线免费观看| 欧美日韩少妇| 一女三黑人理论片在线| 欧美主播一区二区三区| 超碰在线caoporn| 激情伦成人综合小说| 日本视频在线一区| 91 在线视频| 亚洲电影免费观看高清完整版在线观看 | 麻豆网址在线观看| 精品免费国产二区三区| 日韩激情电影| 色就是色欧美| 国产成人亚洲综合a∨猫咪| 中文字幕亚洲精品在线| 日韩小视频在线| 欧美亚洲人成在线| 日韩一级片免费视频| 国产视频一区在线播放| 国产免费黄色大片| 奇米4444一区二区三区| 亚洲国产一成人久久精品| 黄色性生活一级片| 欧美日韩一区小说| bl视频在线免费观看|