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

ESLint 在中大型團隊的應用實踐

開發 開發工具
ESLint對工程代碼進行靜態檢查,發現和修復不符合規范的代碼。ESLint,它是一款插件化的 JavaScript 代碼靜態檢查工具,其核心是通過對代碼解析得到的 AST(Abstract Syntax Tree,抽象語法樹)進行模式匹配,定位不符合約定規范的代碼。

使用背景

代碼規范是軟件開發領域經久不衰的話題,幾乎所有工程師在開發過程中都會遇到,并或多或少會思考過這一問題。隨著前端應用的大型化和復雜化,越來越多的前端工程師和團隊開始重視 JavaScript 代碼規范。

主要解決的問題:

對于獨立開發者,或者執行力較強、技術場景較為單一的小型團隊而言,直接使用 ESLint 及其生態提供的一些標準方案,可以用較低成本來實現 JavaScript 代碼規范的落地。如果再搭配一些輔助工具(例如 husky 和 lint-staged),整個流程會更加順暢。

ESLint對工程代碼進行靜態檢查,發現和修復不符合規范的代碼。如果想降低配置成本,也可以直接使用開源配置方案,例如 eslint-config-airbnb 或 eslint-config-standard。

一、理解代碼檢查

代碼檢查,顧名思義就是檢查代碼,發生于開發階段,可有效幫助開發者減少 JavaScript 粗心代碼,如語法錯誤、變量未定義、變量未使用等等問題。除此之外,代碼檢查還可以約束統一開發人員的代碼風格,利于團隊協作。

我們再從三個方面來展開分析,加深對代碼檢查的實踐理解。

這三個方面分別為以下三點:

1)代碼檢查的功能

2)代碼檢查的類型

3)代碼檢查的工具

1、代碼檢查的功能

代碼檢查這個切面大概可以幫助我們做以下三件事情:

  • 語言語法檢查:比如檢查出字符串引號或者函數調用括號沒有匹配等問題。
  • 編碼錯誤檢查:比如檢查出開發者在使用一個不存在的變量或者變量定義了卻沒有使用等問題。
  • 代碼風格檢查:比如檢查出開發者沒有使用分號(與所選風格有關)等問題。

2、代碼檢查的方式

以代碼檢查發生的不同時間和場景來劃分,我把代碼檢查的方式分類成以下四種:

  • 編碼時檢查:編寫代碼時檢查,通常表現為由 IDE 自動實時檢查并進行代碼提示。
  • 編碼后檢查:編寫代碼后檢查,通常表現為手動調用檢查腳本 / 工具進行代碼的檢查或者代碼保存后由 IDE 自動檢查當前文件。
  • 構建前檢查:構建執行前檢查,通常表現為將代碼檢查作為構建任務的一個前置切面,構建時自動觸發代碼檢查。
  • 提交前檢查:git commit 前檢查,通常表現為將代碼檢查作為 git commit 的一個 hooks 任務,代碼提交前自動觸發代碼檢查。

理解代碼檢查的方式很重要,這直接反映對代碼檢查這個概念本身的掌握程度。

3、代碼檢查工具

代碼檢查的實現通常不會僅僅是字符串分析處理,這其中會大量涉及到語法分析。既然涉及到語法,那么就需要對不同的代碼使用不同的代碼檢查工具,通常來說,我們會使用 Eslint 工具來實現對 JavaScript 和 Typescript 代碼的檢查,使用 stylelint 工具對樣式代碼進行代碼檢查。

二、ESLint 特性簡介

目前較為通用的方案——ESLint,它是一款插件化的 JavaScript 代碼靜態檢查工具,其核心是通過對代碼解析得到的 AST(Abstract Syntax Tree,抽象語法樹)進行模式匹配,定位不符合約定規范的代碼。

1、插件化

下圖簡單地描述了 ESLint 的工作過程:

ESLint 的能力更像一個引擎,通過提供的基礎檢測能力和模式約束,推動代碼檢測流程的運轉。原始代碼經過解析器的解析,在管道中逐一經過所有規則的檢查,最終檢測出所有不符合規范的代碼,并輸出為報告。借助插件化的設計,不但可以對所有的規則進行獨立的控制,還可以定制和引入新的規則。ESLint 本身并未和解析器強綁定,我們可以使用不同的解析器進行原始代碼解析,例如可以使用 babel-eslint 支持更新版本、不同階段的 ES 語法,支持 JSX 等特殊語法,甚至可以借助 @typescript-eslint/parser 支持 TypeScript 語言的檢查。

2、配置能力全面、可層疊、可共享

ESLint 提供了全面、靈活的配置能力,可以對解析器、規則、環境、全局變量等進行配置;可以快速引入另一份配置,和當前配置層疊組合為新的配置;還可以將配置好的規則集發布為 npm 包,在工程內快速應用。

3、社區生態較為成熟

開源社區中基于 ESLint 的項目非常多,既有針對各種場景、框架的插件,也有各種 ESLint 規則配置方案,基本可以涵蓋前端開發的所有場景。

4、規范配置方案設計

基于 ESLint 的插件化、可層疊配置特性,以及面向各種場景、框架的開源方案,如下圖所示的 ESLint 配置架構:

「美團技術團隊」

該配置架構采用了分層、分類的結構,其中:

  • 基礎層:制定統一的基礎語法和格式規范,提供通用的代碼風格和語法規則配置,例如縮進、尾逗號等等。
  • 框架支撐層(可選):提供對通用的一些技術場景、框架的支持,包括 Node.js、React、Vue、React Native 等;這一層借助開源社區的各種插件進行配置,并對各種框架的規則都進行了一定的調整。
  • TypeScript 層(可選):這一層借助typescript-eslint,提供對 TypeScript 的支持。
  • 適配層(可選):提供對特殊場景的定制化支持,例如 MRN(美團內部的 React Native 定制化方案)、配合 prettier 使用、或者某些團隊的特殊規則訴求。

*具體各個規則如何配置可以查看:https://eslint.org/docs/rules

三、為項目接入 Eslint 實現代碼檢查

Eslint 是一款插件(檢查規則)化的 JavaScript 代碼檢查工具。概念言簡意賅,需要注意的是,概念中說到 eslint 是一個插件化的檢查工具,其意思是指 eslint 的設計是把檢查工具和檢查規則之間解耦了。也就是說,在安裝好 eslint 的開發依賴之后,我們還可以并且需要選擇安裝一個我們中意的檢查規則。

1、安裝檢查工具 eslint

npm install eslint --save-dev

2、安裝并配置檢查規則

在探討配置安裝檢查規則之前,我們有必要先明確一下我們的檢查目標是什么。我認為,檢查目標自然是構建前的代碼,并且是自己 / 自己團隊編寫的代碼(非第三方模塊)。畢竟檢查的最終目標是為修復服務的,我們只負責修復自己 / 自己團隊編寫的代碼,構建后代碼以及第三方代碼即使檢查不通過我們也不會也不應該由我們去修復。

檢查規則在項目中通常有兩種表現形式,即:

  • 配置文件中配置的規則:主要形式,通過繼承和擴展的方式聲明了大量規則;
  • 項目代碼中的魔法注釋:次要形式,通常是用于作為配置文件中規則的特例;

生成 eslint 配置文件:

對于配置文件,我們通常會使用 npx eslint --init 生成一個 ESLint 配置文件 .eslintc.js,如下示例:

module.exports = {
root: true,
env: {
browser: true,
es2021: true
},
extends: [
'eslint:recommended',
'plugin:vue/essential',
'standard'
],
parser: require.resolve('vue-eslint-parser'),
parserOptions: {
ecmaVersion: 12,
sourceType: 'module'
},
plugins: [
'vue'
],
rules: {
indent: ['off', 2]
}
}

代碼中的魔法注釋寫法:

除了配置文件中配置規則,eslint 還有一個代碼中通過魔法注釋打規則補丁的辦法,如下示例:

// 屏蔽整行的代碼檢查
const str1 = "${name} is a coder" // eslint-disable-line
// 屏蔽某一個規則:如此行的no-template-curly-in-string規則
const str1 = "${name} is a coder" // eslint-disable-line no-template-curly-in-string

*擴展:ESLint 禁用檢查

1.禁用代碼塊

/* eslint-disable */
consle.log("foo");
consle.log("bar");
/* eslint-disable */

2.禁用單行(放在該行代碼后面)

consle.log("foo"); // eslint-disable-line

3.禁用下一行

// eslint-disable-next-line
console.log("foo")

4.禁用文件(放在代碼最頂部)

/* eslint-disable */
consle.log("foo");
consle.log("bar");

四、Eslint 編碼后檢查 JS 代碼

對于一個工作流程的解釋,我還是更傾向于直接演示一個簡單的 demo。根據代碼檢查的邏輯,demo 演示和講解時我會遵循以下思路,即:

  • 目標問題代碼
  • 代碼檢查規則配置
  • 代碼檢查操作和結果
  • 修復代碼操作

1、目標問題代碼

/* eslint-disable */
const noUsedVar = 1;
function fn() {
console.log('hello')

cnsole.log('eslint');
}
fn(
fn2();

以上短短幾行代碼就可以表示出 eslit 代碼檢查的三個部分,它們分別是:

  • 語法錯誤
  • 編碼錯誤:未定義、未使用
  • 編碼風格:沒有分號

2、代碼檢查規則配置

通過 eslint --init,根據項目特征來回答問題之后得到的 eslint 配置文件如下:

/* eslint-disable */
module.exports = {
env: {
browser: true,
es6: true,
},
extends: [
'airbnb-base',
],
globals: {
Atomics: 'readonly',
SharedArrayBuffer: 'readonly',
},
parserOptions: {
ecmaVersion: 2018,
},
rules: {
},
};

3、代碼檢查操作和結果

第一輪檢查結果先是報了語法錯誤,在修復語法錯誤之后,第二輪檢查報錯了很多編碼以及風格上的錯誤。將兩次檢查結果關聯到問題代碼可以得到如下分析:

const noUsedVar = 1; // find program:'noUsedVar' is assigned a value but never used

function fn() {
console.log('hello') // enforce code style:Missing semicolon(分號)

cnsole.log('eslint'); // find program:'cnsole' is not defined
}
fn( // syntax error
fn2(); // find program:'fn2' is not defined

4、修復代碼

根據上述檢查結果進行修復。對于代碼風格上的不一致導致的錯誤,通過參數 --fix 即可以自動修復大部分的問題。而對于語法以及編碼上的錯誤則大部分只能是開發者自己手動修復。經過手動修復以及自動修復之后,問題代碼可能變為如下模樣:

*執行代碼:npx eslint --fix 相關地址

import { fn2 } from './test2';

function fn() {
console.log('hello');

console.log('eslint');
}

fn();

fn2();

五、Eslint 規則實現git 提交前檢查

探討 Eslint 如何實現 git 的提交前檢查:

  • 實現 hook 任務流:通過 lint-staged 來配合 husky 來實現
  • 實現 git 提交前檢查:先執行 eslint 任務而后執行 git add 任務

下面我們進入第一點,git 提交前檢查原理:Git Hooks 的探討。

1、實現 hook 任務流:通過 lint-staged 來配合 husky 來實現

實現步驟如下:

  • 安裝 husky 和 lint-staged 模塊
  • 配置 husky 的 hook 任務流:如下 package.json 任務
  • 觸發任務流:git add -> git commit

1) 安裝 husky 和 lint-staged 模塊

yarn add husky --dev
yarn add lint-staged --dev

2) 配置 husky 的 hook 任務流:如下 package.json 任務

"scripts": {
"precommit": "lint-staged"
},
"husky": {
"hooks": {
"pre-commit": "yarn precommit"
}
},
"lint-staged": {
"*.js":[
"eslint --fix",
"git add"
]
}

3) 觸發任務流:git add -> git commit

實踐發現,與單獨的 husky 模塊實現單任務相比而言,使用 lint-staged 之后,git commit 命令只有成功執行(有 add 資源并且有提交信息)才會觸發 lint stage 中的操作,且這些操作只會對 js 文件有效。

2、實現 git 提交前檢查:先執行 eslint 任務而后執行 git add 任務

實現步驟如下:

  • 安裝 husky 和 lint-staged 模塊
  • 配置 husky 的 hook 任務流:如下 package.json 任務
  • 觸發任務流:git add -> git commit

1): 安裝 husky 和 lint-staged 模塊

yarn add husky --dev
yarn add lint-staged --dev

2): 配置 husky 的 hook 任務流:如下 package.json 任務

"scripts": {
"precommit": "lint-staged"
},
"husky": {
"hooks": {
"pre-commit": "yarn precommit"
}
},
"lint-staged": {
"*.js":[
"eslint --fix",
"git add"
]
}

3) 觸發任務流:git add -> git commit

經過這些開發包的下載以及配置,在我們執行 git commit 之后,就會觸發 husky 配置的 pre-commit 的 hook 任務,而這個 hook 任務又把任務交給了 lint-staged 處理,進而通過 lint-staged 實現對 js 文件的代碼檢查以及自動風格修復后(錯誤則會中斷提交)重新 add,而后再執行 commit 任務,保證了代碼在提交前一定經過了代碼檢查。


責任編輯:武曉燕 來源: 前端學苑
相關推薦

2022-05-24 07:36:53

Java 8APIJava

2021-03-18 10:57:34

漏洞企業企業安全治理

2021-07-31 22:37:45

DevOps 模型云廠商

2021-09-01 09:48:19

Docker商業模式企業

2017-08-02 16:44:32

架構

2014-03-06 10:18:22

架構技術架構

2014-06-25 18:24:06

百會云CRM

2021-03-23 10:02:02

網絡安全

2015-03-27 11:18:32

天翼混合云vmware

2018-08-30 09:00:00

開源Apache Kafk數據流

2025-11-11 03:00:00

CursorAI開發模式

2016-10-09 15:15:29

網盤

2023-10-31 07:40:15

EslintJSHint

2023-03-31 11:38:01

平臺研發團隊工程

2014-07-22 11:02:48

CRM

2019-07-04 13:05:18

MySQL設計數據庫

2014-06-17 14:01:34

Mysql網站架構

2017-01-15 14:50:34

Spring Batc實踐
點贊
收藏

51CTO技術棧公眾號

www.xxxx精品| 欧美三级中文字幕| 日本高清一区| 国产普通话bbwbbwbbw| 激情欧美日韩| 中文字幕欧美日韩| 国产精品成人99一区无码| 成人自拍av| 玉米视频成人免费看| 蜜桃麻豆www久久国产精品| 国产精品久久久久久久免费看| 在线播放亚洲| www欧美日韩| 在线免费观看成年人视频| 亚洲欧洲日韩精品在线| 欧美日韩中文在线| 激情视频小说图片| 成年人在线看| 99re这里都是精品| 亚洲a在线观看| 波多野结衣毛片| 一区二区激情| 欧美高清在线观看| 久久精品国产亚洲AV成人婷婷| 久久久久观看| 欧美电视剧在线看免费| 在线免费观看av的网站| 亚洲天堂av影院| 亚洲国产美国国产综合一区二区| 亚洲欧洲国产精品久久| 天堂在线免费av| 成人性色生活片免费看爆迷你毛片| 国产精品视频一区国模私拍| 亚洲av中文无码乱人伦在线视色| 精品av久久久久电影| 久久久av一区| 亚洲图片第一页| 国内黄色精品| 亚洲摸下面视频| 成人免费毛片日本片视频| 国产91精品入| 亚洲精品一区二区三区蜜桃下载 | 不卡高清视频专区| 99热国产免费| 99久久婷婷国产一区二区三区| 日韩精品国产精品| 国产成人97精品免费看片| 精品免费囯产一区二区三区| 国产欧美一级| 欧洲精品毛片网站| 亚洲成人第一网站| 美女黄网久久| 国产精品成人av在线| 日本免费在线观看视频| 男人的天堂亚洲| 日韩美女在线观看一区| 黄色av网站免费观看| 久久在线精品| 国产精品亚洲第一区| 亚洲网站在线免费观看| 久草精品在线观看| 91精品国产综合久久久久久丝袜 | av网站一区二区三区| 国产综合av一区二区三区| 少妇高潮久久久| 处破女av一区二区| 久久精品国产美女| 国产福利在线看| 国产精品乱子久久久久| 在线免费观看成人网| av中文字幕在线观看| 亚洲一二三四区不卡| 日本丰满少妇xxxx| 欧美精品总汇| 制服.丝袜.亚洲.另类.中文| 久久久国产精品久久久| 琪琪久久久久日韩精品| 在线播放日韩专区| 日本精品在线免费观看| 激情视频一区二区三区| 日本高清视频一区| 91高潮大合集爽到抽搐| 风流少妇一区二区| 日韩av高清在线播放| 成人片在线看| 欧美香蕉大胸在线视频观看| 欧美wwwwwww| 成人午夜大片| 中文字幕在线精品| 国产午夜精品一区二区理论影院 | av免费观看一区二区| 亚洲人xxxx| 99精品人妻少妇一区二区| 高清亚洲高清| 亚洲国产日韩欧美综合久久| 亚洲精品91在线| 国语精品一区| 国产精品极品在线| 欧洲精品久久一区二区| 亚洲国产高清在线| 欧美无砖专区免费| 激情中国色综合| 亚洲国产日韩欧美在线图片| 日韩av毛片在线观看| 午夜一区不卡| av一本久道久久波多野结衣| www.视频在线.com| 亚洲成av人影院在线观看网| 国产精品视频中文字幕| 偷拍精品福利视频导航| 欧美精品情趣视频| 日韩欧美国产另类| av午夜一区麻豆| 91看片淫黄大片91| 久久av影院| 亚洲欧美日韩另类| 日本一本高清视频| 国产精品一二三四| 亚洲午夜精品一区二区| 成人亚洲欧美| 日韩电影大全免费观看2023年上| 婷婷伊人五月天| 蜜桃av一区二区| 欧美黄色直播| 欧产日产国产精品视频| 欧美成人国产一区二区| 午夜精品一区二区三级视频| 性伦欧美刺激片在线观看| 肥熟一91porny丨九色丨| 国产二区三区在线| 欧美日韩国产a| 天天操天天舔天天射| 噜噜噜躁狠狠躁狠狠精品视频| 成人av片网址| 日本aa在线| 精品少妇一区二区三区在线视频| 小泽玛利亚一区| 久热成人在线视频| 亚洲精品二区| 精品久久在线| xvideos亚洲人网站| 在线观看毛片av| 国产精品久久久久久久久免费丝袜 | 中文字幕在线观看日本| 欧美在线小视频| 久久午夜精品视频| 麻豆一区二区99久久久久| 亚洲一区二区三区精品在线观看| 欧美色网在线| 中文字幕亚洲一区二区三区五十路| 99久久久久久久久| 日本一区二区免费在线观看视频| 中文字幕第80页| 成人影院在线| 成人在线激情视频| 亚洲羞羞网站| 亚洲精品av在线播放| 97免费在线观看视频| 2022国产精品视频| www.色就是色| 艳女tv在线观看国产一区| 亚洲自拍偷拍第一页| 激情av在线| 日韩精品视频在线| 波多野结衣小视频| 最新国产の精品合集bt伙计| 毛片毛片毛片毛片毛| 国产精品成人一区二区网站软件| 国产精品久久国产精品| 校园春色亚洲| 日韩在线观看视频免费| 午夜精品久久久久久久96蜜桃| 亚洲成人自拍偷拍| 少妇人妻好深好紧精品无码| 麻豆成人免费电影| 2022中文字幕| 中文字幕av一区二区三区人| 国产女精品视频网站免费| 日本性爱视频在线观看| 亚洲男人天堂2023| 亚洲一区中文字幕在线| 亚洲综合在线五月| 国产亚洲精品美女久久久| 老女人性淫交视频| 99久久婷婷国产综合精品| 少妇激情一区二区三区| 亚洲精品二区三区| 久久99九九| 成人豆花视频| 欧美怡红院视频一区二区三区| 在线免费观看的av网站| 亚洲成人久久久久| 一区二区视频网| 亚洲成a人片综合在线| 国产精品久久久视频| 国产成人精品一区二区三区网站观看| www国产黄色| 你懂的一区二区| 青娱乐国产91| 成人涩涩网站| 亚洲xxxx3d| 国模一区二区| 国内精品久久久久影院优 | 久久九九国产精品怡红院 | 久久99亚洲热视| 波多野结衣在线网站| 欧美精品一区二区久久久| 一级片在线免费观看视频| 精品久久久久久亚洲国产300| 91 在线视频| 欧美国产精品一区| 熟女人妻在线视频| 国产成人精品网址| 中文字幕国产免费| 日韩高清一区在线| 黄色一级在线视频| 欧美三级不卡| 波多野结衣激情| 欧洲grand老妇人| 麻豆成人小视频| 高潮久久久久久久久久久久久久| 91精品视频播放| 九七影院97影院理论片久久| 欧洲精品在线视频| 免费成人在线电影| 久久久久久久久久久成人| www视频在线看| 日韩在线视频一区| 在线观看av黄网站永久| 亚洲国模精品私拍| 老牛影视av牛牛影视av| 日韩欧美久久久| 国产叼嘿视频在线观看| 欧美久久高跟鞋激| 亚洲无码久久久久| 欧美日本韩国一区| 一级黄色大片网站| 欧美人成免费网站| 91theporn国产在线观看| 欧美视频精品在线观看| 久草视频在线免费| 欧美午夜在线一二页| 波多野结衣高清视频| 91成人免费在线视频| 在线观看 亚洲| 欧美亚一区二区| 亚洲无码久久久久| 7777精品伊人久久久大香线蕉的| 91极品身材尤物theporn| 欧美精品久久99久久在免费线| 一区二区美女视频| 91精品国产手机| 亚洲精品97久久中文字幕无码| 日韩午夜三级在线| 日本韩国免费观看| 日韩高清不卡av| 国产在线一在线二| 在线看国产精品| 免费高清完整在线观看| 久久精品国产成人| 黄色成人在线网| 欧美亚洲在线播放| 成人看片网站| 成人激情视频免费在线| 亚洲精品高潮| 精品国产aⅴ麻豆| 精品成人影院| 久久免费一级片| 亚洲每日在线| 一道本视频在线观看| 国模大尺度一区二区三区| 色哟哟网站在线观看| 99re8在线精品视频免费播放| 加勒比综合在线| 亚洲日本一区二区三区| 好吊操这里只有精品| 欧美综合久久久| www.黄色小说.com| 国产婷婷97碰碰久久人人蜜臀 | 欧美黑白配在线| 亚洲国产一区二区在线| 欧美精品aa| 无罩大乳的熟妇正在播放| 人禽交欧美网站| 麻豆tv在线观看| 久久在线观看免费| 天堂网avav| 日韩欧美主播在线| av中文字幕播放| 亚洲天堂成人在线视频| 新版中文在线官网| 国产成人综合一区二区三区| 欧洲大片精品免费永久看nba| 免费日韩av电影| 欧美1区2区| 美女网站免费观看视频| 懂色中文一区二区在线播放| 在线小视频你懂的| 亚洲综合免费观看高清在线观看| 精品久久久久久久久久久国产字幕| 91精品啪在线观看国产60岁| 男女网站在线观看| 久久成人精品视频| 成人看片网站| 久久国产一区二区| 欧美日韩视频一区二区三区| 欧美成人黄色网址| 26uuu成人网一区二区三区| 国产成人自拍网站| 欧美丝袜第三区| 青青青草原在线| 国产69精品久久久久9| 高清久久精品| 亚洲国产一区在线| 午夜亚洲激情| 亚洲 欧美 日韩在线| 中文字幕一区二区三区蜜月| 人人妻人人爽人人澡人人精品| 精品国产一区二区三区av性色| 日本电影全部在线观看网站视频| 欧美最近摘花xxxx摘花| 国产另类在线| 欧美a级免费视频| 国产精品资源网| 国产在视频线精品视频| 91国内精品野花午夜精品| 天堂中文资源在线观看| 久久久久久一区二区三区| 国产精品中文| 亚洲第一页在线视频| 免费不卡在线视频| 九九九视频在线观看| 色美美综合视频| 黄视频在线观看免费| 欧美综合在线第二页| 亚洲宅男网av| 国产二区视频在线播放| 99视频超级精品| 日韩特黄一级片| 日韩精品福利在线| 性孕妇free特大另类| 精品人伦一区二区三区| 99riav国产精品| 亚洲第九十七页| 日韩欧美亚洲一二三区| 日中文字幕在线| 日韩av免费在线播放| 伊人成综合网伊人222| av无码精品一区二区三区| 国产亚洲一二三区| 中文字幕永久免费视频| 精品国产一区久久久| 国产精品va视频| 国产情侣第一页| 91天堂素人约啪| www.com亚洲| 日韩中文字幕国产| 91久久精品无嫩草影院| 国产一级爱c视频| 国产三级精品三级在线专区| 在线观看日批视频| 美日韩在线视频| 岛国av一区| 不要播放器的av网站| 国产精品久久综合| 99热这里只有精品5| 欧美精品videos另类日本| 亚州综合一区| 黄色永久免费网站| 一区二区三区丝袜| 无码h黄肉3d动漫在线观看| 国产精品96久久久久久又黄又硬| 欧美成人激情| 国产精品亚洲一区二区无码| 五月婷婷色综合| 丁香在线视频| 99porn视频在线| 久久激情视频| 国产性生活大片| 亚洲国产高潮在线观看| 91国内外精品自在线播放| 糖心vlog在线免费观看| 99re热这里只有精品免费视频| 波多野结衣不卡| 精品中文字幕在线2019| 免费国产自久久久久三四区久久| 亚洲综合欧美激情| 亚洲成人精品影院| 日韩大片在线永久免费观看网站| 99在线看视频| 日韩成人伦理电影在线观看| 午夜免费激情视频| 国产亚洲精品美女久久久| 91久久精品无嫩草影院| 中文久久久久久| 亚洲成av人影院| 成年人黄视频在线观看| 玛丽玛丽电影原版免费观看1977| 激情图片小说一区| 精品人妻一区二区三区潮喷在线|