国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

React項目從Javascript到Typescript的遷移經驗總結

開發 前端
這篇文章比較全面地介紹了TypeScript,并且和Javascript做了一個對比。看完上面這篇文章,你會對TypeScript有一個比較深入的認識,另外在TypeScript和Javascript的取舍上,可以拿捏得更好。

[[264487]]

 拋轉引用

現在越來越多的項目放棄了javascript,而選擇擁抱了typescript,就比如我們熟知的ant-design就是其中之一。面對越來越火的typescript,我們公司今年也逐漸開始擁抱typescript。至于為什么要使用typescript?本文不做深入探討。

這篇文章比較全面地介紹了TypeScript,并且和Javascript做了一個對比。看完上面這篇文章,你會對TypeScript有一個比較深入的認識,另外在TypeScript和Javascript的取舍上,可以拿捏得更好。

開始遷移

在開始遷移之前,我要說點題外話,本篇文章僅是記錄我在遷移過程中遇到的問題以及我是如何解決的,并不會涉及typescript的教學。所以大家在閱讀本篇文章之前,一定要對typescript有一個基礎的認識,不然你讀起來會非常費力。

環境調整

由于Typescript是Javascript的超集,它的很多語法瀏覽器是不能識別的,因此它不能直接運行在瀏覽器上,需要將其編譯成JavaScript才能運行在瀏覽器上,這點跟ES6需要經過babel編譯才能支持更多低版本的瀏覽器是一個道理。

tsconfig.json

首先我們得裝一個typescript,這就跟我們在用babel前需要先裝一個babel-core是一個道理。 

  1. yarn global add typescript 

這條命令是將typescript安裝在全局,其實我個人建議是裝在項目目錄下的,因為每個項目的typescript版本是不完全一樣的,裝在全局容易因為版本不同而出現問題。但是后面我要執行tsc命令,所以我裝在了全局。***的情況就是全局和項目都裝一個,但是如果你把tsc命令放在package.json中的script中去用的話,那么在項目里裝就夠了。接下來我們執行如下命令生成tsconfig.json,這玩意就跟.babelrc是一個性質的。 

  1. tsc --init 

執行完之后,你的項目根目錄下便會有一個tsconfig.json這么一個東西,但是里面會有很多注釋,我們先不用管他的。

webpack

安裝ts-loader用于處理ts和tsx文件,類似于babel-loader。 

  1. yarn add ts-loader -D 

相應的webpack需要加上ts的loader規則: 

  1. module.exports = {  
  2.     //省略部分代碼...  
  3.     module: {  
  4.         rules: [  
  5.             {  
  6.                 test:/\.tsx?$/,  
  7.                 loader:'ts-loader'  
  8.             }  
  9.             //省略部分代碼...  
  10.         ]  
  11.     }  
  12.     //...省略部分代碼  
  13.  

之前用javascript的時候,可能有人不使用.jsx文件,整個項目都是用的.js文件,webapck里面甚至都不配.jsx的規則。但是在typescript項目中想要全部使用.ts文件這就行不通了,會報錯,所以當用到了jsx的用法的時候,還是得乖乖用.tsx文件,因此這里我加入了.tsx的規則。

刪除babel

關于babel這塊,網上有不少人是選擇留著的,理由很簡單,說是為了防止以后會使用到JavaScript,但是我個人覺得是沒有必要留著babel。因為我們整個項目里面基本上只有使用第三方包的時候才會用到javascript,而這些第三方包基本上都是已經編譯成了es5的代碼了,不需要babel再去處理一下。而業務邏輯里面用javascript更是不太可能了,因為這便失去了使用typescript的意義。綜上所述,我個人覺得是要刪除babel相關的東西,降低項目復雜度。但是有一個例外情況:。

當你用了某些babel插件,而這些插件的功能恰巧是typescript無法提供的,那你可以保留babel,并且與typescript結合。

文件名調整

整個src目下所有的.js結尾的文件都要修改文件名,使用到jsx語法的就改成.tsx文件,未使用的就改成.ts文件,這塊工作量比較大,會比較頭疼。另外改完之后文件肯定會有很多標紅的地方,不要急著去改它,后面我們分類統一去改。

解決報錯

webpack入口文件找不到

由于我們在做文件名調整的時候,把main.js改成main.tsx,因此webpack的入口文件要改成main.tsx。 

  1. module.exports = {  
  2.     //省略部分代碼...  
  3.     entry: {  
  4.         app: './src/main.tsx'  
  5.     },  
  6.     //省略部分代碼...  
  7.  

提示不能使用jsx的語法

這個解決很簡單,去tsconfig配置一下即可。 

  1.  
  2.    "compilerOptions":{  
  3.         "jsx": "react"  
  4.    }  
  5.  

jsx這個配置項有三個值可選擇,分別是"preserve","react-native"和"react"。在preserve和react-native模式下生成代碼中會保留JSX以供后續的轉換操作使用(比如:Babel)。另外,preserve輸出文件會帶有.jsx擴展名,而react-native是.js拓展名。react模式會生成React.createElement,在使用前不需要再進行轉換操作了,輸出文件的擴展名為.js。

模式 輸入 輸出 輸出文件擴展名
preserve <div /> <div /> .jsx
react <div /> React.createElement("div") .js
react-native <div /> <div /> .js

webpack里面配置的alias無法解析 

  1. module.exports = {  
  2.     //省略部分代碼...  
  3.     resolve: {  
  4.         alias:{  
  5.           '@':path.join(__dirname,'../src')  
  6.         }  
  7.         //省略部分代碼...      
  8.     },  
  9.     //省略部分代碼...     

這里需要我們額外在tsconfig.json配置一下。 

  1.  
  2.     "compilerOptions":{  
  3.         "baseUrl": ".",  
  4.         "paths": {  
  5.           "@/*":["./src/*"]  
  6.         }   
  7.     }  
  8.  

具體如何配置,請看typescript的文檔,我就不展開介紹了,但是要注意的是baseUrl和paths一定要配合使用。

https://www.tslang.cn/docs/ha...

無法自動添加拓展名而導致找不到對應的模塊

原先我們在webpack里是這么配置的: 

  1. module.exports = {  
  2.     //省略部分代碼...   
  3.     resolve: {  
  4.         //省略部分代碼...   
  5.         extensions: ['.js', '.jsx', '.json']  
  6.     },  
  7.     //省略部分代碼...   
  8.  

但是我們項目里所有.js和.jsx的文件都改成了.ts和.tsx文件,因此配置需要調整。 

  1.  
  2.     //省略部分代碼...   
  3.     resolve: {  
  4.         //省略部分代碼...   
  5.         extensions: ['.ts','.tsx','.js', '.jsx', '.json']  
  6.     },  
  7.     //省略部分代碼...   
  8.  

Could not find a declaration file for module '**'

這個比較簡單,它提示找不到哪個模塊的聲明文件,你就裝個哪個模塊的就好了,安裝格式如下: 

  1. yarn add @types/** 

舉個🌰,如果提示Could not find a declaration file for module 'react',那你應該執行如下命令: 

  1. yarn add @types/react 

這個僅限于第三方包,如果是項目自己的模塊提示缺少聲明文件,那就需要你自己寫對應的聲明文件了。比如你在window這個全局對象上掛載了一個對象,如果需要使用它的話,就需要做一下聲明,否則就會報錯。至于具體怎么寫,這得看typescript的文檔,這里就不展開說明了。

https://www.tslang.cn/docs/ha...

Cannot find type definition file for '**'

這些并沒有在我們的業務代碼里直接用到,而是第三方包用到的,遇到這種情況,需要檢查一下tsconfig.json中的typeRoots這個配置項有沒有配置錯誤。一般來說是不用配置typeRoots,但是如果需要加入額外的聲明文件路徑,就需要對其進行修改。typeRoots是有一個默認值,有人會誤以為這個默認值是“["node_modules"]”,因此會有人這樣配置: 

  1.  
  2.     "compilerOptions":{  
  3.         "typeRoots":["node_modules",...,"./src/types"]  
  4.     }  

 

實際上typeRoots的默認值“["@types"]”,所有可見的"@types"包都會在編輯過程中被加載進來,比如“./node_modules/@types/”,“../node_modules/@types/”和“../../node_modules/@types/”等等都會被加載進來。所以遇到這種問題,你的配置應該改成: 

  1.  
  2.     "compilerOptions":{  
  3.         "typeRoots":["@types",...,"./src/types"]  
  4.     }  
  5.  

在實際項目中,@types基本上存在于根目錄下的node_modules下,因此這里你可以改成這樣: 

  1.  
  2.     "compilerOptions":{  
  3.         "typeRoots":["node_modules/@types",...,"./src/types"]  
  4.     }  
  5.  

不支持decorators(裝飾器)

typescript默認是關閉實驗性的ES裝飾器,所以需要在tsconfig.json中開啟。 

  1.  
  2.     "compilerOptions":{  
  3.         "experimentalDecorators":true  
  4.     }  
  5.  

Module '**' has no default export

提示模塊代碼里沒有“export

default”,而你卻用“import from ”這種默認導入的形式。對于這個問題,我們需要把tsconfig.json配置項“allowSyntheticDefaultImports”設置為true。允許從沒有設置默認導出的模塊中默認導入。不過不必擔心會對代碼產生什么影響,這個僅僅為了類型檢查。 

  1.  
  2.     "compilerOptions":{  
  3.         "allowSyntheticDefaultImports":true  
  4.     }  
  5.  

當然你也可以使用“esModuleInterop”這個配置項,將其設置為true,根據“allowSyntheticDefaultImports”的默認值,如下: 

  1. module === "system" or --esModuleInterop 

對于“esModuleInterop”這個配置項的作用主要有兩點:

  • 提供__importStar和__importDefault兩個helper來兼容babel生態
  • 開啟allowSyntheticDefaultImports

對于“esModuleInterop”和“allowSyntheticDefaultImports”選用上,如果需要typescript結合babel,毫無疑問選“esModuleInterop”,否則的話,個人習慣選用“allowSyntheticDefaultImports”,比較喜歡需要啥用啥。當然“esModuleInterop”是最保險的選項,如果對此拿捏不準的話,那就乖乖地用“esModuleInterop”。

無法識別document和window這種全局對象

遇到這種情況,需要我們在tsconfig.json中lib這個配置項加入一個dom庫,如下: 

  1.  
  2.     "compilerOptions":{  
  3.         "lib":[  
  4.             "dom",  
  5.             ...,  
  6.             "esNext"  
  7.         ]  
  8.     }  
  9.  

文件中的標紅問題

關于這個問題,我們需要分兩種情況來考慮,***種是.ts的文件,第二種是.tsx文件。下面來看一下具體是哪些注意的點(Ps:以下提到的注意的點并不能完全解決文件中標紅的問題,但是可以解決大部分標紅的問題):

***種:.ts文件

這種文件在你的項目比較少,比較容易處理,根據實際情況去加一下類型限制,沒有特別需要講的。

第二種:.tsx文件

這種情況都是react組件了,而react組件又分為無狀態組件和有狀態組件組件,所以我們分開來看。

無狀態組件

對于無狀態組件,首先得限制他是一個FunctionComponent(函數組件),其次限制其props類型。舉個🌰: 

  1. import React, { FunctionComponent, ReactElement } from 'react';  
  2. import {LoadingComponentProps} from 'react-loadable';  
  3. import './style.scss';  
  4. interface LoadingProps extends LoadingComponentProps{  
  5.   loading:boolean,  
  6.   children?:ReactElement  
  7.  
  8. const Loading:FunctionComponent<LoadingProps> = ({loading=true,children})=> 
  9.   return (  
  10.     loading?<div className="comp-loading">  
  11.       <div className="item-1"></div>  
  12.       <div className="item-2"></div>  
  13.       <div className="item-3"></div>  
  14.       <div className="item-4"></div>  
  15.       <div className="item-5"></div>  
  16.     </div>:children  
  17.   )    
  18.  
  19. export default Loading;  

其中你要是覺得FunctionComponent這個名字比較長,你可以選擇用類型別名“SFC”或者“FC”。 

有狀態組件

對于有狀態組件,主要注意三點:

  1. props和state都要做類型限制
  2. state用readonly限制“this.state=**”的操作
  3. 對event對象做類型限制 
  1. import React,{MouseEvent} from "react";  
  2. interface TeachersProps{  
  3.   user:User  
  4.  
  5. interface TeachersState{  
  6.   pageNo:number,  
  7.   pageSize:number,  
  8.   total:number,  
  9.   teacherList:{  
  10.     id: number,  
  11.     name: string,  
  12.     age: number,  
  13.     sex: number,  
  14.     tel: string,  
  15.     email: string  
  16.   }[]  
  17.  
  18. export default class Teachers extends React.PureComponent<TeachersProps,TeachersState> {  
  19.     readonly state = {  
  20.         pageNo:1,  
  21.         pageSize:20,  
  22.         total:0,  
  23.         userList:[]  
  24.     }  
  25.     handleClick=(e:MouseEvent<HTMLDivElement>)=> 
  26.         console.log(e.target);  
  27.     }  
  28.     //...省略部分代碼  
  29.     render(){  
  30.         return <div onClick={this.handleClick}>點擊我</div>  
  31.     }  
  32.  

實際項目里,組件的state可能會有很多值,如果按照我們上面這種方式去寫會比較麻煩,所以可以考慮一下下面這個簡便寫法: 

  1. import React,{MouseEvent} from "react";  
  2. interface TeachersProps{  
  3.   user:User  
  4.  
  5. const initialState = {  
  6.   pageNo:1,  
  7.   pageSize:20,  
  8.   total:0,  
  9.   teacherList:[]  
  10.  
  11. type TeachersState = Readonly<typeof initialState>  
  12. export default class Teachers extends React.PureComponent<TeachersProps,TeachersState> {  
  13.     readonly state = initialState  
  14.     handleClick=(e:MouseEvent<HTMLDivElement>)=> 
  15.         console.log(e.target);  
  16.     }  
  17.     //...省略部分代碼  
  18.     render(){  
  19.         return <div onClick={this.handleClick}>點擊我</div>  
  20.     }  
  21.  

這種寫法會簡便很多代碼,但是類型限制效果上明顯不如***種,所以這種方法僅僅作為參考,可根據實際情況去選擇。

Ant Design丟失樣式文件

當我們把項目啟動起來之后,某些同學的頁面可能會出現樣式丟失的情況,如下:

打開控制臺,我們發現Ant Design的類名都找不到對應的樣式:

出現這種情況是因為我們把babel刪除之后,用來按需加載組件樣式文件的babel插件babel-plugin-import也隨著丟失了。不過typescript社區有一個babel-plugin-import的Typescript版本,叫做“ts-import-plugin”,我們先來安裝一下: 

  1. yarn add ts-import-plugin -D 

這個插件需要結合ts-loader使用,所以webpack配置中需要做如下調整: 

  1. const tsImportPluginFactory = require('ts-import-plugin')  
  2. module.exports = {  
  3.     //省略部分代碼...  
  4.     module:{  
  5.         rules:[{  
  6.             test: /\.tsx?$/,  
  7.             loader: "ts-loader",  
  8.             options: {  
  9.                 transpileOnly: true,//(可選)  
  10.                 getCustomTransformers: () => ({  
  11.                   before: [  
  12.                     tsImportPluginFactory({  
  13.                         libraryDirectory: 'es',  
  14.                         libraryName: 'antd',  
  15.                         style: true  
  16.                     })  
  17.                   ]  
  18.                 })  
  19.             }  
  20.         }]  
  21.     }  
  22.     //省略部分代碼...  
  23.  

這里要注意一下transpileOnly: true這個配置,這是個可選配置,我建議是只有大項目中才加這個配置,小項目就沒有必要了。由于typescript的語義檢查器會在每次編譯的時候檢查所有文件,因此當項目很大的時候,編譯時間會很長。解決這個問題的最簡單的方法就是用transpileOnly: true這個配置去關閉typescript的語義檢查,但是這樣做的代價就是失去了類型檢查以及聲明文件的導出,所以除非在大項目中為了提升編譯效率,否則不建議加這個配置。

配置完成之后,你的瀏覽器控制臺可能會報出類似下面這個錯誤:

出現這個原因是因為你的typescript配置文件tsconfig.json中的module參數設置不對,兩種情況會導致這個問題:

  • module設置成了“commonjs”
  • target設置"ES5"但是并未設置module(當target不為“ES6”時,module默認為“commonjs”)

解決這個辦法就是把module設置為“esNext”便可解決這個問題。 

  1.  
  2.     "compilerOptions":{  
  3.         "module":"esNext"  
  4.     }  
  5.  

可能會有小伙們說設置成“ES6”或者“ES2015”也是可以的,至于我為什么選擇“esNext”而不是“ES6”或者“ES2015”,主要原因是設置成“ES6”或者“ES2015”之后,就不能動態導入了,因為項目使用了react-loadable這個包,要是設置成“ES6”或者“ES2015”的話,會報如下這個錯誤:

typescript提示我們需要設置成“commonjs”或者“ESNext”才可動態導入,所以保險起見,我是建議大家設置成ESNext。完成之后我們的頁面就可以正常顯示了。

說到module參數,這里要再多提一嘴說一下moduleResolution這個參數,它決定著typescript如何處理模塊。當我們把module設置成“esNext”時,是可以不用管moduleResolution這個參數,但是大家項目里要是設置成“ES6”的話,那就要設置一下了。先看一下moduleResolution默認規則: 

  1. module === "AMD" or "System" or "ES6" ? "Classic" : "Node" 

當我們module設置為“ES6”時,此時moduleResolution默認是“Classic”,而我們需要的是“Node”。為什么要選擇“node”,主要是因為node的模塊解析規則更符合我們要求,解析速度會更快,至于詳情的介紹,可以參考Typescript的文檔。

https://www.tslang.cn/docs/ha...

同樣為了保險起見,我是建議大家強行將moduleResolution設置為“node”。

總結

以上就是我自己在遷移過程中遇到的問題,可能無法覆蓋大家在遷移過程中所遇到的問題,如果出現我上面沒有涉及的報錯,歡迎大家在評論區告訴我,我會盡可能地完善這篇文章。***再強調一下,本篇文章僅僅只是介紹了我個人在遷移至typescript的經驗總結,并未完全覆蓋tsconfig.json的所有配置項,文章未涉及到的配置項,還需大家多花點時間看看typescript的文檔。***附上我已遷移到typescript的項目的地址:

項目地址: https://github.com/ruichengpi...

 

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2009-12-18 18:29:43

Linux Fedor

2010-09-28 13:16:43

JavaScriptDOM

2010-06-07 15:48:40

Hadoop0.20.

2009-10-15 09:27:00

2013-01-18 10:10:30

項目項目經理

2011-07-21 13:40:17

java

2009-09-16 17:13:54

學習Linq

2009-09-29 16:32:11

OJB Hiberna

2009-08-19 09:24:43

AJAX引擎經驗總結

2010-03-23 11:39:49

云計算

2010-03-25 13:42:14

云計算

2010-04-21 14:53:46

Oracle游標

2010-05-19 17:24:55

MySQL編碼

2011-07-08 13:15:52

JSP

2009-09-08 10:57:55

LINQ查詢操作

2010-06-12 17:37:18

UML實踐指南

2009-11-17 11:24:00

PHP應用技巧

2009-09-08 16:02:47

Linq使用Group

2009-09-16 17:44:54

LINQ to SQL

2009-09-11 13:29:31

LINQ查詢操作
點贊
收藏

51CTO技術棧公眾號

国产精品五月天| 奇米精品一区二区三区四区| 亚洲午夜精品17c| 日韩欧美一区二区三区久久婷婷| 川上优av中文字幕一区二区| 久久精品这里都是精品| 欧美一区观看| 国产亚洲欧美日韩在线观看一区二区 | 欧美大香线蕉线伊人久久| 日韩av一级| 亚洲视频在线播放| 91小视频网站| 国产视频亚洲色图| 男女激情无遮挡| 99精品一区二区三区| 日本中文字幕在线视频观看 | 国产精品户外野外| 天堂成人娱乐在线视频免费播放网站 | 欧美一区二区女人| 多野结衣av一区| 1区2区3区精品视频| 亚洲国产精品资源| 亚洲奶水xxxx哺乳期| 日韩一区二区视频| 日韩在线伦理| 久久好看免费视频| 国产欧美日韩综合一区在线观看| 欧美人与牛zoz0性行为| 91免费版网站入口| 国产日韩一区| 六月婷婷激情网| 92国产精品观看| 成全视频在线播放大地| 亚洲h精品动漫在线观看| 黄色av网站在线看| 欧美精品日韩一本| 日本成人三级电影| 欧美日韩成人网| av资源久久| 久久久久久亚洲精品不卡4k岛国| 蜜桃精品视频在线观看| 久久精品99国产| 婷婷国产v国产偷v亚洲高清| 青青视频在线观| 精品福利在线导航| 秋霞一区二区| 成人免费淫片视频软件| 日本在线播放一区二区三区| 凹凸国产熟女精品视频| 欧美性猛交丰臀xxxxx网站| h片精品在线观看| 午夜精品久久久久久久99黑人| 重囗味另类老妇506070| 国产精品视频网站在线观看| 一区二区三区在线视频播放| 国产天堂在线播放视频| 欧美中文在线观看| 日本在线不卡视频一二三区| 草裙成人精品一区二区三区| 日韩你懂的在线观看| 林ゆな中文字幕一区二区| 久久国产精品高清| 国产日韩三级在线| 欧美另类tv| 国产成人拍精品视频午夜网站 | 国产在线观看网站| 久久综合亚州| 香蒸焦蕉伊在线| 欧美性猛交xxxx免费看| 一区二区三区久久网| 99久久国产免费看| 国产在线网站| x99av成人免费| 91精品成人| 免费看国产曰批40分钟| 成人午夜视频福利| 激情小视频在线观看| 久久国产天堂福利天堂| 亚洲私拍自拍| 男女曰b免费视频| 日韩一级高清毛片| 国产成人av| 最近免费观看高清韩国日本大全| 一区二区三区精品视频| 高h视频在线观看| 97久久精品在线| 国产综合色视频| 福利小视频在线观看| 欧美激情国内偷拍| 韩日av一区二区| 搞黄视频免费在线观看| 国产69久久精品成人看| 成人在线综合网站| 国产网红在线观看| 国产精品永久入口久久久| 玉足女爽爽91| 日韩综合一区二区三区| 四虎4hu永久免费入口| 欧美精品在欧美一区二区少妇| 青青操综合网| 国产极品尤物在线| 亚洲韩国欧洲国产日产av | 亚洲欧洲一区| 一本色道久久加勒比88综合| 色狠狠av一区二区三区香蕉蜜桃| 欧美一级二区| 国产精品免费播放| 青青草一区二区| 久久久久九九视频| 成人日韩在线观看| 亚洲美女自拍偷拍| 精品国产免费久久| 亚洲小说欧美另类社区| 超碰在线电影| 日韩美女免费观看| 亚洲蜜臀av乱码久久精品 | 久草福利视频在线| 最近免费中文字幕视频2019| 视频一区在线播放| 国产粉嫩一区二区三区在线观看| 欧美在线一级视频| 中文字幕一区二区三区在线播放 | 精品二区久久| 亚洲人成77777男人| 欧美在线不卡区| 欧美国产精品一区二区三区| 99精品视频在线免费播放| 欧美交换配乱吟粗大25p| 日韩国产高清视频在线| 蜜臀久久99精品久久久久久9 | 一区二区在线观看网站| 日韩视频不卡中文| 免费成人在线视频观看| xxx欧美xxx| 欧美日本视频在线观看| 久久不射电影网| 国产精品视频在线看| 美腿丝袜亚洲图片| 天海翼女教师无删减版电影| 国产精品欧美在线| 色婷婷av一区二区三区gif| 欧美成人中文| 97caopor国产在线视频| 欧美aaa在线观看| 中文字幕欧美在线| 中文字幕二三区不卡| 精品毛片免费观看| 成人在线免费看| 在线码字幕一区| 久久天天躁狠狠躁夜夜爽蜜月 | 国产无限制自拍| 色综合久综合久久综合久鬼88| 久久精品视频一区二区| 亚洲国产国产| 欧美少妇另类| 欧美日韩电影一区二区| 国产亚洲激情在线| 欧美激情在线看| 羞羞答答成人影院www| caoporn免费在线| av片在线免费| 人人做人人澡人人爽欧美| 在线观看日韩国产| 国产一区二区h| 日本亚洲不卡| 成年人在线观看网站| av磁力番号网| 97婷婷涩涩精品一区| 91蝌蚪porny九色| 欧美日韩中文字幕在线| 午夜久久久影院| 色偷偷一区二区三区| 欧美日韩影院| 蜜桃麻豆影像在线观看| 37pao成人国产永久免费视频| 97久久久久久| 一本一本大道香蕉久在线精品| 国产亚洲激情| 国产麻豆一区二区三区| 蜜芽tv福利在线视频| 国产精品12p| 国产精品美女在线| 精品三级在线看| 亚洲人成网站在线| 美腿丝袜亚洲三区| 欧美综合久久| 久久久成人av毛片免费观看| 在线看国产视频| 91av在线播放| 国产综合中文字幕| 欧美6一10sex性hd| 男女午夜视频在线观看| 国产视频观看一区| 亚洲激情视频网| 一区二区三区中文字幕在线观看| 婷婷亚洲五月| 午夜欧美视频在线观看| 在线成人av| 欧美wwwwww| 狠狠色丁香九九婷婷综合五月|