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

DeepKit —— 賦予 TypeScript 更多可能性

開發(fā) 前端
傳統(tǒng)開發(fā)上,Javascript 基本沒有提供任何類型保護(hù),所有的類型錯(cuò)誤都需要在運(yùn)行時(shí)才能發(fā)現(xiàn),而TypeScript 為開發(fā)者提供了一套靜態(tài)類型檢查的方案,它提倡開發(fā)者在源碼中主動(dòng)聲明類型信息,并與對應(yīng)的變量和操作相匹配,并在編譯階段進(jìn)行檢查,類型相關(guān)的錯(cuò)誤在編譯時(shí)就暴露出來,一方面使代碼更規(guī)范了,一方面也極大程度地規(guī)避了許多代碼錯(cuò)誤,提高了代碼的健壯性。

本文為來自飛書 aPaaS Growth 研發(fā) 團(tuán)隊(duì)成員的文章,已授權(quán) ELab 發(fā)布。

aPaaS Growth 團(tuán)隊(duì)專注在用戶可感知的、宏觀的 aPaaS 應(yīng)用的搭建流程,及租戶、應(yīng)用治理等產(chǎn)品路徑,致力于打造 aPaaS 平臺(tái)流暢的 “應(yīng)用交付” 流程和體驗(yàn),完善應(yīng)用構(gòu)建相關(guān)的生態(tài),加強(qiáng)應(yīng)用搭建的便捷性和可靠性,提升應(yīng)用的整體性能,從而助力 aPaaS 的用戶增長,與基礎(chǔ)團(tuán)隊(duì)一起推進(jìn) aPaaS 在企業(yè)內(nèi)外部的落地與提效。

?背景?

之前在技術(shù)需求中曾調(diào)研了基于 TypeScript 的數(shù)據(jù)校驗(yàn)方案,其中調(diào)研了一個(gè)叫 Deepkit 的第三方庫,可以將 TypeScript 的類型信息保留到運(yùn)行時(shí)進(jìn)行消費(fèi)。

圖片

?TypeScript 帶來的?

傳統(tǒng)開發(fā)上,Javascript 基本沒有提供任何類型保護(hù),所有的類型錯(cuò)誤都需要在運(yùn)行時(shí)才能發(fā)現(xiàn),而TypeScript 為開發(fā)者提供了一套靜態(tài)類型檢查的方案,它提倡開發(fā)者在源碼中主動(dòng)聲明類型信息,并與對應(yīng)的變量和操作相匹配,并在編譯階段進(jìn)行檢查,類型相關(guān)的錯(cuò)誤在編譯時(shí)就暴露出來,一方面使代碼更規(guī)范了,一方面也極大程度地規(guī)避了許多代碼錯(cuò)誤,提高了代碼的健壯性。

圖片

TypeScirpt 擁有完備的類型系統(tǒng)。但很可惜,它在這方面的能力在運(yùn)行時(shí)幾乎完全不存在。TypeScript Compiler在編譯源碼時(shí)會(huì)刪除類型信息,不對運(yùn)行時(shí)造成任何開銷。

但其實(shí)在許多場景下,運(yùn)行時(shí)的類型信息都是極具價(jià)值的!

?為什么需要運(yùn)行時(shí)類型?

為什么我們需要運(yùn)行時(shí)的類型信息呢?讓我們看看下面兩個(gè)場景

數(shù)據(jù)校驗(yàn)

數(shù)據(jù)校驗(yàn)并不是局限于傳統(tǒng)前端所關(guān)注的表單校驗(yàn),需要數(shù)據(jù)校驗(yàn)的場景數(shù)不勝數(shù),比如:

在編寫服務(wù)的時(shí)候,若我們需要實(shí)現(xiàn)一個(gè)接口。對于我們來說,傳入的參數(shù)是未知的,我們永遠(yuǎn)不知道業(yè)務(wù)方會(huì)給我傳來什么奇奇怪怪的參數(shù)。如果我們不對參數(shù)進(jìn)行校驗(yàn)的話,后面的代碼邏輯隨時(shí)可能崩潰。而參數(shù)校驗(yàn)自然就需要在運(yùn)行時(shí)消費(fèi)參數(shù)的類型定義信息。

數(shù)據(jù)庫,一張表中所有字段的類型都是有嚴(yán)格定義的,所以在數(shù)據(jù)寫入數(shù)據(jù)庫時(shí),需要校驗(yàn)寫入的數(shù)據(jù)是否符合字段的類型定義,這也需要運(yùn)行時(shí)的類型信息。

序列化與反序列化

序列化是將數(shù)據(jù)類型轉(zhuǎn)換為適合傳輸或存儲(chǔ)的格式的過程。反序列化是撤消此操作的過程,這個(gè)過程需要保證是無損的。對于前端開發(fā)者來說,接觸的最多的應(yīng)該就是 JSON.parse()? 和 JSON.stringify() 這兩個(gè)方法。在簡單場景下,用這兩個(gè)方法做序列化和反序列化可能沒有問題,但是在復(fù)雜場景中就不一定了,因?yàn)檫@兩個(gè)方法并不能保證數(shù)據(jù)是無損的。

例如下面這個(gè)場景

const date = new Date();
const dateString = JSON.stringify(date);//"2022-11-02T17:49:03.240Z"
const dateJson = JSON.parse(dateString);//"2022-11-02T17:49:03.240Z"

對于日期類型的數(shù)據(jù),先用 JSON.stringify(date) 將其序列化成了適合傳輸?shù)母袷剑儆肑SON.parse(dateString) 反序列化,發(fā)現(xiàn)日期這個(gè)類型在過程中已經(jīng)丟失,最后反序列化的結(jié)果為一個(gè)字符串,這顯然是不符合預(yù)期的。因此,在序列化和反序列化的過程中,類型信息也十分重要。

而 DeepKit 使將 TypeScript 類型保留到運(yùn)行時(shí)成為現(xiàn)實(shí)。

?快速開始?

官方文檔站:https://deepkit.io/

前置

使用 DeepKit 需要安裝兩個(gè)包:

  • @deepkit/type:提供運(yùn)行時(shí)可以使用的方法
  • @deepkit/type-compiler:類型編譯器,介入TypeScript 編譯流程,保留類型信息。可以放在package.json? 的devDependencies中,因?yàn)檫@個(gè)類型編譯器只需要編譯階段使用。
npm install --save @deepkit/type
npm install --save-dev @deepkit/type-compiler

然后需要在 tsconfig.json? 中配置 "reflection": true? 。如果需要使用裝飾器,還需要加入"experimentalDecorators": true 參數(shù)

// tsconfig.json
{
"compilerOptions":{
"module":"CommonJS",
"target":"es6",
"moduleResolution":"node",
"experimentalDecorators":true
},
"reflection":true
}

類型信息

DeepKit 定義了兩種用于描述運(yùn)行時(shí)的類型信息的數(shù)據(jù)結(jié)構(gòu),分別是類型對象和反射類。

類型對象

使用 typeOf 方法可以快速獲取某個(gè)類型對應(yīng)的類型對象。

import { typeOf } from '@deepkit/type';
type Title<T> = T extends true ? string : number;

typeOf<Title<true>>();
//Type {kind: 5, typeName: 'Title', typeArguments: [{kind: 7}]}

從上面的例子中,我們可以看到一個(gè)類型對象的基本數(shù)據(jù)結(jié)構(gòu)(當(dāng)然,這還不是它的全貌)。詳細(xì)的類型對象定義:https://github.com/deepkit/deepkit-framework/blob/feature/autotype/packages/type/src/reflection/type.ts#L21-L452

  • kind:ReflectionKind,表示傳入的類型。例子中對應(yīng) Title 的類型
  • typeName:string,如果用到了類型別名,會(huì)返回這個(gè)字段,標(biāo)識(shí)該類型
  • typeArguments:當(dāng)我們用了泛型時(shí),傳遞進(jìn)去的類型信息也會(huì)保留到類型對象中,會(huì)返回typeArguments 字段中記錄的就是對應(yīng)的類型信息。
enum ReflectionKind {
never, //0
any, //1
unknown, //2
void, //3
object, //4
string, //5
number, //6
boolean, //7
symbol, //8
bigint, //9
null, //10
undefined, //11

//... and even more
}

反射類

反射類多用于 類/接口/對象類型等等比較復(fù)雜的場景

import { ReflectionClass } from '@deepkit/type';

interface User {
id: number;
username: string;
}

const reflection = ReflectionClass.from<User>();

reflection.getProperty('id'); //ReflectionProperty,記錄id類型信息

reflection.getProperty('id').name; //'id'
reflection.getProperty('id').type; //{kind: ReflectionKind.number}
reflection.getProperty('id').isOptional(); //false
reflection.removeProperty('id');
reflection.getProperty('id');//Error: No property id found in User

對于復(fù)雜場景,我們可以通過 ReflectionClass.from 方法得到類型對應(yīng)的放射類實(shí)例 ReflectionClass ,通過調(diào)用ReflectionClass中的方法可以獲取更深層次的類型信息,也可以對類型信息做一些操作。

驗(yàn)證

需要數(shù)據(jù)驗(yàn)證的場景數(shù)不勝數(shù),接口參數(shù)校驗(yàn),數(shù)據(jù)庫實(shí)現(xiàn)等都高度依賴數(shù)據(jù)校驗(yàn),以此保證數(shù)據(jù)的安全性。

DeepKit 提供了is和validate兩個(gè)函數(shù),用于校驗(yàn)一個(gè)值是否符合類型定義。

interface People {
name: string
age: number,
info?: {
address?: string,
phone: number
}
}

const peopleA = {
name: 'Jack',
age: 20,
}

const peopleB = {
name: 'Peter',
age: 18,
info: {}
}

is<People>(peopleA)//true
is<People>(peopleB)//false

is 函數(shù)接收類型信息,并對參數(shù)中的數(shù)據(jù)進(jìn)行校驗(yàn),返回一個(gè)布爾值。如上面的例子,定義了一個(gè) People 的 interface,并對 peopleA 和 peopleB 兩個(gè)數(shù)據(jù)進(jìn)行校驗(yàn),可以看出 peopleA 是符合 People 的 定義的,所以返回is<People>(peopleA)?會(huì)返回 true 。peopleB 中的 info 屬性缺少了必填的 phone 字段,因此is<People>(peopleB) 會(huì)返回 false 。

validate<People>(peopleA)//[]

validate<People>(peopleB)
// [{
// path: 'info.phone',
// code: 'type',
// message: 'Not a number'
// }]

validate 函數(shù)和 is 函數(shù)的用法類似,區(qū)別是 validate 函數(shù)并不是返回一個(gè)布爾值 ,而是一個(gè)包含錯(cuò)誤信息的數(shù)組。

path:錯(cuò)誤路徑,指向出錯(cuò)的具體屬性

code:錯(cuò)誤類型,目前好像只有type 一種。

message:具體的錯(cuò)誤信息。

序列化

DeepKit 中 serialize/deserialize 兩個(gè)方法,為用戶提供了序列化/反序列化的能力

import { serialize } from '@deepkit/type';

class MyModel {
id: number = 0;
created: Date = new Date;

constructor(public name: string) {
}
}

const model = new MyModel('Peter');

const jsonObject = serialize<MyModel>(model);
//{
// id: 0,
// created: 2022-11-02T17:49:03.240Z,
// name: 'Peter'
//}

serialize 方法接收類型信息和需要序列化的數(shù)據(jù),將數(shù)據(jù)序列化為符合類型定義的JSON對象。

const myModel = deserialize<MyModel>({
id: 5,
created: 'Sat Oct 13 2018 14:17:35 GMT+0200',
name: 'Peter',
});

is<Date>(myModel.created)// true

deserialize 方法接收類型信息和需要反序列化的數(shù)據(jù),將數(shù)據(jù)反序列化為符合類型信息定義的數(shù)據(jù)。代碼中的 created 字段會(huì)被反序列化為 Date 字段。

類型裝飾器

一句話概括裝飾器:裝飾器本質(zhì)上就是一個(gè)函數(shù),可以在運(yùn)行時(shí)對被裝飾對象進(jìn)行自定義的加工處理。

DeepKit 中提供了一套類型裝飾器,這里的類型裝飾器和 TypeScript 的裝飾器并不相同,TypeScript 多用于對類的裝飾,類型裝飾器顧名思義是對類型的裝飾。這些類型裝飾器可以被當(dāng)作一個(gè)正常的 TypeScript 類型使用。

舉一個(gè)簡單的例子

import { integer } from '@deepkit/type';

// case 1
type count = integer;
is<count>(1) // true
is<count>(1.1) // false

我們對定義 count 類型為 integer(整型),可以看到,1.1這個(gè)浮點(diǎn)數(shù)類型并沒有通過校驗(yàn)。

除此之外,DeepKit 還實(shí)現(xiàn)了如 PrimaryKey(主鍵),maxLength/minLength(最小/最大長度)等功能的類型裝飾器。我們可以把這些類型裝飾器看作對于 TypeScript 類型的拓展,這些類型裝飾器使 TypeScript 能夠?qū)崿F(xiàn)數(shù)據(jù)庫級別的類型定義。也正是基于這套拓展后的運(yùn)行時(shí)類型,驗(yàn)證和序列化可以有更多的約束,DeepKit 也實(shí)現(xiàn)了一套高性能的 ORM 。

?More?

@deepKit/type 給我們提供了一套運(yùn)行時(shí)調(diào)用類型信息的方案。除此之外,DeepKit 的作者還基于類型信息和反射機(jī)制實(shí)現(xiàn)了更多的能力。

  • 事件系統(tǒng):@deepkit/events
  • HTTP 庫:@deepkit/http
  • RPC服務(wù):@deepkit/rpc
  • 數(shù)據(jù)庫ORM:@deepkit/orm
  • 模版引擎:@deepkit/templat ,但與react不兼容
  • 大一統(tǒng)框架:@deepkit/framework ,集成了上述能力的 node 框架

?如何保證性能?

為了盡量壓縮運(yùn)行時(shí)的額外開銷,DeepKit 的作者做出了不少優(yōu)化。

類型緩存

在未使用泛型的情況下,DeepKit 會(huì)對使用到的類型對象進(jìn)行緩存

//  case1
type MyType = string;

typeOf<MyType>() === typeOf<MyType>(); //true

// case2
type MyType<T> = T;

typeOf<MyType<string>>() === typeOf<MyType<string>>();//false

可以看到,對于 case1 ,Mytype 對應(yīng)的類型對象會(huì)被緩存,因此兩次typeOf<MyType>()? 的結(jié)果相等;但是對于泛型來說,我們無法確定傳入的 T 具體是什么類型(理論上會(huì)有無限種),因此不會(huì)結(jié)果進(jìn)行緩存,每次都會(huì)創(chuàng)建一個(gè)新的類型對象。

類型編譯器

圖片

DeepKit 的核心原理是一個(gè)類型編譯器,它會(huì)介入TypeScript 的編譯流程,保留類型信息, 在這個(gè)過程中,Deepkit 的類型編譯器會(huì)讀取源碼中的類型信息,產(chǎn)生相關(guān)的字節(jié)碼(為了使它盡可能小),并將其插入 AST 中,將其轉(zhuǎn)化為另一個(gè)包含這些字節(jié)碼信息的 TypeScript AST。

在運(yùn)行時(shí),DeepKit 會(huì)有一個(gè)迷你虛擬機(jī),負(fù)責(zé)解析和執(zhí)行這些字節(jié)碼,最后會(huì)返回一個(gè)類型對象。

更詳細(xì)的原理可以參考:https://github.com/microsoft/TypeScript/issues/47658

在 DeepKit 官方提供的性能圖中,可以看到 DeepKit 在數(shù)據(jù)讀寫上的表現(xiàn)是比較優(yōu)秀的,這也歸功于 DeepKit 提供的 運(yùn)行時(shí)類型信息,這種預(yù)先知曉類型信息的機(jī)制可以使 序列化/驗(yàn)證等更加快速高效。

圖片

?總結(jié)?

DeepKit 是市場上第一個(gè)在 JavaScript 運(yùn)行時(shí)提供全套 TypeScript 類型的解決方案。它使前端/服務(wù)端可以共用一套TypeScript定義的數(shù)據(jù)模型,并且使用基于 TypeScript 實(shí)現(xiàn)的一套反射機(jī)制。

但它依舊存在一些不足,比如 不支持外部類型,若代碼中使用的類型信息來自第三方,且第三方庫也沒有經(jīng)過 deepkit 的類型編譯器的話,外部類型的類型信息在運(yùn)行時(shí)也會(huì)全部丟失。

官方文檔站:https://deepkit.io/

?一些討論?

在TypeScript的倉庫中,其實(shí)已經(jīng)有許多人提出了issue,對在運(yùn)行時(shí)保留Typescript的類型信息提出了自己的設(shè)想。可以看出,在基于 TypeScript支持動(dòng)態(tài)類型這件事情上,是有需求的,但是 TypeScript 始終是保持保留意見,并沒有實(shí)質(zhì)去支持相關(guān)能力。

圖片

個(gè)人的看法,根本上是和 TypeScript 的設(shè)計(jì)目標(biāo)[1] 掛鉤, TypeScript 官方團(tuán)隊(duì)并不希望 TypeScript 會(huì)對運(yùn)行時(shí)造成額外的開銷,并且希望生成的 JavaScript 盡量純凈。TypeScript 官方團(tuán)隊(duì) 的保守嚴(yán)謹(jǐn)造就了 TypeScript 的成功。可能正因如此,TypeScript 官方團(tuán)隊(duì)才一直對支持運(yùn)行時(shí)類型持保守態(tài)度。

?參考文獻(xiàn)?

https://deepkit.io/ https://github.com/microsoft/TypeScript/issues/47658

責(zé)任編輯:武曉燕 來源: ELab團(tuán)隊(duì)
相關(guān)推薦

2017-07-21 16:40:29

網(wǎng)易云場景專屬云

2019-10-09 17:28:08

程序員人生第一份工作技術(shù)

2021-06-17 11:14:22

云計(jì)算云原生

2024-12-06 08:20:26

2025-07-09 02:10:00

2021-09-29 18:59:42

戴爾

2011-04-20 10:07:15

2018-03-02 11:38:11

2012-06-04 13:28:51

AndroidChrome OS

2016-09-21 09:16:55

Qlik

2011-04-18 13:43:42

2023-10-27 14:25:26

組件庫無限可能性

2021-02-20 12:04:51

比特幣區(qū)塊鏈美元

2020-05-15 13:42:03

物聯(lián)網(wǎng)人工智能軍事物聯(lián)網(wǎng)

2013-03-19 11:13:14

Google廣告SXSW

2019-04-15 10:30:38

程序員技能開發(fā)者

2009-03-11 18:27:04

Windows 7商業(yè)版

2019-04-22 08:57:46

硅谷996ICU
點(diǎn)贊
收藏

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

亚洲日本中文| 求av网址在线观看| 久热国产精品| 久久影院资源网| 亚洲 欧美 日韩在线| 澳门成人av网| 亚洲素人一区二区| 国产在线精品一区二区三区》 | 日韩大尺度视频| 欧美aa视频| 亚洲黄色免费网站| 日韩色妇久久av| 空姐吹箫视频大全| 久久99国产精品麻豆| 97av在线视频免费播放| chinese全程对白| 久久99国产精一区二区三区| 日韩午夜三级在线| 亚欧在线免费观看| heyzo在线播放| 中文字幕视频一区二区三区久| 国产乱码精品一区二区三区卡 | 色综合桃花网| 亚洲人亚洲人成电影网站色| 欧美日韩国产免费一区二区三区 | 97人人做人人爽香蕉精品| 一区二区三区资源| 亚洲第一综合| 欧美一区二区少妇| 成人爱爱电影网址| av色综合网| 国产三级按摩推拿按摩| 可以免费看不卡的av网站| 久久免费精品视频| 黄色一级片中国| 99tv成人| 日韩中文字幕久久| 熟女少妇内射日韩亚洲| 啪啪激情综合网| 亚洲丁香婷深爱综合| 无人码人妻一区二区三区免费| 丁香婷婷久久| 在线看一区二区| 欧美色图色综合| 玖玖在线播放| 五月婷婷综合网| 国产v片免费观看| h片视频在线观看| 亚洲一区av在线| 久久久久久av无码免费网站下载| 黄网址在线观看| 18成人在线观看| 欧美性视频在线播放| 思思99re6国产在线播放| 国产免费久久精品| 日韩久久在线| 2019中文字幕在线视频| 国产精品第一页第二页第三页| 先锋影音日韩| 日韩子在线观看| 亚洲乱码中文字幕综合| 蜜臀av性久久久久蜜臀av| dy888亚洲精品一区二区三区| 中文字幕一区二区三区蜜月| 亚洲精品国产精品国自产| 亚洲s色大片| 亚洲人成亚洲人成在线观看图片| 午夜啪啪福利视频| 污污的视频在线观看| 亚洲成人一区在线| 99精品在线免费视频| 国产高清不卡| 欧美三级在线看| 午夜诱惑痒痒网| 99精品在免费线中文字幕网站一区| 精品欧美一区二区久久| 欧美激情 亚洲| 一区二区导航| 深夜福利亚洲导航| 欧美国产精品一二三| 亚洲日韩成人| 国产精品av免费在线观看| 亚洲图片视频小说| 成人免费观看av| 欧洲精品在线一区| 国产人成网在线播放va免费| 亚洲国产视频a| 国语对白做受xxxxx在线中国| 久久精品国产福利| 精品国产髙清在线看国产毛片| 第四色在线视频| 日韩中文首页| 久久久久久久久久国产| 波多野结衣视频观看| 国产一区二区看久久| 九九九九精品| 黄在线免费看| 色综合久久88色综合天天免费| 中文字幕第一页在线视频| 操欧美女人视频| 中文字幕日韩精品在线观看| 一区二区三区免费高清视频| 日韩av电影天堂| 国产乱码精品一区二区三区日韩精品| 国产福利在线| 五月激情六月综合| 亚洲免费黄色网| 爽爽窝窝午夜精品一区二区| 久久夜精品va视频免费观看| 免费看毛片网站| 丁香婷婷综合网| 亚洲欧美日韩另类精品一区二区三区| 17videosex性欧美| 欧美一区二区三区色| 中文幕无线码中文字蜜桃| 综合久久亚洲| 国产精品美女www爽爽爽视频| 秋霞视频一区二区| 亚洲欧美激情插| 国产精品一区二区羞羞答答| 久久亚洲黄色| 欧美极品第一页| 国产视频手机在线| 国产日产欧美一区二区三区| 大j8黑人w巨大888a片| 国产一区 二区| 色多多国产成人永久免费网站| 色婷婷av国产精品| 成人视屏免费看| 超薄肉色丝袜足j调教99| 国产精品99精品一区二区三区∴| 亚洲女人被黑人巨大进入| 国产中文字幕免费| 国产福利不卡视频| 黄色一级视频播放| 伊人亚洲精品| 久久精品国产99国产精品澳门 | 欧美日韩国产不卡在线看| 91超碰在线播放| 亚洲第一免费网站| 久久久久亚洲av无码专区 | 国产在线一区二区三区| 青青草av免费在线观看| 精品国产乱码久久久久久婷婷 | 亚洲天堂日韩在线| 91av网站在线播放| 五月婷婷丁香六月| 五月天丁香久久| avtt香蕉久久| 免费日韩一区二区| 欧洲一区二区日韩在线视频观看免费 | 免费在线看v| 日本韩国一区二区三区| 欧美黄色一级生活片| 天堂久久一区二区三区| 日本电影一区二区三区| 青青热久免费精品视频在线18| 国产亚洲视频中文字幕视频| 国产精品xxxxxx| 国产精品久久二区二区| 在线黄色免费看| 亚洲精品网址| 国产a一区二区| 免费高潮视频95在线观看网站| 日韩电影中文字幕在线| 国产成人无码一区二区在线播放| 国产日韩欧美在线一区| 亚洲 激情 在线| 综合久久一区| 久久伦理网站| 91亚洲精品| 欧美成人免费va影院高清| 国产综合视频在线| 色哟哟一区二区三区| 男女男精品视频网站| 国产在线视频精品一区| 丝袜人妻一区二区三区| 欧美日韩爱爱| 成人中心免费视频| 波多野结衣精品| 亚洲视频国产视频| 99久久夜色精品国产亚洲| 午夜影视日本亚洲欧洲精品| 在线国产视频一区| 久久精品国产免费| 日本熟妇人妻xxxx| 成人3d精品动漫精品一二三| 亚洲xxx视频| 大胆人体一区| 色综合天天狠天天透天天伊人| 人成免费电影一二三区在线观看| 欧美日韩精品一区视频| 精品视频在线观看免费| 国产欧美日韩在线看| 韩国三级在线看| 日产欧产美韩系列久久99| a天堂资源在线观看| 国产欧美日韩精品高清二区综合区| 91深夜福利视频| 三上悠亚国产精品一区二区三区| xxx一区二区| 欧美日韩国产中文字幕在线| 日韩视频永久免费| 欧美另类高清videos的特点| 亚洲综合清纯丝袜自拍| www.日本高清视频| 97久久精品人人爽人人爽蜜臀| 999在线观看| 噜噜噜91成人网| 日韩一级片免费视频| 99久久夜色精品国产亚洲1000部| 精品久久久久久一区| 精品视频在线观看网站| 国产精品美女无圣光视频| 高潮在线视频| 色综合视频一区中文字幕| 欧美性猛交xxx乱大交3蜜桃| 日韩久久免费电影| 亚洲av永久纯肉无码精品动漫| 欧美丝袜丝交足nylons图片| 一级片中文字幕| 亚洲成人激情综合网| 欧美成人精品激情在线视频| 国产精品入口麻豆九色| 亚洲欧美色图视频| 成人h动漫精品| 午夜免费福利影院| 国产毛片精品一区| 一区二区三区四区毛片| 日本美女一区二区三区视频| 日本三区在线观看| 亚洲在线观看| 欧美 日韩 国产 高清| 国户精品久久久久久久久久久不卡| 一区二区三区我不卡| 日韩成人影院| 亚洲欧洲免费无码| 第一sis亚洲原创| 神马影院午夜我不卡| 欧美日韩国产高清电影| 欧洲av一区| 欧美日韩色图| 午夜精品区一区二区三| 成人精品久久| 一区二区三区偷拍| 亚洲国产精品日韩专区av有中文 | 一区在线视频观看| 日韩欧美猛交xxxxx无码| 欧美精品一级| 99国产精品白浆在线观看免费| 欧美成人一品| 无码人妻精品一区二区蜜桃百度| 欧美成人高清| 久草热视频在线观看| 午夜亚洲一区| 黄色高清无遮挡| 麻豆成人av在线| 91日韩精品视频| 国产福利不卡视频| 呦呦视频在线观看| www国产精品av| av男人的天堂av| 国产精品久久久久永久免费观看 | 亚洲国产专区校园欧美| 黄色一级视频片| 老司机精品视频网站| 午夜激情在线观看视频| 久久99精品久久久久婷婷| 911福利视频| 国产成人aaaa| 亚洲码无人客一区二区三区| 国产精品午夜春色av| 手机在线免费看片| 亚洲一区二区三区小说| 天天综合网久久综合网| 欧美伦理视频网站| 国内精品国产成人国产三级| 亚洲精品二三区| 国产经典自拍视频在线观看| 久久综合电影一区| 蜜桃视频动漫在线播放| 国产精品爽黄69| 国产精品久久久网站| 视频一区二区精品| 精品动漫3d一区二区三区免费版 | 黄色a级片免费看| 免费一级欧美片在线播放| 日韩一区二区三区不卡视频| 国产成人综合自拍| 成人免费毛片糖心| 亚洲日本中文字幕区| 五月婷婷亚洲综合| 欧美一级欧美三级在线观看| 日本国产在线| 欧美成人免费视频| 成人视屏在线观看| 国产精品久久久久久久久婷婷| 免费一区二区| 日韩亚洲欧美视频| 美女久久久精品| 97人妻天天摸天天爽天天| 亚洲欧美视频在线观看| 波多野结衣电车痴汉| 亚洲国内精品视频| 影院在线观看全集免费观看| 国产精品美女久久久久av超清| 欧美电影在线观看免费| 精品国产无码在线| 久久久精品日韩| 青青草视频网站| 一区二区三区产品免费精品久久75| 中文字幕 日韩有码| 日韩精品免费在线视频| 在线视频观看国产| 国产精品午夜国产小视频| 婷婷五月色综合香五月| 六月婷婷激情综合| 国内精品久久久久影院一蜜桃| 精品亚洲aⅴ无码一区二区三区| 五月开心婷婷久久| 国产成人三级在线观看视频| 久久高清视频免费| 日韩一区二区三区四区五区 | 亚洲精品国产首次亮相| 性欧美极品xxxx欧美一区二区| 99re热视频这里只精品| 久久香蕉精品视频| 日韩一级大片在线| 免费在线视频欧美| 国产精品成人久久久久| 亚洲黄页网站| 丰满人妻中伦妇伦精品app| 成人黄色大片在线观看 | 色网站在线看| 国产精品久久久999| 国产成人精品三级高清久久91| 乱妇乱女熟妇熟女网站| 91天堂素人约啪| 日韩不卡视频在线| 亚洲精品国产品国语在线 | 国产精品久久久久影院日本| 国产成人精品三级高清久久91| 黄色a级片免费| 26uuuu精品一区二区| 五月天婷婷激情| 国产亚洲精品美女久久久久 | 97免费资源站| 欧美精品网站| 你懂的在线观看网站| 偷拍与自拍一区| 日韩欧美在线番号| 日韩免费高清在线观看| 国产一区二区三区四区大秀| av免费网站观看| 国产精品福利电影一区二区三区四区| 亚洲一区中文字幕在线| 日韩有码片在线观看| 国产精品1区| 国产片侵犯亲女视频播放| 成人h动漫精品一区二区| 亚洲欧美综合另类| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 91麻豆精品一二三区在线| 青青草综合视频| 成人sese在线| 日本一本在线观看| 中文字幕欧美亚洲| 深夜激情久久| 能在线观看的av| 中文字幕制服丝袜一区二区三区 | 亚洲一区二区色| 欧美成人激情视频免费观看| 风间由美中文字幕在线看视频国产欧美| 色欲色香天天天综合网www| 91麻豆swag| 国产精品毛片一区视频播| 国内免费久久久久久久久久久| 久久99久久人婷婷精品综合| 做a视频在线观看| 亚洲高清不卡在线| 国产精品麻豆一区二区三区| 97se亚洲综合| 久久经典综合| 青青青在线免费观看| 国产视频丨精品|在线观看| 欧美视频在线视频精品| 成人一级生活片| 国产三区在线成人av| 成 人 免费 黄 色| 国产成人精品电影久久久| 亚洲欧美综合| 久久久久久久毛片| 精品久久久久av影院| 日本精品另类| 国产真人做爰毛片视频直播| 国产色产综合色产在线视频| 亚洲经典一区二区| 国产一区二区丝袜高跟鞋图片| 99精品视频免费观看视频| 中文字幕乱码av|