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

React項(xiàng)目從Javascript到Typescript的遷移經(jīng)驗(yàn)總結(jié)

開發(fā) 前端
這篇文章比較全面地介紹了TypeScript,并且和Javascript做了一個(gè)對(duì)比。看完上面這篇文章,你會(huì)對(duì)TypeScript有一個(gè)比較深入的認(rèn)識(shí),另外在TypeScript和Javascript的取舍上,可以拿捏得更好。

[[264487]]

 拋轉(zhuǎn)引用

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

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

開始遷移

在開始遷移之前,我要說點(diǎn)題外話,本篇文章僅是記錄我在遷移過程中遇到的問題以及我是如何解決的,并不會(huì)涉及typescript的教學(xué)。所以大家在閱讀本篇文章之前,一定要對(duì)typescript有一個(gè)基礎(chǔ)的認(rèn)識(shí),不然你讀起來會(huì)非常費(fèi)力。

環(huán)境調(diào)整

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

tsconfig.json

首先我們得裝一個(gè)typescript,這就跟我們?cè)谟胋abel前需要先裝一個(gè)babel-core是一個(gè)道理。 

  1. yarn global add typescript 

這條命令是將typescript安裝在全局,其實(shí)我個(gè)人建議是裝在項(xiàng)目目錄下的,因?yàn)槊總€(gè)項(xiàng)目的typescript版本是不完全一樣的,裝在全局容易因?yàn)榘姹静煌霈F(xiàn)問題。但是后面我要執(zhí)行tsc命令,所以我裝在了全局。***的情況就是全局和項(xiàng)目都裝一個(gè),但是如果你把tsc命令放在package.json中的script中去用的話,那么在項(xiàng)目里裝就夠了。接下來我們執(zhí)行如下命令生成tsconfig.json,這玩意就跟.babelrc是一個(gè)性質(zhì)的。 

  1. tsc --init 

執(zhí)行完之后,你的項(xiàng)目根目錄下便會(huì)有一個(gè)tsconfig.json這么一個(gè)東西,但是里面會(huì)有很多注釋,我們先不用管他的。

webpack

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

  1. yarn add ts-loader -D 

相應(yīng)的webpack需要加上ts的loader規(guī)則: 

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

之前用javascript的時(shí)候,可能有人不使用.jsx文件,整個(gè)項(xiàng)目都是用的.js文件,webapck里面甚至都不配.jsx的規(guī)則。但是在typescript項(xiàng)目中想要全部使用.ts文件這就行不通了,會(huì)報(bào)錯(cuò),所以當(dāng)用到了jsx的用法的時(shí)候,還是得乖乖用.tsx文件,因此這里我加入了.tsx的規(guī)則。

刪除babel

關(guān)于babel這塊,網(wǎng)上有不少人是選擇留著的,理由很簡(jiǎn)單,說是為了防止以后會(huì)使用到JavaScript,但是我個(gè)人覺得是沒有必要留著babel。因?yàn)槲覀冋麄€(gè)項(xiàng)目里面基本上只有使用第三方包的時(shí)候才會(huì)用到j(luò)avascript,而這些第三方包基本上都是已經(jīng)編譯成了es5的代碼了,不需要babel再去處理一下。而業(yè)務(wù)邏輯里面用javascript更是不太可能了,因?yàn)檫@便失去了使用typescript的意義。綜上所述,我個(gè)人覺得是要?jiǎng)h除babel相關(guān)的東西,降低項(xiàng)目復(fù)雜度。但是有一個(gè)例外情況:。

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

文件名調(diào)整

整個(gè)src目下所有的.js結(jié)尾的文件都要修改文件名,使用到j(luò)sx語法的就改成.tsx文件,未使用的就改成.ts文件,這塊工作量比較大,會(huì)比較頭疼。另外改完之后文件肯定會(huì)有很多標(biāo)紅的地方,不要急著去改它,后面我們分類統(tǒng)一去改。

解決報(bào)錯(cuò)

webpack入口文件找不到

由于我們?cè)谧鑫募{(diào)整的時(shí)候,把main.js改成main.tsx,因此webpack的入口文件要改成main.tsx。 

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

提示不能使用jsx的語法

這個(gè)解決很簡(jiǎn)單,去tsconfig配置一下即可。 

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

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

模式 輸入 輸出 輸出文件擴(kuò)展名
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.  

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

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

無法自動(dòng)添加拓展名而導(dǎo)致找不到對(duì)應(yīng)的模塊

原先我們?cè)趙ebpack里是這么配置的: 

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

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

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

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

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

  1. yarn add @types/** 

舉個(gè)🌰,如果提示Could not find a declaration file for module 'react',那你應(yīng)該執(zhí)行如下命令: 

  1. yarn add @types/react 

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

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

Cannot find type definition file for '**'

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

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

 

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

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

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

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

不支持decorators(裝飾器)

typescript默認(rèn)是關(guān)閉實(shí)驗(yàn)性的ES裝飾器,所以需要在tsconfig.json中開啟。 

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

Module '**' has no default export

提示模塊代碼里沒有“export

default”,而你卻用“import from ”這種默認(rèn)導(dǎo)入的形式。對(duì)于這個(gè)問題,我們需要把tsconfig.json配置項(xiàng)“allowSyntheticDefaultImports”設(shè)置為true。允許從沒有設(shè)置默認(rèn)導(dǎo)出的模塊中默認(rèn)導(dǎo)入。不過不必?fù)?dān)心會(huì)對(duì)代碼產(chǎn)生什么影響,這個(gè)僅僅為了類型檢查。 

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

當(dāng)然你也可以使用“esModuleInterop”這個(gè)配置項(xiàng),將其設(shè)置為true,根據(jù)“allowSyntheticDefaultImports”的默認(rèn)值,如下: 

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

對(duì)于“esModuleInterop”這個(gè)配置項(xiàng)的作用主要有兩點(diǎn):

  • 提供__importStar和__importDefault兩個(gè)helper來兼容babel生態(tài)
  • 開啟allowSyntheticDefaultImports

對(duì)于“esModuleInterop”和“allowSyntheticDefaultImports”選用上,如果需要typescript結(jié)合babel,毫無疑問選“esModuleInterop”,否則的話,個(gè)人習(xí)慣選用“allowSyntheticDefaultImports”,比較喜歡需要啥用啥。當(dāng)然“esModuleInterop”是最保險(xiǎn)的選項(xiàng),如果對(duì)此拿捏不準(zhǔn)的話,那就乖乖地用“esModuleInterop”。

無法識(shí)別document和window這種全局對(duì)象

遇到這種情況,需要我們?cè)趖sconfig.json中l(wèi)ib這個(gè)配置項(xiàng)加入一個(gè)dom庫,如下: 

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

文件中的標(biāo)紅問題

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

***種:.ts文件

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

第二種:.tsx文件

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

無狀態(tài)組件

對(duì)于無狀態(tài)組件,首先得限制他是一個(gè)FunctionComponent(函數(shù)組件),其次限制其props類型。舉個(gè)🌰: 

  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這個(gè)名字比較長(zhǎng),你可以選擇用類型別名“SFC”或者“FC”。 

有狀態(tài)組件

對(duì)于有狀態(tài)組件,主要注意三點(diǎn):

  1. props和state都要做類型限制
  2. state用readonly限制“this.state=**”的操作
  3. 對(duì)event對(duì)象做類型限制 
  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}>點(diǎn)擊我</div>  
  31.     }  
  32.  

實(shí)際項(xiàng)目里,組件的state可能會(huì)有很多值,如果按照我們上面這種方式去寫會(huì)比較麻煩,所以可以考慮一下下面這個(gè)簡(jiǎn)便寫法: 

  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}>點(diǎn)擊我</div>  
  20.     }  
  21.  

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

Ant Design丟失樣式文件

當(dāng)我們把項(xiàng)目啟動(dòng)起來之后,某些同學(xué)的頁面可能會(huì)出現(xiàn)樣式丟失的情況,如下:

打開控制臺(tái),我們發(fā)現(xiàn)Ant Design的類名都找不到對(duì)應(yīng)的樣式:

出現(xiàn)這種情況是因?yàn)槲覀儼裝abel刪除之后,用來按需加載組件樣式文件的babel插件babel-plugin-import也隨著丟失了。不過typescript社區(qū)有一個(gè)babel-plugin-import的Typescript版本,叫做“ts-import-plugin”,我們先來安裝一下: 

  1. yarn add ts-import-plugin -D 

這個(gè)插件需要結(jié)合ts-loader使用,所以webpack配置中需要做如下調(diào)整: 

  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這個(gè)配置,這是個(gè)可選配置,我建議是只有大項(xiàng)目中才加這個(gè)配置,小項(xiàng)目就沒有必要了。由于typescript的語義檢查器會(huì)在每次編譯的時(shí)候檢查所有文件,因此當(dāng)項(xiàng)目很大的時(shí)候,編譯時(shí)間會(huì)很長(zhǎng)。解決這個(gè)問題的最簡(jiǎn)單的方法就是用transpileOnly: true這個(gè)配置去關(guān)閉typescript的語義檢查,但是這樣做的代價(jià)就是失去了類型檢查以及聲明文件的導(dǎo)出,所以除非在大項(xiàng)目中為了提升編譯效率,否則不建議加這個(gè)配置。

配置完成之后,你的瀏覽器控制臺(tái)可能會(huì)報(bào)出類似下面這個(gè)錯(cuò)誤:

出現(xiàn)這個(gè)原因是因?yàn)槟愕膖ypescript配置文件tsconfig.json中的module參數(shù)設(shè)置不對(duì),兩種情況會(huì)導(dǎo)致這個(gè)問題:

  • module設(shè)置成了“commonjs”
  • target設(shè)置"ES5"但是并未設(shè)置module(當(dāng)target不為“ES6”時(shí),module默認(rèn)為“commonjs”)

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

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

可能會(huì)有小伙們說設(shè)置成“ES6”或者“ES2015”也是可以的,至于我為什么選擇“esNext”而不是“ES6”或者“ES2015”,主要原因是設(shè)置成“ES6”或者“ES2015”之后,就不能動(dòng)態(tài)導(dǎo)入了,因?yàn)轫?xiàng)目使用了react-loadable這個(gè)包,要是設(shè)置成“ES6”或者“ES2015”的話,會(huì)報(bào)如下這個(gè)錯(cuò)誤:

typescript提示我們需要設(shè)置成“commonjs”或者“ESNext”才可動(dòng)態(tài)導(dǎo)入,所以保險(xiǎn)起見,我是建議大家設(shè)置成ESNext。完成之后我們的頁面就可以正常顯示了。

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

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

當(dāng)我們module設(shè)置為“ES6”時(shí),此時(shí)moduleResolution默認(rèn)是“Classic”,而我們需要的是“Node”。為什么要選擇“node”,主要是因?yàn)閚ode的模塊解析規(guī)則更符合我們要求,解析速度會(huì)更快,至于詳情的介紹,可以參考Typescript的文檔。

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

同樣為了保險(xiǎn)起見,我是建議大家強(qiáng)行將moduleResolution設(shè)置為“node”。

總結(jié)

以上就是我自己在遷移過程中遇到的問題,可能無法覆蓋大家在遷移過程中所遇到的問題,如果出現(xiàn)我上面沒有涉及的報(bào)錯(cuò),歡迎大家在評(píng)論區(qū)告訴我,我會(huì)盡可能地完善這篇文章。***再強(qiáng)調(diào)一下,本篇文章僅僅只是介紹了我個(gè)人在遷移至typescript的經(jīng)驗(yàn)總結(jié),并未完全覆蓋tsconfig.json的所有配置項(xiàng),文章未涉及到的配置項(xiàng),還需大家多花點(diǎn)時(shí)間看看typescript的文檔。***附上我已遷移到typescript的項(xiàng)目的地址:

項(xiàng)目地址: https://github.com/ruichengpi...

 

 

責(zé)任編輯:龐桂玉 來源: segmentfault
相關(guān)推薦

2010-09-28 13:16:43

JavaScriptDOM

2009-12-18 18:29:43

Linux Fedor

2010-06-07 15:48:40

Hadoop0.20.

2009-10-15 09:27:00

2013-01-18 10:10:30

項(xiàng)目項(xiàng)目經(jīng)理

2011-07-21 13:40:17

java

2009-09-16 17:13:54

學(xué)習(xí)Linq

2009-09-29 16:32:11

OJB Hiberna

2009-08-19 09:24:43

AJAX引擎經(jīng)驗(yàn)總結(jié)

2010-03-23 11:39:49

云計(jì)算

2010-03-25 13:42:14

云計(jì)算

2010-04-21 14:53:46

Oracle游標(biāo)

2010-05-19 17:24:55

MySQL編碼

2011-07-08 13:15:52

JSP

2009-08-20 17:35:47

Servlet和JSP

2009-10-22 15:07:12

綜合布線工程

2009-09-08 10:57:55

LINQ查詢操作

2009-09-16 17:44:54

LINQ to SQL

2009-09-11 13:29:31

LINQ查詢操作

2009-11-17 11:24:00

PHP應(yīng)用技巧
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久综合九色综合欧美就去吻| 国模一区二区三区| 欧美乱妇一区二区三区不卡视频| 黄色一级视频播放| 凸凹人妻人人澡人人添| 轻轻草成人在线| 欧美国产日韩精品| 成人国产精品久久久网站| 青青久久精品| 欧美日韩精品国产| 亚洲国产精品影视| 免费在线高清av| 国产精品99久久久久久久女警 | 久久琪琪电影院| 亚洲国产综合视频| 亚洲青青久久| 日本韩国欧美一区二区三区| 精品一区二区三区毛片| 久久国产精品高清一区二区三区| 国产一区视频导航| 国产精品欧美久久久| 国产成人精品片| 欧美国产三区| 日韩综合视频在线观看| 黄色工厂在线观看| 成人免费直播在线| 欧美一区二区视频在线观看2022| 男女av免费观看| 波多野一区二区| 亚洲国产日韩av| 中文字幕一区二区三区精彩视频 | 欧美精品中文字幕一区| 日本一区二区视频在线播放| 国产厕拍一区| 日韩欧美一区二区三区在线| 亚洲精品永久视频| 丰满少妇一区| 欧美丝袜自拍制服另类| 色综久久综合桃花网| 快播亚洲色图| 人人妻人人澡人人爽久久av| 国产精品资源站在线| 国产欧美精品日韩| 中文字幕 国产精品| 国产日韩亚洲| 26uuu另类亚洲欧美日本老年| 久久高清内射无套| 68国产成人综合久久精品| 在线视频一区二区| 人人妻人人澡人人爽| 久久精品国产亚洲blacked| 日韩一区二区在线免费观看| 国产女同无遮挡互慰高潮91| 精品九九久久| 欧美二区三区91| 波多野结衣网页| 成人综合日日夜夜| 制服丝袜国产精品| 特种兵之深入敌后| 亚洲啊v在线免费视频| 精品国产乱码久久久久久久| 特级特黄刘亦菲aaa级| jizz性欧美23| 日韩高清免费在线| 午夜理伦三级做爰电影| 国产一区2区| 日韩在线欧美在线| 日韩成人短视频| 91精品国产自产拍在线观看蜜| 久久久精品电影| 免费又黄又爽又色的视频| 亚洲视频日本| 日韩av免费在线| 最新黄色网址在线观看| 久久99精品久久久久| 成人疯狂猛交xxx| www久久久com| 久久新电视剧免费观看| 你懂的视频在线一区二区| 99青草视频在线播放视| 亚洲免费资源在线播放| 国产av麻豆mag剧集| 天天综合网站| 日韩一级大片在线| 性久久久久久久久久| 成人在线免费观看视频| 久久91精品国产91久久久| 国产成人愉拍精品久久 | 亚洲精品菠萝久久久久久久| 成年人网站国产| 欧美日韩123区| 69av一区二区三区| 亚洲国产精品无码久久久久高潮| 不卡在线一区| 欧美激情伊人电影| 中文字幕一区2区3区| 国产成人免费在线观看| 日韩不卡av| 美女尤物在线视频| 欧美在线观看你懂的| 欧洲美女亚洲激情| 自拍欧美一区| 欧美极品少妇与黑人| 最近中文字幕在线观看视频| 成人免费的视频| 亚洲欧美综合一区| 久草在线资源福利站| 欧美精品免费视频| 亚洲一区二区三区蜜桃| 午夜日韩视频| 国产精品一区二区三区毛片淫片| 亚洲男人天堂久久| 中文字幕亚洲区| aaaaaa亚洲| av日韩在线播放| yellow中文字幕久久| 欧美一区二区三区网站| 国产成人av福利| 亚洲一区三区| 精品3atv在线视频| 日韩电影中文字幕| 五月婷婷综合激情网| 欧美日韩影院| 91色在线观看| 欧美成人三区| 欧美熟乱第一页| 亚洲专区区免费| 99riav1国产精品视频| 亚洲永久免费观看| 麻豆影视国产在线观看| 欧美最猛性xxxxx直播| a毛片毛片av永久免费| 在线观看日韩av电影| 444亚洲人体| 在线中文字幕-区二区三区四区| 欧美日韩一区二区三区四区五区 | 2019中文字幕在线| 色香蕉在线视频| 亚洲第一精品在线| 老司机午夜免费福利| 欧美xxx在线观看| 91情侣偷在线精品国产| 麻豆网站视频在线观看| 欧美高清激情brazzers| 91禁男男在线观看| 九九国产精品视频| 中文字幕一区二区三区精彩视频| 日本免费成人| 久久精品中文字幕一区| 99久久久国产精品无码网爆| 亚洲三级小视频| 国产精品欧美性爱| 在线免费观看欧美| 麻豆精品传媒视频| 国模冰冰炮一区二区| 亚洲夜晚福利在线观看| 无码人妻熟妇av又粗又大| 久久久www成人免费毛片麻豆 | 国产一区二区成人久久免费影院| 亚洲第一精品区| 涩爱av色老久久精品偷偷鲁| 欧美精品成人91久久久久久久| 天堂中文网在线| 日韩欧美国产视频| 欧美激情视频二区| 国产一区二区91| www.av毛片| 中文字幕亚洲影视| 国产日韩视频在线观看| 色婷婷视频在线观看| 亚洲福利视频网| 免费看毛片网站| √…a在线天堂一区| 韩国三级丰满少妇高潮| 最新亚洲激情| 亚洲电影网站| 97se亚洲国产一区二区三区| 欧美亚洲日本网站| 免费在线观看黄| 亚洲精品在线免费观看视频| 伦av综合一区| 亚洲日本一区二区三区| xxxx黄色片| 美女高潮久久久| 91成人综合网| 不卡一区2区| 国产精品一 二 三| 成人国产激情在线| 韩国日本不卡在线| 午夜老司机在线观看| 亚洲国产成人精品女人久久久| 国产午夜无码视频在线观看 | 成人av在线资源网站| 人人干人人视频| 亚洲视频福利| 一本一道久久久a久久久精品91| 欧美特黄不卡| 国产精品一区二区三区在线播放 | japanese中文字幕| 国产成人8x视频一区二区| 99久久久无码国产精品6| 久久久久久久久久久久久久| 久久影院理伦片| 日韩高清一区| 国产精品热视频| 欧美亚洲日本精品| 欧美日韩国产成人在线| 第三区美女视频在线| 亚洲国产精品99| 99这里有精品视频| 欧美日韩午夜在线| av图片在线观看| 亚洲超碰精品一区二区| 国产色无码精品视频国产| 久久精品亚洲国产奇米99| 国产一级免费片| 国产呦萝稀缺另类资源| 美女一区二区三区视频| 国产精品日韩| 国产xxxx振车| 欧美福利影院| 男女激烈动态图| 欧美高清视频手机在在线| 欧美一区二区三区精美影视 | 97久久国产亚洲精品超碰热| 日韩精品看片| 手机在线观看国产精品| 国产日产精品一区二区三区四区的观看方式| caoporn国产精品免费公开| 偷拍自拍亚洲| 91精品久久久久久久| 99久久伊人| 国产欧美亚洲视频| 久久电影天堂| 国产欧美日韩视频| 欧美视频精品| 成人国产精品免费视频| 高清亚洲高清| 国产精品中文久久久久久久| 青青热久免费精品视频在线18| 国产69久久精品成人| 欧美xxxhd| 日本一区二区在线播放| 日韩电影免费观看高清完整版| 久久久久久国产三级电影| 欧美14一18处毛片| 久久久久久av| 国产夫妻在线播放| 日本一区二区在线播放| 日韩久久一区二区三区| 国产精品旅馆在线| 欧美videos粗暴| 91在线视频一区| 综合伊人久久| 久久国产精品一区二区三区| 亚洲日产av中文字幕| 品久久久久久久久久96高清| 精品国产视频| 中文字幕一区二区三区在线乱码| 久久日文中文字幕乱码| mm131午夜| 亚洲国产婷婷| 女性隐私黄www网站视频| 男女男精品网站| 一级做a爱视频| 成人国产免费视频| 国产黄片一区二区三区| 国产精品久久久久影院老司| 欧美日韩黄色网| 亚洲第一激情av| 在线观看日本网站| 6080亚洲精品一区二区| 成人午夜福利视频| 亚洲欧美三级在线| 国内精品久久久久国产| 欧美黄色免费网站| 亚洲wwww| 亚洲自拍小视频免费观看| 久久a爱视频| 亚洲精品8mav| 亚洲精品字幕| 最近中文字幕一区二区| 成人激情小说乱人伦| 扒开jk护士狂揉免费| 亚洲女子a中天字幕| 97久久久久久久| 欧美精品 国产精品| www.五月激情| 一区二区三欧美| 国产三级伦理在线| 国产成人在线亚洲欧美| 亚洲一区 二区| 欧美一区二区视频在线| 国产一区美女| 182午夜在线观看| 97久久久精品综合88久久| 青青操在线播放| 婷婷一区二区三区| 国产婷婷在线视频| 亚洲欧洲成视频免费观看| 天堂av资源在线观看| 国产精品久久一| 老司机凹凸av亚洲导航| 自拍偷拍亚洲色图欧美| 亚洲欧美日本视频在线观看| 夜夜爽久久精品91| 国产欧美一区二区精品忘忧草| 久久久香蕉视频| 777亚洲妇女| 成人福利在线| 欧洲中文字幕国产精品| 亚洲网址在线观看| 日本丰满大乳奶| 麻豆一区二区三| 美女被到爽高潮视频| 亚洲成av人在线观看| 国产理论视频在线观看| 国产午夜精品视频免费不卡69堂| 黄色的视频在线观看| 91热精品视频| 91精品国产麻豆国产在线观看 | 好色先生视频污| 男人的天堂久久精品| 丰腴饱满的极品熟妇| 亚洲va欧美va人人爽| www.国产视频| 久久综合久中文字幕青草| 成人黄色图片网站| 视频一区二区在线| 久久男女视频| 亚洲激情视频小说| 欧美午夜视频在线观看| 婷婷色在线视频| 国内精品小视频在线观看| 澳门精品久久国产| 日韩视频 中文字幕| 国产九色精品成人porny| 一区二区三区影视| 4438成人网| 成人黄视频在线观看| 成人信息集中地欧美| 伊人久久大香线蕉精品组织观看| 激情文学亚洲色图| 亚洲精品欧美在线| 精品毛片一区二区三区| 久久91精品国产91久久久| 一区二区三区在线免费看| 日韩亚洲欧美一区二区| 国产成人亚洲综合色影视| 欧美精品一区二区成人| 日韩女优av电影| 国产天堂在线播放视频| 精品无人区一区二区三区| 国产视频一区在线观看一区免费| 国产麻豆xxxvideo实拍| 欧美日韩一区二区三区在线免费观看| 手机亚洲第一页| 国产成人精彩在线视频九色| 欧美日韩第一| 久久精品国产99久久99久久久| 亚洲色图第一区| 好吊色在线观看| 日韩av手机在线看| 色乱码一区二区三区网站| 天天操夜夜操很很操| 亚洲成人精品一区| 男人天堂网在线观看| 国产精品一区二区3区| 国产精品久久天天影视| 丰满少妇xbxb毛片日本| 色偷偷久久一区二区三区| 午夜伦全在线观看| 97人人模人人爽人人喊38tv| 99精品国产在热久久婷婷| 精品成人无码一区二区三区| 91精品国产美女浴室洗澡无遮挡| 免费男女羞羞的视频网站在线观看| 精品一区在线播放| 蜜臀av性久久久久蜜臀aⅴ四虎| 加勒比婷婷色综合久久| 日韩精品中文字幕有码专区| 69堂精品视频在线播放| 三级在线免费观看| 91农村精品一区二区在线| 91亚洲国产成人精品一区| 欧美高清在线视频观看不卡| 亚洲男人都懂第一日本| 在线免费黄色网| 欧美日韩国产在线看| 免费在线午夜视频| 美脚丝袜一区二区三区在线观看| 麻豆视频一区二区| 五月婷婷亚洲综合| 欧美成人午夜激情视频| 视频精品在线观看| 久久性爱视频网站| 91精品国产综合久久久蜜臀粉嫩| 色偷偷偷在线视频播放| 男人的天堂视频在线| 99久久精品国产导航|